天天看點

Liferay 6.1開發可配置portlet開發一、Portlet是什麼?二、建立一個Portlet三、MVCPortlet的簡單使用一、什麼是可配置portlet可配置portlet的開發方式使用Config模式在view.jsp中使用配置資料

一、Portlet是什麼?

Portlet是基于java的web元件,由portlet容器管理,并由容器處理請求,生産動态内容。Portals使用portlets作為可插拔使用者接口元件,提供資訊系統的表示層。作為利用servlets進行web應用程式設計的下一步,portlets實作了web應用的子產品化和使用者中心化。 portlet規範,即jsr(Java Standardization Request )168/268,是為了實作portal和portlet的互操作。它定義了portlet和portlet容器之間的和約,讓portlet實作個性化、表示和安全的api集。規範還定義了怎樣在portlets應用中打包portlets。(引自百度百科:http://baike.baidu.com/view/58961.htm)

Liferay是portlet規範的實作,對于portlet規範實作的主流産品還有IBM、Oracle等的Portal産品,主流産品的詳細可以參看:http://www.huqiwen.com/2012/06/11/what-is-liferay/ 此篇文章中關于Liferay市場地位處的圖檔。很以很多時候我們将Liferay稱為一個Portal容器,也就是一個提供Portlet運作的環境。

二、建立一個Portlet

1、基于上一節的Study這個portlet工程的基礎。點選Liferay IDE上的liferay工具欄,有三個按鈕,點選中間按鈕,New Liferay Portlet。如下圖,點選下一步。

Liferay 6.1開發可配置portlet開發一、Portlet是什麼?二、建立一個Portlet三、MVCPortlet的簡單使用一、什麼是可配置portlet可配置portlet的開發方式使用Config模式在view.jsp中使用配置資料

Portlet plugin project:這裡選擇要建立的portlet屬于哪個插件工程。

Source folder:類的放置位置,一般預設。

Portlet Class:要建立的Portlet的控制類的名稱,可以将此類看作Struts中的Action類。

Java package:包名。

Superclass:選擇要繼承哪個類。一般預設,也就是MVCPortlet。下面這幾個類的關系如下:MVCPortlet是LiferayPortlet的子類,LiferayPortlet是GenericPortlet的子類。在MVCPortlet中封裝了一些友善開發的方法,是以一般使用MVCPortlet,如果有特殊需求可以使用他們的父類。

2、在此步驟看到的是Portlet的相關資訊,如模式,JSP位置等,此步驟是portlet.xml檔案的可視化編輯,此步驟的所有選項都可以通過編輯portlet.xml完成。點選下一步。

Liferay 6.1開發可配置portlet開發一、Portlet是什麼?二、建立一個Portlet三、MVCPortlet的簡單使用一、什麼是可配置portlet可配置portlet的開發方式使用Config模式在view.jsp中使用配置資料

Porltet Info:這裡顯示的是Porltet的名稱,顯示名稱,标題等。一般預設,不需要修改。

Portlet Modes:這裡是portlet的模式,View、Edit、Help這三種模式,是portlet規範裡面定義的。

Liferay Portlet Modes:看名知義,Liferay Portlet模式。一般預設即可。Portlet預設的三種模式,Liferay認為不能滿足實際的需求,是以又新增了這幾種模式。如果選擇多個模式,就可以在portlet的設定裡面看到,可以通過設定進行切換,友善進行一些特殊需求,如:config可以用來開發可配置Porltet,管理者可以為指定的Portlet定制相關的參數等。

JSP folder:JSP的存放位置,一般預設的命名是html/porltet名稱,一般預設即可。html是相對于docroot的,完整路徑是docroot/html/demo/view.jsp。

Create resource bundle file:綁定資源檔案,主要是國際化。如果想要porltet的名稱是中文的,測必須使用資源檔案,liferay推薦工程中的所有文字描述類的内容都使用資源檔案來定義,這樣友善國際化,也能避免出現一些可能的亂碼問題。這裡先不選,後面詳講國際化。

3、此步驟是Liferay-portlet.xml和liferay-display.xml的可視化編輯。點選完成即可。

Liferay 6.1開發可配置portlet開發一、Portlet是什麼?二、建立一個Portlet三、MVCPortlet的簡單使用一、什麼是可配置portlet可配置portlet的開發方式使用Config模式在view.jsp中使用配置資料

Icon:此portlet的圖示。

Allow mutiple instaces:是否允許在同一個頁面中有多個porltet的執行個體,預設為否。

CSS:目前porltet的自定義CSS。一般預設。

JavaScript:目前portlet自定義JS。一般預設。

CSS classname:目前portlet的命名空間,防止CSS和其他porltet沖突。

Category:目前的portlet,顯示在哪個分類下面,這裡是Liferay-display.xml檔案的可視化編輯。

三、MVCPortlet的簡單使用

可以看到在工程的com.huqiwen.study包下面生成了一個Demo的java檔案,如果隻是讓portlet顯示/html/demo/view.jsp裡面的内容,則不需要在Demo.java檔案裡面添加内容。如果需要讓view.jsp後從台初始化一些資訊,則需要重寫doView文法。view模式顯示時調用doView方法,edite模式顯示時調用doEdite方法,config模式顯示時調用doConfig方法,依此類推。

在此大部分情況下可以将renderRequest當然HttpServletRequest使用。如果要轉換可以通過PortalUtil.getHttpServletResponse(portletResponse)來進行轉換。

可以使用renderRequest.setAttribute(arg0, arg1)方法,在前台頁面通過JSTL等進行取值。

一、什麼是可配置portlet

其實portlet本來就是可以配置的,但我們的開發大部分情況下隻使用view模式,edit和config模式一般沒有使用,對于使用editor和config等模式的portlet,我們可以将他們稱為可配置portlet。通過使用可配置portlet,可以做許多個性化定制。

應用場景:

1、如果在首頁上有展現專題的地方,可以建立一個專題展現的portlet,這個地方要展現的内容為一個圖檔或多個圖檔,點選圖檔可以跳轉相應的連結。但是專題可能需要變化,則這裡可以添加一個config或edit模式來讓管理者通過配置參數來定制。

2、如首頁的新聞欄目,設計時是展現的A欄目,但是實際中使用者可能有變化,需要換成其他欄目,同樣可以通過可配置portlet來滿足。

3、如提供RSS訂閱,我們可以在配置項裡面設定RSS的輸出方法為标題或者是摘要或者是全文,标準可以為atom或者rss2.0等配置。

4、如有一個名額展現,使用者需求為可定制的,使用者A可以選擇柱狀圖、使用者B可以選擇折線圖、使用者C可以選擇餅圖等。

包括但不限于以上場景,需要通過配置來适用不同的情況,為使用者提供可配置選項的地方都可以使用可配置portlet。

可配置portlet的開發方式

可配置portlet的開發方式,我按資料的存儲方式的不同,大概的分為兩種。一種為使用PortletPreferences存儲的,一種為自定義資料表結構存儲的。

使用PortletPreferences存儲的方式為将配置資料以鍵值對的形式存儲于PortletPreferences的相關屬性字段裡面。以portlet的執行個體ID做為識别進行存儲資訊,适用于配置資訊不算太複雜的場景。

如果配置資訊比較複雜,推薦建立相關的資料庫,将配置資訊存儲于資料庫中。本文主要介紹存儲于PortletPreferences中的方法,存儲于資料庫和普通的portlet的資料存儲方法類似。

如果按模式的不同,又可以分為edit、config、help等不同的模式。這些對應于建立portlet時選用的modes的不同而不同,這裡主要介紹config模式。其他模式類似。

使用Config模式

1、需要有一個建立好的portlet。portlet的建立,參考前面的portlet簡述:http://www.huqiwen.com/2012/09/03/liferay-6-1-development-study-3-portlet-explicate/

2、在Liferay-portlet.xml裡面找到此portlet的相關配置,在裡面添加configuration-action-class元素,如下:

<portlet>
 <portlet-name>customjspportlet</portlet-name>
 <icon>/icon.png</icon>
 <configuration-action-class>xx.xxx.xxx.customjspportlet.CustomJspConfigurationAction</configuration-action-class>
 <instanceable>true</instanceable>
 <header-portlet-css>/css/main.css</header-portlet-css>
 <footer-portlet-javascript>
 /js/main.js
 </footer-portlet-javascript>
 <css-class-wrapper>customjspportlet-portlet</css-class-wrapper>
 </portlet>      

3、建立CustomJspConfigurationAction類,此類繼承自DefaultConfigurationAction即可。

4、重寫其中的render方法。如下。

public String render(PortletConfig portletConfig, RenderRequest renderRequest, RenderResponse renderResponse){
String portletId = renderRequest.getParameter("portletResource");
 PortletPreferences preferences = PortletPreferencesFactoryUtil.getPortletSetup(renderRequest, portletId);
renderRequest.setAttribute("customjspConfig_page_title",preferences.getValue("customjspConfig_page_title", StringPool.BLANK));
 renderRequest.setAttribute("customjspConfig_page_link",preferences.getValue("customjspConfig_page_link", StringPool.BLANK));
return "/html/CustomJspPortlet/config.jsp";
}      

這個方法是點選portlet中的配置時進入的方法。在這個方法裡面做以下幾件事情。

1):我們擷取到了目前portlet的PortletPreferences。

