金蝶BOS企业版V6.3.2 - 开发指南 - 管理门户 - Portlet开发 - 图文

更新时间:2023-11-06 12:38:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

EAS

Portlet制作指南门户

说明

本指南主要介绍EAS门户Portlet的制作过程。简要阐述了EAS门户的新特性,详细介绍了制作Portlet的过程和步骤,对制作Portlet过程遇到的常见问题进行了说明。

本指南适用于EAS门户Portlet开发人员。

目录

说明......................................................................................................................... 2 目录......................................................................................................................... 3 第1章 EAS门户简介 ............................................................................................... 4 1.1 EAS门户新特性.................................................................................................... 4 第2章 Portlet制作 .................................................................................................. 5 2.1 Portlet制作步骤 ................................................................................................... 5 2.2 配置Portlet信息 ................................................................................................. 5

2.2.1 配置Portlet定义信息 ................................................................................ 5 2.2.2 配置Portlet业务处理信息 ......................................................................... 6 2.3 向数据库插入相关数据 ....................................................................................... 6 2.4 Portlet配置信息与数据库数据的对应关系 ............................................................ 8 2.5 制作Portlet内容页面,实现业务需求 ................................................................. 9

2.5.1 Portlet内容页面JSP接口 .......................................................................... 10 2.5.2 Portlet内容页面JS接口............................................................................ 13 2.5.3 Portlet内容页面制作规范与约束............................................................... 16 2.5.4 Portlet内容页面制作常见问题 .................................................................. 19 2.5.5 Portlet内容页面HTC控件的替换 .............................................................. 23 2.5.6 门户优化合并且删除了部分js.................................................................. 25 第3章 Portlet业务设置 ......................................................................................... 27 3.1 关联Portlet业务设置页面 ................................................................................. 28 3.2 Portlet业务设置页面JSP接口............................................................................. 29 3.3 Portlet业务设置页面JS接口 .............................................................................. 30 第4章 Portlet的使用 ............................................................................................ 32 第5章 Portlet相关SQL脚本的导出和提交............................................................. 35 5.1 示例SQL ........................................................................................................... 35 5.2 脚本提交位置 ................................................................................................... 36 附录1 Portal配置文件拆分说明 .............................................................................. 38 附录2 PortletUtil API ............................................................................................... 42 附录3 Ajax之Buffalo开发指南 ............................................................................... 54 附录4门户Portlet之间通信................................................................................... 59

第1章 EAS门户简介

1.1 EAS门户新特性

新的EAS门户在上一版本门户的基础上对整体框架进行了优化,实现了相关新特性,包含如下功能:

(1)自定义布局:可自由布局,跨列布局;

(2)页签配置完善:以拖拽方式把Portlet配置到页签上;

(3)展现框架调整:可自由拖拽布局显示,运行期用户可个性化配置界面展示样式;

(4)提供容器Portlet:将多个单一Portlet组合成一个Portlet;

(5)Portlet增加属性设置:支持系统级和业务级属性设置,且同时支持定义期和运行期属性设置;

(6)Portlet异步加载:页签中每个Portlet异步加载,并发运行; (7)通知和待办可分类设置和授权:分类可由管理员统一建立和分配,同时允许用户自定义分类和管理管理员设置的分类。

第2章 Portlet制作

2.1 Portlet制作步骤

Portlet制作过程包含以下几个步骤: (1)配置Portlet信息 (2)向数据库插入相关数据

(3)制作Portlet内容页面,实现业务需求 (4)制作Portlet业务设置页面(可选)

最后一个步骤并不是必须的,在Portlet的业务需求需要业务设置时,才进行此步骤。

下面将分小节详细介绍Portlet制作的各个步骤,关于Portlet业务设置的内容将单独在第3章中介绍。

2.2 配置Portlet信息

2.2.1 配置Portlet定义信息

(1)配置文件路径 EAS5.4版本:

server/profiles/server1/config/portalConfig/portlets.xml

EAS6.0版本:

server/deploy/eas.ear/cp_web.war/WEB-INF/portlets_xxx.xml

其中,xxx表示具体的业务领域名称,如bos、eas等,详细信息请参考“附录1 Portal配置文件拆分说明”

(2)配置说明

1001 testPortlet

view

portlet.test

各配置参数值说明如下:

