金蝶_Portlet二次开发指南_第1页
金蝶_Portlet二次开发指南_第2页
金蝶_Portlet二次开发指南_第3页
金蝶_Portlet二次开发指南_第4页
金蝶_Portlet二次开发指南_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、金蝶BOSEAS门户Portlet制作指南EAS门户Portlet制作指南EAS门户Portlet制作指南文档版本V1.0发布日期2011-1-12金蝶软件(中国)有限公司地址深圳市高新技术产业园南区科技南十二路2号金蝶软件园Kingdee Software(China)Co.,Ltd邮编518057网址 客户服务电话86-755-26612299客户服务传真86-755-26615016客户服务邮箱webmaster版权所有 © 金蝶软件(中国)有限公司本书著作权属于金蝶软件(中国)有限公司所有,在未经本公司许可的情况下,任何单位或个人不得以任何方式对本书的部分或全部内容擅自进行增

2、删,改编,节录,翻译,翻印,改写。注意由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文档中的所有陈述、信息和建议不构成任何明示或暗示的担保。文档版本 V1.0 (2011/1/12)版权所有 © 金蝶软件(中国)有限公司71金蝶BOSEAS门户Portlet制作指南表格目录前言概述本指南主要介绍EAS门户Portlet的制作过程。简要阐述了EAS门户的新特性,详细介绍了制作Portlet的过程和步骤,对制作Portlet过程遇到的常见问题进行了说明。读者对象本手册适用于EAS门户Portlet开发人员。约定符号约定在本文中可能出现下列标

3、志,它们所代表的含义如下。符号说明表示有潜在风险,如果忽视这些文本,可能导致操作错误、数据丢失、设备性能降低或不可预知的结果。表示可以帮助您获取更多相关信息或提示您通过其它方式也可以获得相同结果。强调或补充说明所描述的信息。内容约定无特殊约定。修订记录文档版本V1.6第七次发布,文档内容更新如下:更新Portlet制作sql编写说明。文档版本V1.5第六次发布,文档内容更新如下:增加Portlet通信到附录部分。文档版本V1.4第五次发布,文档内容更新如下:更新Portlet操作接口说明,添加addPortletReturnId接口。文档版本V1.3第四次发布,文档内容更新如下:将嵌入的文件迁

4、移到附录中。文档版本V1.2第三次发布,文档内容更新如下:更新Portlet操作接口说明。文档版本V1.1第二次发布,文档内容更新如下:添加对JS文件放置路径规范说明。文档版本V1.0第一次发布。目录1 EAS门户简介111.1 概念介绍111.2 EAS Portlet111.3 什么时候需要二次开发Portlet112 Portlet制作112.1 Portlet制作步骤112.2 配置Portlet信息122.2.1 配置Portlet定义信息122.2.2 配置Portlet业务处理信息132.3 向数据库插入相关数据142.4 Portlet配置信息与数据库数据的对应关系162.5

5、制作Portlet内容页面,实现业务需求162.5.1 Portlet内容页面JSP接口172.5.2 Portlet内容页面JS接口202.5.3 Portlet内容页面制作规范与约束232.5.4 Portlet内容页面制作常见问题272.5.5 Portlet内容页面HTC控件的替换312.5.6 门户优化合并且删除了部分js323 Portlet业务设置333.1 关联Portlet业务设置页面353.2 Portlet业务设置页面JSP接口363.3 Portlet业务设置页面JS接口374 Portlet的使用385 附录1 Portal配置文件拆分说明405.1 buffalo-

6、perties的拆分405.2 portlet.xml的拆分415.3 struts-config.xml的拆分415.4 tiles-defs.xml的拆分425.5 web.xml的拆分426 附录2 PortletUtil API437 附录3 Ajax之Buffalo开发指南617.1 概述617.2 buffalo介绍617.3 利用buffalo开发AJAX应用627.3.1 操作过程627.3.2 EAS的典型应用例子647.4 总结647.5 资料648 附录4门户Portlet之间通信648.1 简介648.2 实现原理668.3 实例668.3.2