2):從PortletPreferences裡面擷取key為customjspConfig_page_title和customjspConfig_page_link的資料,并将他們放到request裡面。

3):告訴Liferay我的配置頁的JSP的路徑是哪個。

5、編寫config.jsp頁面。config.jsp頁面裡面是我們要配置的一此參數資訊,大部分情況下是一個展現的表單。主要内容可以參考如下(從項目中截取的部分代碼,為說明問題已經簡化):

<form action="<liferay-portlet:actionURL portletConfiguration="true" />" name="<portlet:namespace />fm" id="<portlet:namespace />fm" method="post">
<ul>
 <li>
 <span>标題:</span>
 <input tabindex="1"  type="text" name="<portlet:namespace />customjspConfig_page_title" id="<portlet:namespace />customjspConfig_page_title" value="<%=title%>" />
 </li>
 <li>
 <span>連結位址:</span>
 <input id='<portlet:namespace />custom_page_link' name='<portlet:namespace />customjspConfig_page_link' type="text" value="<%=link %>" /> 
 </li>
 <li>
 <input type="button" value="" οnclick="<portlet:namespace />saveConfig()">
 </li>
</ul>
</form>      

這裡的關鍵點為form的action,所有這種模式的可配置portlet的action都可以固定為:<liferay-portlet:actionURL portletConfiguration="true" />。

