




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水電安裝維修活動方案
- 桂平市廣場五四活動方案
- 檢察院整治活動方案
- 河北農大活動社團活動方案
- 氣焊工比武活動方案
- 校長走進課堂活動方案
- 漢字拼湊游戲活動方案
- 汽車國慶活動策劃方案
- 棋道育人活動方案
- 森林昆蟲聚會活動方案
- 2025年貴州省羅甸縣事業單位人才引進166人歷年高頻重點提升(共500題)附帶答案詳解
- 《如何設定目標》課件
- 房地產業智慧物業管理系統實施方案
- 2024年度城市公共停車場停車場承包經營合同范本3篇
- T∕HGJ 12402-2021 石油化工裝置火災緊急隔離控制閥設計標準
- 辦公用紙項目建設實施方案
- 2024版《53天天練單元歸類復習》3年級語文下冊(統編RJ)附參考答案
- 辣椒購銷合同范本
- 13J927-3 機械式停車庫設計圖冊
- 裝卸工安全培訓課件
- 2024圖書約稿合同范本
評論
0/150
提交評論