隨筆-86  評論-767  文章-3  trackbacks-3

          第三節 ?Portal的對象

          JSR168Portal定義了幾個特別的對象,用來操作Portal特有的信息。這些對象跟Servlet的對象有點類似,又有點不同。這些對象都封裝在{PORTAL_HOME}/common/lib/ext/portlet.jar包中,具體支持實現要視Portal服務器而定。

          3.3.1? Request對象

          Portlet中的RequestServletRequest一樣接受客戶端發送的請求,但是與Servlet不同,PortletRequest分為Action RequestRender Request兩種類型,因此Portlet接口中定義了兩種方法用來處理不同的Request。分別是processAction(ActionRequest requestActionResponse response) render(RenderRequest requestRenderResponse response),分別用以處理Action RequestRender Request。某種意義上來講,render方法類似Servlet中的service方法,doViewdoEditdoHelp方法又類似doGetdoPost方法。
          圖3.3.1–1.jpg圖3.3.1–2.jpg圖3.3.1-3.jpg

          RenderRequestActionRequest

          PortletRequest分為RenderRequestActionRequest兩種,分別由renderURLactionURL來觸發。renderURLactionURL的一種優化。Portlet的開發過程中盡量使用renderURL而避免actionURLactionURL適用于有確實的Action(行為)的情況下。比如說,表單form提交后Persistent狀態的改變、session的改變、perference的修改等等。renderURL通常用來處理Portlet的導航。舉個例子:

          使用actionURL

          <%

          PortletURL pu = renderResponse.createActionURL();

          pu.setParameter("ACTION""LOGIN");

          %>

          說明:表單提交最好使用Post方法而不是Get方法,因為某些Portal服務器可能會將內部狀態編碼到URLQuery字符串中。

          使用renderURL

          <%

          PortletURL pu=renderResponse.createRenderURL();

          Pu.setParameter("PAGE"Number);

          %>

          下一頁

          renderURLactionURL的處理方式

          當客戶端請求是由一個renderURL觸發的時候,Portal服務器會調用該Portal頁面所有Portletrender方法。

          而當客戶端請求是由一個actionURL觸發的時候,Portal服務器會先按用該頁面所有PortletprocessAction方法再調用render方法。所以,要明確自己到底使用那種URL來出發客戶端請求。

          RenderRequestActionRequestparameter參數作用范圍

          當客戶端請求由一個actionRequest觸發時,所有parameter參數的取得都必須在processAction方法中進行。比如:

          public void processAction(ActionRequest reqActionResponse res){

          ?????? String str = req.getParameter("ACTION");

          ?????? //response.setRenderParameter("ACTION"action);

          }

          ?

          public void doView(ActionRequest reqActionResponse res){

          ?????? String str = req.getParameter("ACTION");

          }

          如上processAction方法中,getParameter方法將能成功得到表單中的參數ACTION所對應的值,因為我們知道,當目標PortletprocessAction方法運行完后,Portlet Container將調用Portal頁面中所有Portletrender方法.但是實際上doView方法中使用getParameter不會得到任何值.但是如果把processAction方法中注釋了的一行解除注釋的話,你就可以在doView方法中的得到參數ACTION對應的值. 這說明action request的參數,render方法中不可以直接取到.必須使用了setRenderParameter方法,再次傳遞一次.

          3.3.2? Response對象

          Request對象一樣,Response對象也有兩種:RenderResponseActionResponse,分別用來封裝對應的RenderRequestActionRequest的返回信息,比如重定向、窗口狀態、Portlet模式等。他們兩者的父類PortletResponse擁有serPorpertygetPorperty兩個方法,用來傳遞信息給Portal容器。
          圖3.3.2-1.jpg圖3.3.2-2.jpg圖3.3.2-3.jpg

          ActionResponse主要用來處理以下功能:

          a、? 重定向

          b、? 改變窗口狀態、Portlet模式

          c、? 傳遞parameter參數到RenderRequest中去

          RenderResponse主要用來提供以下功能:

          a、? 設置ContentType

          b、? 得到OutputStreamWriter對象,用來輸出頁面內容

          c、? Buffering緩沖

          d、? 設定Portlet的標題,但是必須在Portlet輸出前調用,否則將被忽略

          3.3.3? PortletConfig對象

          ServletConfig對象類似,PortletConfig對象提供對Portlet初始化信息以及PortletContext對象存取的方法。

          ServletConfig對象不同的是,PortletConfig對象提供對Portlet的標題等資源的I18N支持,可以通過設定不同的Resource Bundle文件以提供多種語言支持。

          3.3.4? Session對象

          由于容器不同,PortalSession對象與ServletSession對象略有不同。

          由于Portlet處于Portal服務器的緣故,PortletSession分為Application ScopePortlet Scope。兩者的區別在于:

          Application Scope范圍的Session中保存的對象,對于同一個Portlet應用范圍內的所有Portlet都是可用的。

          Portlet Scope范圍的Session中保存的對象,只對本Portlet可用,其他Portlet即使在同一個應用中,也不可用。

          圖3.3.4-1.jpg

          但是對于Portlet應用來說,可以通過HttpSession來訪問。畢竟Portlet應用也是Web應用。在使用Session對象的時候,最好能明確指出使用的是那個Scope范圍的Session。比如:

          NORMAL" PortletMode="view" var="pu1">

          ?

          NORMAL" PortletMode="view" var="pu2">

          這個JSP創建了兩個ActionURL,分別產生了兩種PortletSession對象。

          PortletSession ps = req.getPortletSession();

          if(ps.getAttribute("PortletSession.AS"PortletSession.APPLICATION_SCOPE)!=null){

          ?????? app=ps.getAttribute("PortletSession.AS"PortletSession.APPLICATION_SCOPE).

          toString();

          }

          if(ps.getAttribute("PortletSession.PS"PortletSession.PORTLET_SCOPE)!=null){

          ?????? Portlet=ps.getAttribute("PortletSession.PS"PortletSession.PORTLET_SCOPE).

          toString();

          }

          以上代碼根據需要取得不同Scope范圍的Session對象值。

          同一個應用下,可以直接通過ServletSession取得PortletSession.APPLICATION_SCOPE范圍下的Session對象值。

          HttpSession se = request.getSession();

          if(se.getAttribute("PortletSession.AS")!=null){

          ?????? app=se.getAttribute("PortletSession.AS");

          }

          3.3.5? Preference對象

          Preference對象被設計用來實現用戶的個性化設置,可以幫助用戶對Portlet進行符合用戶需求的顯示定制和行為定制,可以替代部分的數據庫功能。需要指出的是,Preference對象只是用來存取簡單的配置信息,并不能完全替代數據庫應用。
          圖3.3.5-1.jpg

          Preference對象對于配置信息采用鍵-值的形式存取,用戶可以將需要的信息暫時保存在Preference中。

          PortletPreference p= req.getPortletPreferences();

          p.setValue("educhina.username""educhina");

          p.store();

          ?????? Preference對象用來存取用戶的個性化信息,所以不同用戶的Preference對象不能共享,這點跟Session不同。

          可以在Portlet.xml中配置Preference信息,如下:

          ?

          ??? educhinausername

          ??? educhina

          ??? true

          ?


          另外,還可以配套使用PreferencesValidator對象,對PortletPreference在存儲之前進行驗證,以確保Preference的正確性。

          具體規范可以參照http://java.sun.com/xml/ns/Portlet/Portlet-app_1_0.xsd 部分。

          posted on 2005-10-21 09:17 eamoi 閱讀(6047) 評論(2)  編輯  收藏 所屬分類: Java

          評論:
          # re: 【原創】Liferay Portal二次開發指南(9) 2006-01-13 15:54 | kelo
          麻煩問一下,您用的開發工具是什么?如是eclipse的話有插件嗎?能否介紹一下環境的搭建。 bpmopq@163.com  回復  更多評論
            
          # re: 【原創】Liferay Portal二次開發指南(9) 2007-04-19 03:45 | Tong
          the article is very nice. It talked about most important aspects of the JSR 168 portlet. Very useful.  回復  更多評論
            

          進日有臺灣的朋友反映《Ajax開發精要》繁體版源碼無法下載,經核實,繁體版的下載地址正確為:http://www.pcuser.com.tw/download/2AI109/code.zip ,也可以從本站下載:http://www.aygfsteel.com/Files/eamoi/tran-code.zip 。由此給您帶來的不便,還請見諒。

          轉載本站文章,請保留原始鏈接和署名,尊重原作者的勞動成果。

          對Ajax應用有疑問的朋友,可以在“Ajax應用問題匯總”帖中跟帖。建議大家一起研究,促進國內Ajax應用的開展。

          關于Portal的問題,朋友們可以到QQ群13097018咨詢。由于工作關系,我經常不能及時回答問題。還請見諒。

          個人簡介

          工作地點:福建廈門
          研究方向:J2EE、Web系統設計、企業運算
          聯系電郵:eamoi@163.com

          <2005年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(58)

          隨筆分類

          文章分類

          相冊

          收藏夾

          Company

          Java

          Source

          Web

          搜索

          •  

          積分與排名

          • 積分 - 454774
          • 排名 - 116

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 徐州市| 平顶山市| 方正县| 东乌珠穆沁旗| 察哈| 津市市| 崇阳县| 宽甸| 勃利县| 金川县| 馆陶县| 石首市| 灵川县| 宽甸| 和林格尔县| 兴宁市| 子长县| 南平市| 沭阳县| 固始县| 马龙县| 施甸县| 道孚县| 博爱县| 深圳市| 巴彦县| 西乡县| 平果县| 西乌珠穆沁旗| 井冈山市| 达拉特旗| 康乐县| 康定县| 阿拉善右旗| 德阳市| 宝坻区| 宣恩县| 达孜县| 英吉沙县| 丽水市| 信阳市|