1001:Portlet定义ID,全局唯一,不能重复。取值范围具体约定如下:BOS为 1-199 ,EAS为 200-999, 二次开发为 1000 以后;

testPortlet:Portlet定义信息,无特别要求,一般使用英文字符标识。注意该标题信息仅用于在配置文件中区分不同的Portlet,与Portlet在运行时显示的标题无关,Portlet在运行时显示的标题信息由数据库中的内容决定,2.3小节有详细说明;

portlet.test:对应于“Portlet业务处理信息”的配置信息,具体见下一小节。

2.2.2 配置Portlet业务处理信息

(1)配置文件路径

server/deploy/eas.ear/cp_web.war/WEB-INF/tiles-defs_xxx.xml

其中,xxx表示具体的业务领域名称,如bos、eas等,详细信息请参考2.2.1节中的附件《Portal配置文件拆分说明.doc》。

(2)配置说明

controllerUrl=\

各配置参数值说明如下:

portlet.test:tiles定义名称,和上一节Portlet定义信息的配置保持一致; 1001:对应的Portlet定义ID,和上一节Portlet定义信息的配置保持一致; /html/custom/test.jsp:业务处理页面(即2.5节将提到的“Portlet内容页面”)地址,如果是Struts,则还需要在struts-config.xml中进行配置,具体可以参考Struts官方文档。

2.3 向数据库插入相关数据

通过EAS管理控制台执行如下脚本,在数据库中插入一条记录,KSQL语句如下:

INSERT INTO

T_Portal_Portlet(FID,FCreatorID,FCreateTime,FLastUpdateUserID,FLastUpdateTime,FControlUnitID,FPortletDefineId,FPortletName_L1,FPortletName_L2,FPortletName_L3,FEnable,FPortletNumber,FDescription_L1,FDescription_L2,FDescription_L3, FPortletCategoryID)

