<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 閱讀(6043) 評論(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.  回復  更多評論
      
    主站蜘蛛池模板: 中文字幕免费视频精品一| h视频在线观看免费完整版| 亚洲精品乱码久久久久久| 亚洲免费观看网站| 亚洲精品国产高清在线观看| 亚洲精品无码你懂的网站| 日本道免费精品一区二区| 亚洲小视频在线播放| 免费一级毛片不卡不收费| 野花香高清视频在线观看免费| 亚洲第一成年网站大全亚洲| 可以免费观看的一级毛片| 嫩草影院在线播放www免费观看| avtt天堂网手机版亚洲| 亚洲午夜无码片在线观看影院猛| 最新黄色免费网站| 美女被吸屁股免费网站| 亚洲成人黄色在线观看| 亚洲一区二区三区在线播放| 免费在线视频你懂的| 一级成人毛片免费观看| 亚洲国产美女在线观看| 国产亚洲精品自在线观看| 24小时日本在线www免费的| 免费一级不卡毛片| 老外毛片免费视频播放| 亚洲第一成年人网站| 国产亚洲精品精华液| 成人免费无码精品国产电影| 99热这里有免费国产精品| 青青草国产免费国产是公开| 7777久久亚洲中文字幕| 99人中文字幕亚洲区| 国产aⅴ无码专区亚洲av麻豆| 欧洲精品成人免费视频在线观看| 黄网站免费在线观看| 免费无码又爽又黄又刺激网站| 亚洲中文字幕无码亚洲成A人片 | 亚洲国产一二三精品无码| 国产精品另类激情久久久免费| 久视频精品免费观看99|