7、简单示例668.3.3 门户下面的多Portlet通信例子68插图目录图5-1 Portlet相关SQL脚本提交位置40表格目录错误!未找到图形项目表。1 EAS门户简介这个应该在发版说明中介绍。本章节可以从介绍Portlet的角度出发,介绍它的定义,分类,它在EAS门户中的作用,EAS门户中Portlet的处理机制或原理,什么场景下需要用户自己制作Portlet等1.1 概念介绍l PortalPortal是一个基于web的应用程序,它主要提供个性化、单点登录、不同来源的内容整合以及存放信息系统的表示层。Portal从本质上来说就是一个内容聚集的平台。l PortletPortlet是基于j

8、ava技术的web组件,用于聚集不同的内容,展现在门户平台。1.2 EAS PortletEAS中的Portlet其实就是一个内容部件,它给门户提供丰富的展现内容。EAS Portlet由框架统一管理其外部属性,如标题、边框、边框颜色背景图片等,由业务人员开发Portlet中的具体内容,如工作流的待办事项、协同的常用功能等。1.3 什么时候需要二次开发Portlet当用户需要在门户中集中展现相关业务系统的内容时,通常有以下几种方式处理l 看EAS标准产品是否有提供了满足用户需求的Portlet,已经提供的可以直接通过门户的页签管理配置该Portlet到具体页签中。l EAS标准产品没有提供的,

9、需要由需求人员分析需求是否通用并答复出补丁提供。l 对于需求比较个性化而标准产品不提供的情况,则需要现场二次开发Portlet满足客户需求。2 Portlet制作2.1 Portlet制作步骤Portlet制作过程包含以下几个步骤1. 配置Portlet信息2. 向数据库插入相关数据3. 制作Portlet内容页面,实现业务需求4. 制作Portlet业务设置页面(可选)最后一个步骤并不是必须的,在Portlet的业务需求需要业务设置时,才进行此步骤。下面将分小节详细介绍Portlet制作的各个步骤,关于Portlet业务设置的内容将单独在第3章中介绍。2.2 配置Portlet信息2.2.1

10、 配置Portlet定义信息1) 配置文件路径l EAS5.4版本:server/profiles/server1/config/portalConfig/portlets.xmll EAS6.0版本:server/deploy/eas.ear/cp_web.war/WEB-INF/portlets_xxx.xml其中,xxx表示具体的业务领域名称,如bos、eas等,详细信息请参考“附录1 Portal配置文件拆分说明”2) 配置说明<portlet><portletID>1001</portletID><title>testPortlet&l

11、t;/title> <modes><mode><name>view</name> <value>portlet.test</value></mode></modes></portlet>各配置参数值说明如下:l 1001Portlet定义ID,全局唯一,不能重复。取值范围具体约定如下:BOS为 1-199 ,EAS为 200-999, 二次开发为 1000 以后;l testPortletPortlet定义信息,无特别要求,一般使用英文字符标识。注意该标题信息仅用于在配置文件中区分

12、不同的Portlet,与Portlet在运行时显示的标题无关,Portlet在运行时显示的标题信息由数据库中的内容决定,2.3小节有详细说明;l portlet.test对应于“Portlet业务处理信息”的配置信息,具体见下一小节。2.2.2 配置Portlet业务处理信息1) 配置文件路径server/deploy/eas.ear/cp_web.war/WEB-INF/tiles-defs_xxx.xml其中,xxx表示具体的业务领域名称,如bos、eas等,详细信息请参考附录一Portal配置文件拆分说明。2) 配置说明<definition name="portlet.

13、test"extends="portlet_default_eas50"controllerUrl="/PortletAssembleAction.do"><put name="portlet_id" value="1001" /><put name="portlet_content" value="/html/custom/test.jsp" /></definition>各配置参数值说明如下:l portlet.test