VALUES(NEWBOSID('0B344890'),'00000000-0000-0000-0000-00000000000013B7DE7F',{ts'2009-10-01

12:13:14'},'00000000-0000-0000-0000-00000000000013B7DE7F',{ts'2009-10-01

12:13:14'},'00000000-0000-0000-0000-000000000000CCE7AED4',N'104',NULL,N'周江测试1',N'周江測試1',1,N'PN-104',NULL, N'周江测试1', N'周江測試1', 'XkGI/dDGlkWJhX5ZEW9lOEPH2a4=');

说明与注意事项:

(1)插入字段FID的值请务必使用函数NEWBOSID,其中'0B344890'为Portlet实体元数据编码,该值不能更改为其他值,否则程序获取Portlet信息时将出错。函数NEWBOSID('0B344890')每次执行会产生新的ID值,如果作为脚本提交,请注意修改为一个确定的ID值,且一定要支持可重复升级。

(2)字段FPortletDefineId的值一定要和Portlet定义信息配置文件(2.2.1节)中定义的值保持一致。

(3)繁体字段一定要使用繁体文字,否则和语言不匹配。

(4)字段FPortletNumber的值为Portlet编码,其值不做硬性要求,但建议使用“PN-”+Portlet定义ID的形式,如PN-1001。

注:(2010-11-16) BOS SP3项目任务中加入Portlet分类管理,因此新增了字段FPortletCategoryID

相关默认分类ID如下:

基础系统:'FZIyxl8gLUmP15IW8klEnUPH2a4=' 基础资料: 'VTh25HxPQEKvvaIWWecTGEPH2a4=' 财务会计: 'VFcHBNjYQ0qfzqDnSOOmMkPH2a4=' 资产管理: '90O4cecHikiMJoEHN5Pg8kPH2a4=' 人力资源: '5ZE/Jdo9XkGqY38v30oQXkPH2a4=' 管理会计: '4M141/5vlU6fPGEOu+pG7UPH2a4=' 资金管理: 'hLg/8i2uPkmQOAKsHt88f0PH2a4=' 商业分析:'IbLhLRrJxUyZgDXwsRDKR0PH2a4='

协同平台: 'm6AWen4UD0SBnZ2qs/Dn5kPH2a4=' 供应链管理:'m6AWen4UD0SBnZ2qs/Dn5kPH2a4=' 成本管理: 'R2IPXjFfWEKCFO8i99+bJEPH2a4=' 数据仓库: 'cXvgkmCk+0Wf9OTQKtkG3UPH2a4=' 房地产:'kY+l8pEiI0mtkcUNsF/+uUPH2a4=' 产业链协同: 'Q+Y2omUEm0ClpF1FbQAlEUPH2a4=' 其他:'XkGI/dDGlkWJhX5ZEW9lOEPH2a4='

因此新增Portlet时需要明确你的Portlet要放在哪个分类下,并将对应的分类id插入到Portlet表中。

如果不插入该字段,Portlet会默认显示在根节点分类下

Portlet类别可以在Portlet管理里面新增,因此你可以新建一个自己的类别,同时需要查询“t_portal_portletCategory”表,获取到你新建类别的id,再来插入你的Portlet到刚刚新建的类别中

2.4 Portlet配置信息与数据库数据的对应关系

通常情况下,一条Portlet配置信息(portlets.xml以及tiles-defs.xml中各一个条目)对应数据库表T_Portal_Portlet中的一条数据。

如果多个Portlet使用相同的内容页面(tiles-defs.xml中的

name=\/html/custom/test.jsp\),则一条Portlet配置信息将对应数据库表T_Portal_Portlet中的多条数据。

一条Portlet配置信息对应数据库表T_Portal_Portlet中的多条数据的使用场景:内容管理定义了一个Portlet内容页面,每个栏目可以分别对应一个Portlet

定义,不同的Portlet定义通过参数进行区分,参数中记录栏目ID。可以通过程序动态创建,也可以采用实体提交的方式。对应实体:

com.kingdee.eas.portal.PortletInfo //Portlet定义

com.kingdee.eas.portal.PortletParameterInfo //Portlet参数

使用程序创建完后,需要刷新缓存才能起作用,相关API见2.5.1节第(4)点。

2.5 制作Portlet内容页面,实现业务需求

EAS门户中的Portlet可能具有多个页面,如用于展现业务逻辑的主页面、业务设置页面以及帮助说明页面等。

用于展现业务逻辑的主页面我们称之为“Portlet内容页面”,它是一个JSP页面,但并不是完整的,其最终输出为HTML片段,不能包含、以及标签。

以下是错误写法示例,Portlet内容页面不应该包含蓝色部分的标签:

EAS ...

下图展示了Portlet内容页面以及Portlet业务设置页面。

图2-1 Portlet内容页面

图2-2 Portlet业务设置页面

Portlet内容页面由相关的各业务部门根据各自的业务需求具体实现。EAS门户框架在Portlet内容页面上下文中提供了相应的接口以帮助开发人员完成具体业务逻辑的编写。

2.5.1 Portlet内容页面JSP接口

(1)获取EAS上下文(Context)

使用工具类WebContextUtil的getEasContext()方法。示例:

<%@page

import=\

Context userCtx = WebContextUtil.getEasContext(request);

(2)获取上下文中的用户、组织、职员等信息

·添加CSS样式文件到门户的head区域

kingdee.portal.common.addStyleSheet(cssFilePath);

其中cssFilePath为CSS文件的路径,用法示例:

kingdee.portal.common.addStyleSheet('<%=WebContextUtil.render(request, \

注,并不一定要使用WebContextUtil.render方法来获得CSS文件的路径,可以直接如下使用:

kingdee.portal.common.addStyleSheet('/html/portlet/example/demoPortlet.css');

但是,使用WebContextUtil.render方法获取文件可获得压缩特性,建议使用该方法。

·最大化Portlet

kingdee.portal.common.maxizePortlet(windowTitle, servletUrl, params);

其中,windowTitile为最大化Portlet时,窗口的标题,servletUrl为最大化Portlet所使用的url地址,params为需要传递的参数

2.5.3 Portlet内容页面制作规范与约束

(1)业务JSP代码文件放置规范 ·二次开发的业务JSP代码

受保护的需要放到server/deploy/eas.ear/cp_web.war/html/custom目录下。

非受保护的需要放到server/deploy/eas.ear/cp_web.war/custom目录下。 ·EAS标准产品的业务JSP代码

受保护的需在server/deploy/eas.ear/cp_web.war/html/portlet目录下建立对应的业务系统子目录,并放置对应的业务JSP代码。

非受保护的在server/deploy/eas.ear/cp_web.war/biz目录下建立对应子目录,并放置对应业务JSP代码。

·受保护和非受保护的区别

受保护的JSP页面必须要通过EAS Portal登录后才能访问,非受保护是指不

需要EAS Portal登录就可以访问。

(2)JS代码文件放置规范 JS文件放置到以下目录:

server/deploy/eas.ear/cp_web.war/common/js/

各业务部门请自行在js目录下建立子文件夹,以区分框架和其他部门的JS代码。该目录下(包括子目录)的所有JS文件在构建时都会自动进行压缩,将JS文件放置在其他目录将不会获得压缩特性。

(3)Portlet内容页面中,JS脚本变量和函数命名约束(重要)

在一个HTML文档内,JavaScript全局变量和函数命名必须唯一,否则会被后定义的覆盖。由于EAS门户中,不同页签,不同Portlet的内容最终将输出到一个HTML文档中,为了避免不同的Portlet内定义相同名称的JS变量或者在不同的页签内包含相同的Portlet定义,必须保证Portlet之间全局JS变量名和函数名唯一。

提示:只有Portlet内容页面(JSP片段)需要考虑命名问题,保证全局变量和函数命名唯一,其他独立的页面(包含完整的HTML标签的页面,如使用iframe方式嵌入的页面、Portlet业务设置页面等)则不需要考虑该问题。

最佳实践:尽量少使用全局变量。大量地使用全局变量将增加变量命名冲突的几率,应该谨慎使用全局变量。关于如何减少JS全局变量和函数数量的方法请见2.5.4节。

补充知识:在JS函数内,使用var关键字定义变量,变量的作用域为局部作用域,如果不使用var关键字,则为全局作用域。JS函数内的局部变量定义时都应该加上var关键字。

使用以下两种接口之一,均可获得与当前Portlet实例相关的全局唯一标识(“指纹”信息)。为Portlet内容页面中JS脚本的每个全局变量和函数加上该标识,则可保证该Portlet实例的JS全局变量和函数在EAS门户中全局唯一,避免不同Portlet之间以及不同页签相同Portlet不同实例之间的JS变量和函数命名冲突。

接口1:

使用com.kingdee.eas.portal.web.util.PortletUtil 示例:

// fp is short for fingerprint

String fp = PortletUtil.getFingerprint(request);

接口2:

使用com.kingdee.eas.portal.web.util.PortletIndexGenerator 示例:

// fp is short for fingerprint

String fp = PortletIndexGenerator.nextPortletIndex(request);

两种接口的区别:接口1既可以在Portlet内容页面中使用,也可以在Portlet业务设置页面中使用(见第3章);而接口2只能在Portlet内容页面中使用。

获得“指纹”信息后(示例中为Java变量fp),为每个全局变量和函数加上该标识,代码示例如下:

??

()”>My Link

上面的例子中,一共定义了4个全局变量(包括函数),通常情况下,应尽量控制全局变量的数量,关于如何减少JS全局变量和函数数量的方法请见2.5.4节。

注意:该约束必须严格执行,以避免影响框架和Portlet的功能。 (4)Portlet内容页面中,CSS样式命名规范(重要)

和JS脚本变量和函数命名需要全局唯一一样,CSS中的class和id命名也需要考虑到全局影响的情况。

提示:只有Portlet内容页面(JSP片段)需要考虑命名问题,保证class和id命名唯一,其他独立的页面(包含完整的HTML标签的页面,如使用iframe方式嵌入的页面、Portlet业务设置页面等)则不需要考虑该问题。

页面中的元素id属性值需要保证全局唯一,这就需要进行类似JS脚本中变量命名约束的操作,如:

\

如果id值不添加唯一标识,则在页面中存在相同Portlet的多个实例(可能位于不同页签内)时,页面中将出现多个id相同的元素,这将对样式或脚本产生影响。

在Portlet内容页面中书写CSS样式有两种方式: ·在标签中加上style属性

这种方法最直接,而且由于优先级最高,可以避免Portlet内容的样式受到Portal全局样式的影响,但维护起来比较麻烦。

·引入外部CSS文件

这种方法可以对Portlet内容的样式进行统一管理,方便维护。 使用JS脚本引入外部CSS文件的方法如下:

kingdee.portal.common.addStyleSheet('<%=WebContextUtil.render(request, \/html/portlet/example/demoPortlet.css\

红色部分替换成实际的CSS文件地址。关于该JS接口在2.5.2 节(Portlet内容页面JS接口)已有详细阐述。

注意:不要在Portlet内容页面中直接使用标签引入样式,框架目前不支持这种方式。可以使用