在一個Portlet中鏈接到另一個Portlet

在一個Portlet中鏈接到另一個Portlet

這個問題,應該是大部分網站開發人員都希望能解決的問題。典型應用情況:兩欄佈局,左邊是一些鏈接,右邊有一個內容呈現框。當用戶點擊左邊的鏈接的時候,希望在右邊的內容框中顯示內容。
在Portal中,一般我們都會把左右做成不同的Portlet。而Portal似乎沒有提供直接的方法,能夠鏈接到其他Portlet,通常都是在當前Portlet進行顯示。
6.1 Portal的URL格式分析
在一個Portal頁面中,Url的格式如何,它是如何將參數傳給某一個Portlet的。瞭解了這些,對解決這個問題應該有所幫助。
這是一個BBS的Url的例子。
http://localhost:8080/c/portal/layout?p_l_id=PRI.15.2&p_p_id=19&p_p_action=0&p_p_state=maximized&p_p_mode=view&p_p_col_id=column-2&p_p_col_pos=0&p_p_col_count=1&_19_struts_action=%2Fmessage_boards%2Fview&_19_categoryId=1
從這個URL分析來看,主要有以下幾個參數
p_p_id=19 這個主要是描述當前是在操作哪個Portlet
_19_struts_action=%2Fmessage_boards%2Fview
_19_categoryId=1 這兩個是需要傳遞給Portlet的參數。
如果我們能修改這幾個參數,比如,將19換成其他Portlet,應該就可以實現鏈接到另一個Portlet。
一種做法,是將renderResponse. createRenderURL().toString()進行替換,將其中的portletName換成目標Portlet的portletName。方法應該是可行的,但有點麻煩。嘗試找找有沒有更好的方法。
6.2 源代碼分析
還是從源代碼入手,看看Liferay自己是如何處理的。
renderResponse的實現類是com.liferay.portlet.RenderResponseImpl。
 public PortletURL createRenderURL() {
  return createRenderURL(_portletName);
 }
 public PortletURL createRenderURL(String portletName) { 

  return portletURL;
 }
有希望,我們直接調用createRenderURL(String portletName),將Portlet的名字作爲參數傳入,應該就可以實現這個目的了。
但是RenderResponse接口並沒有createRenderURL(String portletName)這個方法,只能做一下強制轉換
PortletURL rowUrl =((com.liferay.portlet.RenderResponseImpl)renderResponse).
createRenderURL(portletName);
rowUrl.setParameter("categoryId", String.valueOf(19));
編寫了一點測試代碼,對此進行了測試。呵呵,搞定。
6.3 幾個實現細節
Portlet有兩種類型,是否可實例化。前述的例子,是不可實例化的Portlet,因此只需要使用其Portlet名字19即可。那對於可以實例化的Portlet呢?經過測試發現,需要把其實例化後的名字作爲參數傳入。
比如一個可實例化的Portlet的名字是56_INSTANCE_95uY。表示其Portlet的名字爲56,實例化之後的名字是56_INSTANCE_95uY。把這個名字作爲參數傳入,即可達到目的。
另一個問題,我們如何將portletName傳遞給Portlet,讓它根據這個參數生成URL?一種做法就是編寫Portlet的PortletPreference,在裏面保存這個參數名。這樣,在不同的頁面,我們都可以很方便的實現我們需要的功能。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章