14、tiles定义名称,和上一节Portlet定义信息的配置保持一致;l 1001对应的Portlet定义ID,和上一节Portlet定义信息的配置保持一致;l /html/custom/test.jsp业务处理页面(即2.5节将提到的“Portlet内容页面”)地址,如果是Struts,则还需要在struts-config.xml中进行配置,具体可以参考Struts官方文档。2.3 向数据库插入相关数据通过EAS管理控制台执行如下脚本,在数据库中插入一条记录,KSQL语句如下(字段FPortletCategoryID是bos 633加入的,请确认你的开发环境是否sp3,如果不是请不要插入该字段,

15、,见下面SP3备注):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('0B3448

16、90'),'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'1001',NULL,N'测试1',N'測試1',1,N'PN-

17、1001',NULL, N'测试1', N'測試1', 'XkGI/dDGlkWJhX5ZEW9lOEPH2a4=');说明与注意事项:l 插入字段FID的值请务必使用函数NEWBOSID,其中'0B344890'为Portlet实体元数据编码,该值不能更改为其他值,否则程序获取Portlet信息时将出错。函数NEWBOSID('0B344890')每次执行会产生新的ID值,如果作为脚本提交,请注意修改为一个确定的ID值,且一定要支持可重复升级。l 字段FPortletDefineId的值一定要和Portl

18、et定义信息配置文件中定义的值保持一致。l 繁体字段一定要使用繁体文字,否则和语言不匹配。l 字段FPortletNumber的值为Portlet编码,其值不做硬性要求,但建议使用“PN-”+Portlet定义ID的形式,如PN-1001。SP3备注:(2010-11-16) BOS 633即for EAS 7 SP3项目任务中加入Portlet分类管理,因此新增了字段FPortletCategoryID。相关默认分类ID如下(ID为固定ID,不会改变):l 基础系统:'FZIyxl8gLUmP15IW8klEnUPH2a4='l 基础资料: 'VTh25HxPQEKv

19、vaIWWecTGEPH2a4='l 财务会计: 'VFcHBNjYQ0qfzqDnSOOmMkPH2a4='l 资产管理: '90O4cecHikiMJoEHN5Pg8kPH2a4='l 人力资源: '5ZE/Jdo9XkGqY38v30oQXkPH2a4='l 管理会计: '4M141/5vlU6fPGEOu+pG7UPH2a4='l 资金管理: 'hLg/8i2uPkmQOAKsHt88f0PH2a4='l 商业分析:'IbLhLRrJxUyZgDXwsRDKR0PH2a4='l 协同

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

21、lOEPH2a4='因此新增Portlet时需要明确你的Portlet要放在哪个分类下,并将对应的分类id插入到Portlet表中。没有对应的分类请插入到“其他”类别中,或者按下面的方式新建自己的Portlet类别Portlet类别可以在 配置管理->Portlet管理 里面新增,因此你可以新建一个自己的类别,同时需要查询“t_portal_portletCategory”表,获取到你新建类别的id,再来插入你的Portlet到刚刚新建的类别中。2.4 Portlet配置信息与数据库数据的对应关系通常情况下,一条Portlet配置信息(portlets.xml以及tiles-de

22、fs.xml中各一个条目)对应数据库表T_Portal_Portlet中的一条数据。如果多个Portlet使用相同的内容页面(tiles-defs.xml中的<put name="portlet_content" value="/html/custom/test.jsp" />),则一条Portlet配置信息将对应数据库表T_Portal_Portlet中的多条数据。一条Portlet配置信息对应数据库表T_Portal_Portlet中的多条数据的使用场景:内容管理定义了一个Portlet内容页面,每个栏目可以分别对应一个Portlet定义

23、,不同的Portlet定义通过参数进行区分,参数中记录栏目ID。可以通过程序动态创建,也可以采用实体提交的方式。对应实体: com.kingdee.eas.portal.PortletInfo /Portlet定义 com.kingdee.eas.portal.PortletParameterInfo /Portlet参数使用程序创建完后,需要刷新缓存才能起作用,相关API见2.5.1节第(4)点。2.5 制作Portlet内容页面,实现业务需求EAS门户中的Portlet可能具有多个页面,如用于展现业务逻辑的主页面、业务设置页面以及帮助说明页面等。用于展现业务逻辑的主页面我们称之为“Port

24、let内容页面”,它是一个JSP页面,但并不是完整的,其最终输出为HTML片段,不能包含<html>、<head>以及<body>标签。以下是错误写法示例,Portlet内容页面不应该包含蓝色部分的标签:<html><head><meta content="no-cache" http-equiv="Cache-Control"><meta content="no-cache" http-equiv="Pragma"><met

25、a content="0" http-equiv="Expires"><title>EAS</title></head><body><div>.</div></body></html>下图展示了Portlet内容页面以及Portlet业务设置页面。图2-1 Portlet内容页面图2-2 Portlet业务设置页面Portlet内容页面由相关的各业务部门根据各自的业务需求具体实现。EAS门户框架在Portlet内容页面上下文中提供了相应的接口以帮助开发人