6、服務端儲存配置資訊的處理。步驟5中的action會進入步驟3建立的配置類的processAction方法。在上面的配置類裡重寫processAction方法。裡面的内容如下:

public void processAction(PortletConfig portletConfig, ActionRequest actionRequest, ActionResponse actionResponse)
 throws Exception {
 String portletResource = ParamUtil.getString(actionRequest, "portletResource");
PortletPreferences preferences = PortletPreferencesFactoryUtil.getPortletSetup(actionRequest, portletResource);
if (Validator.isNotNull(preferences)) {
//從request裡面取資料
 String title = ParamUtil.getString(actionRequest, "customjspConfig_page_title");
 String link = ParamUtil.getString(actionRequest, "customjspConfig_page_link");
//将資料以鍵值對的形式填充到preferences裡面
 preferences.setValue("customjspConfig_page_title", title);
 preferences.setValue("customjspConfig_page_link", link);
//存儲資料到資料庫中,持久化資料
 preferences.store();
 SessionMessages.add(actionRequest, "success");
 }
 super.processAction(portletConfig, actionRequest, actionResponse);
 }      

到這裡已經完成了可配置portlet的配置部分的開發。

在view.jsp中使用配置資料

前面步驟開發的配置資料的目标是為了在view.jsp中使用,在view.jsp中使用可以在view.jsp的action中使用,也可以直接在view.jsp中直接提取,方法為:

PortletPreferences preferences = renderRequest.getPreferences();
 String title = preferences.getValue("customjspConfig_page_title", StringPool.BLANK);
 String link = preferences.getValue("customjspConfig_page_link", StringPool.BLANK);      

通過這樣的方法即可取到前面的配置資訊,取取的資料具體怎麼展現,怎麼使用,根據不同的業務場景有所不同。