第三節 ?Portal的對象
JSR168給Portal定義了幾個特別的對象,用來操作Portal特有的信息。這些對象跟Servlet的對象有點類似,又有點不同。這些對象都封裝在{PORTAL_HOME}/common/lib/ext/portlet.jar包中,具體支持實現要視Portal服務器而定。
3.3.1? Request對象
Portlet中的Request與Servlet的Request一樣接受客戶端發送的請求,但是與Servlet不同,Portlet的Request分為Action Request及Render Request兩種類型,因此Portlet接口中定義了兩種方法用來處理不同的Request。分別是processAction(ActionRequest request,ActionResponse response) 和render(RenderRequest request,RenderResponse response),分別用以處理Action Request和Render Request。某種意義上來講,render方法類似Servlet中的service方法,doView,doEdit,doHelp方法又類似doGet,doPost方法。



①、RenderRequest和ActionRequest
PortletRequest分為RenderRequest和ActionRequest兩種,分別由renderURL和actionURL來觸發。renderURL是actionURL的一種優化。Portlet的開發過程中盡量使用renderURL而避免actionURL。actionURL適用于有確實的Action(行為)的情況下。比如說,表單form提交后Persistent狀態的改變、session的改變、perference的修改等等。renderURL通常用來處理Portlet的導航。舉個例子:
使用actionURL:
<%
PortletURL pu = renderResponse.createActionURL();
pu.setParameter("ACTION","LOGIN");
%>
說明:表單提交最好使用Post方法而不是Get方法,因為某些Portal服務器可能會將內部狀態編碼到URL的Query字符串中。
使用renderURL:
<%
PortletURL pu=renderResponse.createRenderURL();
Pu.setParameter("PAGE",Number);
%>
下一頁
②、renderURL和actionURL的處理方式
當客戶端請求是由一個renderURL觸發的時候,Portal服務器會調用該Portal頁面所有Portlet的render方法。
而當客戶端請求是由一個actionURL觸發的時候,Portal服務器會先按用該頁面所有Portlet的processAction方法再調用render方法。所以,要明確自己到底使用那種URL來出發客戶端請求。
③、RenderRequest和ActionRequest的parameter參數作用范圍
當客戶端請求由一個actionRequest觸發時,所有parameter參數的取得都必須在processAction方法中進行。比如:
public void processAction(ActionRequest req,ActionResponse res){
?????? String str = req.getParameter("ACTION");
?????? //response.setRenderParameter("ACTION",action);
}
?
public void doView(ActionRequest req,ActionResponse res){
?????? String str = req.getParameter("ACTION");
}
如上processAction方法中,getParameter方法將能成功得到表單中的參數ACTION所對應的值,因為我們知道,當目標Portlet的processAction方法運行完后,Portlet Container將調用Portal頁面中所有Portlet的render方法.但是實際上doView方法中使用getParameter不會得到任何值.但是如果把processAction方法中注釋了的一行解除注釋的話,你就可以在doView方法中的得到參數ACTION對應的值. 這說明action request的參數,render方法中不可以直接取到.必須使用了setRenderParameter方法,再次傳遞一次.
3.3.2? Response對象
與Request對象一樣,Response對象也有兩種:RenderResponse和ActionResponse,分別用來封裝對應的RenderRequest和ActionRequest的返回信息,比如重定向、窗口狀態、Portlet模式等。他們兩者的父類PortletResponse擁有serPorperty和getPorperty兩個方法,用來傳遞信息給Portal容器。



ActionResponse主要用來處理以下功能:
a、? 重定向
b、? 改變窗口狀態、Portlet模式
c、? 傳遞parameter參數到RenderRequest中去
RenderResponse主要用來提供以下功能:
a、? 設置ContentType
b、? 得到OutputStream和Writer對象,用來輸出頁面內容
c、? Buffering緩沖
d、? 設定Portlet的標題,但是必須在Portlet輸出前調用,否則將被忽略
3.3.3? PortletConfig對象
和ServletConfig對象類似,PortletConfig對象提供對Portlet初始化信息以及PortletContext對象存取的方法。
和ServletConfig對象不同的是,PortletConfig對象提供對Portlet的標題等資源的I18N支持,可以通過設定不同的Resource Bundle文件以提供多種語言支持。
3.3.4? Session對象
由于容器不同,Portal的Session對象與Servlet的Session對象略有不同。
由于Portlet處于Portal服務器的緣故,Portlet的Session分為Application Scope和Portlet Scope。兩者的區別在于:
①、Application Scope范圍的Session中保存的對象,對于同一個Portlet應用范圍內的所有Portlet都是可用的。
②、Portlet Scope范圍的Session中保存的對象,只對本Portlet可用,其他Portlet即使在同一個應用中,也不可用。

但是對于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對象只是用來存取簡單的配置信息,并不能完全替代數據庫應用。

Preference對象對于配置信息采用鍵-值的形式存取,用戶可以將需要的信息暫時保存在Preference中。
PortletPreference p= req.getPortletPreferences();
p.setValue("educhina.username","educhina");
p.store();
?????? Preference對象用來存取用戶的個性化信息,所以不同用戶的Preference對象不能共享,這點跟Session不同。
可以在Portlet.xml中配置Preference信息,如下:
?
??? educhina。username
??? educhina
??? true
?
另外,還可以配套使用PreferencesValidator對象,對Portlet的Preference在存儲之前進行驗證,以確保Preference的正確性。
具體規范可以參照http://java.sun.com/xml/ns/Portlet/Portlet-app_1_0.xsd 的部分。
posted on 2005-10-21 09:17
eamoi 閱讀(6043)
評論(2) 編輯 收藏 所屬分類:
Java