26、员完成具体业务逻辑的编写。2.5.1 Portlet内容页面JSP接口1) 获取EAS上下文(Context)使用工具类WebContextUtil的getEasContext()方法。示例:<%page import="mon.web.util.WebContextUtil"%>Context userCtx = WebContextUtil.getEasContext(request);2) 获取上下文中的用户、组织、职员等信息使用工具类ContextUtil,示例:<%page import="com.kingdee.eas.util.ap

27、p.ContextUtil"%>.String name = null;PersonInfo personInfo = ContextUtil.getCurrentUserInfo(ctx).getPerson();if (personInfo != null) name = personInfo.getName();3) 调用服务器端方法l EAS6.0打补丁PTM035205之前,与ControlBean中调用本地方法一样,示例:Context ctx = WebContextUtil.getEasContext(request);IMessageCenter iMessa

28、geCenter = MessageCenterFactory.getLocalInstance(ctx);IRowSet rowset = iMessageCenter.getAcceptedTask();l EAS6.0打补丁PTM035205之后:IMessageCenter iMessageCenter = MessageCenterFactory.getRemoteInstance();IRowSet rowset = iMessageCenter.getAcceptedTask();4) Portlet操作使用接口com.kingdee.eas.portal.IPortalServ

29、iceFacade,该接口提供以下方法:l 禁用Portlet(含批量处理):disablePortlet l 启用Portlet(含批量处理):enablePortletl 作废Portlet:deletePortletl 新增Portlet(无返回值):addPortletl 新增Portlet(返回新建ID):addPortletReturnIdl 更新Portlet:updatel 刷新Portlet缓存:refreshPortletCachel 获取Portlet:getPortlet注意事项:l 所有与Portlet相关的操作,如添加、删除、更新等,都必须使用该接口,不要直接调用I

30、Portlet接口对Portlet进行操作;l 进行Portlet操作(获取Portlet除外)后,在最后务必使用refreshPortletCache来刷新Portlet缓存数据,示例:IPortalServiceFacade service = PortalServiceFacadeFactory.getLocalInstance(ctx);service.enablePortlet(portletID);service.refreshPortletCache();l 对PortletExtInfo的操作,由于PortletInfo包含PortletExtInfo,因此同样通过接口com.

31、kingdee.eas.portal.IPortalServiceFacade进行,举例如下(其中,portletInfo为PortletInfo的实例): 添加PortletExtInfoPortletExtInfo portletExtInfo = new PortletExtInfo();portletExtInfo.setTitle("自定义Portlet标题");portletExtInfo.setBizDefUrl("/html/portlet/example/demoPortletDefSetting.jsp");portletExtInf

32、o.setBizInsUrl("/html/portlet/example/demoPortletInsSetting.jsp");portletInfo.setPortletExt(portletExtInfo);IPortalServiceFacade psf = PortalServiceFacadeFactory.getLocalInstance(ctx);/ 如果portletInfo是新增,则psf.addPortlet(portletInfo);/ 如果portletInfo是修改,则/psf.update(portletInfo.getId(), portl

33、etInfo); 修改PortletExtInfoPortletExtInfo portletExtInfo = portletInfo.getPortletExt();portletExtInfo.setTitle("修改自定义Portlet标题");IPortalServiceFacade psf = PortalServiceFacadeFactory.getLocalInstance(ctx);psf.update(portletInfo.getId(), portletInfo); 删除PortletExtInfoportletInfo.setPortletExt

34、(null);IPortalServiceFacade psf = PortalServiceFacadeFactory.getLocalInstance(ctx);psf.update(portletInfo.getId(), portletInfo);5) 获取Portlet相关信息包括Portlet定义和实例信息,如Portlet在配置文件中的定义ID,在数据库中的定义ID、实例ID以及Portlet的个性化信息(自定义标题、高度、颜色配置等)等。使用工具类com.kingdee.eas.portal.web.util.PortletUtil可以在Portlet内容页面以及业务设置页面(

35、后续将提及)上获取Portlet的相关信息,包括Portlet的个性化信息(如果存在的话)。以Portlet内容页面为例,假设需要在此页面获得Portlet的自定义显示名称以及Portlet实例的高度。首先引入PortletUtil<% page import="com.kingdee.eas.portal.web.util.PortletUtil"%>获取Portlet自定义显示名称:String customizedName = PortletUtil.getCustomizedName(request);获取Portlet实例高度:int insHeigh

