隨筆-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 request,ActionResponse response) render(RenderRequest request,RenderResponse response),分別用以處理Action RequestRender Request。某種意義上來講,render方法類似Servlet中的service方法,doView,doEdit,doHelp方法又類似doGet,doPost方法。
          圖3.3.1–1.jpg圖3.3.1–2.jpg圖3.3.1-3.jpg

          、RenderRequestActionRequest

          PortletRequest分為RenderRequestActionRequest兩種,分別由renderURLactionURL來觸發。renderURLactionURL的一種優化。Portlet的開發過程中盡量使用renderURL而避免actionURL。actionURL適用于有確實的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 req,ActionResponse 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信息,如下:

          ?

          ??? educhina。username

          ??? 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 閱讀(6050) 評論(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.  回復  更多評論
            
          主站蜘蛛池模板: 马鞍山市| 宝应县| 开化县| 阳山县| 乌兰浩特市| 弥渡县| 宁武县| 宜黄县| 武威市| 庆城县| 集贤县| 万盛区| 沙雅县| 新乐市| 菏泽市| 阿拉善左旗| 民县| 勐海县| 长葛市| 霍州市| 乌兰察布市| 太康县| 信宜市| 曲靖市| 清涧县| 璧山县| 绍兴县| 蒙城县| 万安县| 攀枝花市| 二手房| 岑溪市| 章丘市| 呼和浩特市| 扬中市| 合山市| 南陵县| 昔阳县| 巴林右旗| 两当县| 玛纳斯县|