36、t = PortletUtil.getInsHeight(request);高度值单位为像素,如果高度值为0,则表示实例的高度自适应。关于PortletUtil的接口请参考“附录2 PortletUtil API”,代码参考:server/deploy/eas.ear/cp_web.war/html/portlet/example/demoPortlet.jsp2.5.2 Portlet内容页面JS接口这些JS接口(变量或者函数)在Portlet内容页面中可直接使用1) Buffalo Ajax框架定义了两个Buffalo对象:buffaloAsync:异步方式buffaloSync:同步方式

37、使用示例:buffaloAsync.remoteCall('messageService.getMsgCount', true, function(reply) var arr = reply.getResult(); .在Portlet内容页面中使用Buffalo时请直接使用以上两个对象,不必重新创建Buffalo对象。在上一版本中,框架提供的Buffalo对象名称分别为:buffalo:异步方式buffalo1:同步方式这两个对象在门户框架新版本中仍然保留,但不建议使用。请使用buffaloAsync和buffaloSync。注意,如果需要创建新的Buffalo对象,请避免

38、使用buffaloAsync、buffaloSync、buffalo、buffalo1这4个变量命名,否则将会覆盖这些框架提供的Buffalo对象。2) 打开客户端GUI界面l invokeFunction(uiClass, uiClassParam, uiOprt, openMethod);l createModelUI(uiClass);l createNewWinUI(uiClass);l createNewTabUI(uiClass);l openEasMainMenu();其中uiOprt可设置为字符串: ADDNEW、VIEW、EDIT ADDNEW:新增 VIEW:查看 EDIT

39、:编辑openMethod可设置为数字:50、80、及其他数字 50:模态窗口 80:新开窗口 其他值:新开页签单据查看GUI界面接口:viewBill(billId);参数为单据ID(单据的UUID,非单据编号),EAS门户页面在不同帧下调用方式略有不用,门户各页签Portlet(比如我的日历,我的工作台等)标准调用方式为直接调用: viewBill('63fYLq2CTOCwsBgFdet+6Qneydw=');而各自页签加入了帧(frame)的情况下(如流程中心加入了newMessageFrame),需要如下调用: parent.viewBill('63fYLq2

40、CTOCwsBgFdet+6Qneydw='); 其他多层帧的情况以此类推,需要通过parent或者top等方式获取上层的JS函数来调用。更多关于打开GUI界面的函数请参考以下文件:server/deploy/eas.ear/cp_web.war/common/js/easHandler.js3) 拖动Portlet后刷新Portlet内容该功能常用于Portlet宽度需要自适应的场景,如“通知Portlet”和“待办事项Portlet”,由于这两个Portlet的宽度由JS动态计算而得,所以当他们移动到其他不同宽度的区域时,需要重新计算宽度,这时候就需要刷新Portlet内容以触发宽

41、度的重新计算。在Portlet内容页面中实现以下函数,并返回true值:function afterPortletDrop<%=fp%>(toWidth) return true;其中,<%=fp%>是用于避免JS变量或函数命名冲突的标识(关于JS脚本变量和函数命名约束以及该标识如何获得等问题请参考2.5.3节),该标识必须加上,否则框架无法判断需要刷新哪个Portlet。参数toWidth为目标区域的宽度值,由框架传递,在该函数内可用该参数值进行一些必要的处理。不实现该函数或者函数返回true以外的值,则拖动Portlet后,Portlet内容不刷新。4) 其他l P

42、ortal路径mon.portalContextPath;其值如::6888/easportall Portal当前色彩方案皮肤路径:mon.portalSkinPath;其值如::6888/easportal/skin/01l 添加CSS样式文件到门户的head区域mon.addStyleSheet(cssFilePath);其中cssFilePath为CSS文件的路径,用法示例:mon.addStyleSheet('<%=WebContextUtil.render(request, "/html

43、/portlet/example/demoPortlet.css")%>');注,并不一定要使用WebContextUtil.render方法来获得CSS文件的路径,可以直接如下使用:mon.addStyleSheet('/html/portlet/example/demoPortlet.css');但是,使用WebContextUtil.render方法获取文件可获得压缩以及浏览器缓存控制特性,建议使用该方法。l 最大化Portletmon.maxizePortlet(windowTitle, servletUrl, params);其中,window

44、Titile为最大化Portlet时,窗口的标题,servletUrl为最大化Portlet所使用的url地址,params为需要传递的参数2.5.3 Portlet内容页面制作规范与约束1) 业务JSP代码文件放置规范l 二次开发的业务JSP代码受保护的需要放到server/deploy/eas.ear/cp_web.war/html/custom目录下。非受保护的需要放到server/deploy/eas.ear/cp_web.war/custom目录下。l EAS标准产品的业务JSP代码受保护的需在server/deploy/eas.ear/cp_web.war/html/portlet

45、目录下建立对应的业务系统子目录,并放置对应的业务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文件在构建时都会自动进行

46、压缩,将JS文件放置在其他目录将不会获得压缩特性。3) Portlet内容页面中,JS脚本变量和函数命名约束(重要)在一个HTML文档内,JavaScript全局变量和函数命名必须唯一,否则会被后定义的覆盖。由于EAS门户中,不同页签,不同Portlet的内容最终将输出到一个HTML文档中,为了避免不同的Portlet内定义相同名称的JS变量或者在不同的页签内包含相同的Portlet定义,必须保证Portlet之间全局JS变量名和函数名唯一。l 提示只有Portlet内容页面(JSP片段)需要考虑命名问题,保证全局变量和函数命名唯一,其他独立的页面(包含完整的HTML标签的页面,如使用ifra

47、me方式嵌入的页面、Portlet业务设置页面等)则不需要考虑该问题。l 最佳实践尽量少使用全局变量。大量地使用全局变量将增加变量命名冲突的几率,应该谨慎使用全局变量。关于如何减少JS全局变量和函数数量的方法请见2.5.4节。l 补充知识在JS函数内,使用var关键字定义变量,变量的作用域为局部作用域,如果不使用var关键字,则为全局作用域。JS函数内的局部变量定义时都应该加上var关键字。使用以下接口可获得与当前Portlet实例相关的全局唯一标识(“指纹”信息)。为Portlet内容页面中JS脚本的每个全局变量和函数加上该标识,则可保证该Portlet实例的JS全局变量和函数在EAS门户中

48、全局唯一,避免不同Portlet之间以及不同页签相同Portlet不同实例之间的JS变量和函数命名冲突。l 接口使用com.kingdee.eas.portal.web.util.PortletUtil示例:/ fp is short for fingerprintString fp = PortletUtil.getFingerprint(request);获得“指纹”信息后(示例中为Java变量fp),为每个全局变量和函数加上该标识,代码示例如下:<script type=”text/javascript”>var a<%=fp%> = 1;var b<%=f

49、p%> = 2;function fnOne<%=fp%>() function fnTwo<%=fp%>() </script><a href=”#” onclick=”fnTwo<%=fp%>()”>My Link</a>上面的例子中,一共定义了4个全局变量(包括函数),通常情况下,应尽量控制全局变量的数量,关于如何减少JS全局变量和函数数量的方法请见2.5.4节。注意:该约束必须严格执行,以避免影响框架和Portlet的功能。4) Portlet内容页面中,CSS样式命名规范(重要)和JS脚本变量和函数命名需要

50、全局唯一一样,CSS中的class和id命名也需要考虑到全局影响的情况。提示:只有Portlet内容页面(JSP片段)需要考虑命名问题,保证class和id命名唯一,其他独立的页面(包含完整的HTML标签的页面,如使用iframe方式嵌入的页面、Portlet业务设置页面等)则不需要考虑该问题。页面中的元素id属性值需要保证全局唯一,这就需要进行类似JS脚本中变量命名约束的操作,如:<div id="test-div-<%=fp%>"></div>如果id值不添加唯一标识,则在页面中存在相同Portlet的多个实例(可能位于不同页签内)时

51、,页面中将出现多个id相同的元素,这将对样式或脚本产生影响。在Portlet内容页面中书写CSS样式有两种方式: 在标签中加上style属性这种方法最直接,而且由于优先级最高,可以避免Portlet内容的样式受到Portal全局样式的影响,但维护起来比较麻烦。 引入外部CSS文件这种方法可以对Portlet内容的样式进行统一管理,方便维护。使用JS脚本引入外部CSS文件的方法如下:mon.addStyleSheet('<%=WebContextUtil.render(request, "/html/portlet/example/demoPortlet.css"

52、;)%>');红色部分替换成实际的CSS文件地址。关于该JS接口在2.5.2 节(Portlet内容页面JS接口)已有详细阐述。注意:不要在Portlet内容页面中直接使用<link>标签引入样式,框架目前不支持这种方式。可以使用<style>标签来书写样式,但并不推荐,因为页面中存在相同Portlet的多个实例时,这些样式将被包含多次,当然,这通常不会是什么大问题。使用函数mon.addStyleSheet添加样式文件时,即时页面中存在相同Portlet的多个实例,样式文件也只会在页面头部加载一次。使用引入外部CSS文件的方式时,CSS样式的命名需遵循以

53、下规范:kpp-xxx-yyy kpp前缀代表Kingdee Portal Portlet xxx为模块名称,如mycalendar以“示例Portlet”为例,其CSS样式的命名如下所示:.kpp-demoportlet-table .kpp-demoportlet-class-selector-name 2.5.4 Portlet内容页面制作常见问题1) 如何嵌入一个完整JSP页面?可以在JSP页面中嵌入iframe帧结构,场景:EAS Portal中嵌入的OA页面,具体可参考以下文件:server/deploy/eas.ear/cp_web.war/custom/yiruan_oa.js

54、p 2) 如何提交页面数据?l 打开新窗口进行处理l 使用最大化Portlet进行处理l 使用Ajax技术来提交。目前成熟的Ajax框架很多,EAS门户中采用的是Buffalo框架,相关开发指南见“附录3 Ajax之Buffalo开发指南”。3) 如何直接执行SQL语句?(对于web端页面,尽量不要出现数据库操作的代码,建议将其放入server端进行处理)import com.kingdee.eas.util.app.DbUtil;import com.kingdee.jdbc.rowset.IRowSet;Context userCtx = WebContextUtil.getEasCont

55、ext(request);/执行查询IRowSet rowSet = DbUtil.executeQuery(ctx, "select * from t_pm_user");if (rowSet != null) while (rowSet.next() String user = rowSet.getString("fnumber");/执行更新DbUtil.execute(ctx, "update t_pm_user set fname_l2='zhangsan' where fnumber='00201'&

56、quot;);4) 我觉得我的JS脚本中全局变量和函数的命名已经很规范了,比如都加了前缀xxx_yyy_zzz,是不是就可以不使用框架提供的方法进行变量和函数命名的修改呢?恐怕不行。因为即便命名已经做了规范,还是有可能与其他Portlet或框架的JS变量和函数产生冲突。即便可以保证和其他Portlet或框架不产生冲突,不同页签下相同Portlet不同实例的代码肯定也会产生冲突。比如页签1下有Portlet1的实例PortletIns1,其中使用了全局JS变量a,页签2下有Portlet1的实例PortletIns2,必定也使用了相同的全局JS变量a,由于不同页签之间的Portlet的代码都在同

57、一个EAS门户的HTML中,所以JS变量产生了冲突。所以,请务必按照2.5.3节第(2)点的方法进行JS脚本全局变量和函数的命名规范。5) 如何尽量少地定义JS脚本中的全局变量(函数)?可参考以下风格:<script type="text/javascript">var mycalendar<%=fp%> = a: 1, b: 2, fnOne: function() , fnTwo: function() </script><a href="#" onclick="mycalendar<%=fp%>.fnTwo()">My Link</a>使用该方式,只需定义1个全局变量mycalendar<%=fp%>,其他变量或函数都是局部变量,不会造成命名冲突。6) 原有的Portlet中的代码(主要是JS代码)需要按照JS变量和函数命名规范进行修改吗?如果使用的是新的门户框架,那么必须进行代码重构。需要进行JS代码重构的页面仅仅是那些对门户全局JS变量和函数有影响的页面,如Portlet内容页面,而对于

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论