Liferay7.0開發學習(四):MVC Portlet開發詳解
參考:http://www.huqiwen.com/2016/06/07/liferay-7-study-4-mvc-portlet-development/
本文介紹的是Liferay 7.0開發中的MVC portlet的更詳細的介紹,一個基本的MVC Portlet外掛的建立與部署請參考下面這一篇部落格:
參考:Liferay7.0開發學習(二):建立並部署一個Portlet
此篇部落格的內容是基於上面的程式碼進行的。
我們開發此Portlet時,主要有兩部分組成,
1、後臺的控制類MvcPortletTestmvcportlet,相當於action,用來處理前端頁面的跳轉與引數接收。
2、前端相應的JSP程式碼,用來做前端的介面展示。
為啥稱為MVCPortlet?
這是因為我們寫的控制類繼承自MVCPortlet,MVCPortlet繼承自LiferayPortlet。LiferayPortlet繼承自GenericPortlet,其中的GenericPortlet為Portlet規範裡面定義的介面,Liferay是基於此做一些方便開發的擴充套件,所以我們稱他為MVC Portlet。
在Liferay Portlet開發中我們也可以使用Struts2,SpringMVC等進行開發,我們一般說MVC Portlet時,指的就是我們採用控制類繼承自MVCPortlet的方法。
MVCPortlet控制類配置屬性詳解
我們在此類的最上方看到有如下的註解。
1、com.liferay.portlet.display-category:此處是控制的在Portlet管理處,我們新增Portlet時,Portlet是在哪個分類下顯示的。如下圖所示,我們這裡配置的是在category.sample下面,所以我們點選新增時可以在應用程式的示例下面看到。category.sample是國際化的一個key值,如果我們想自己定義分類,可以修改此值即可。
2、com.liferay.portlet.instanceable:此配置意思是是否允許portlet在同一個頁面上新增多次,預設值是true,我們有些場景下可能只希望同一個Portlet,在同一個頁面只允許新增一次,則將此改為false即可。看上圖portlet前面是一個小圓圈的表示只能新增一次,是九個小方塊的表示可以新增多次。
3、javax.portlet.display-name:顯示名稱,也就是我們上面看到的Portle的名稱。
4、javax.portlet.init-param.template-path,此值預設為“/”,而且也只能是“/”,在MVCPortlet類裡已經限制了,如果不是會報錯。
5、javax.portlet.init-param.view-template=/view.jsp,portlet被拖到Liferay頁面上後預設執行的是哪個JSP,此路徑是相對於META-INF/resource而言,我們可以在此修改相應的JSP路徑和名稱。
6、javax.portlet.resource-bundle=content.Language語言的國際化支援檔案,非必須的。如果要讓portlet支援國際化,則需要。可在Resource/content的目錄裡面建立language_zh_CN.porperties檔案,在裡面寫中文的國際化。此內容後面有部落格詳細說明。
7、javax.portlet.security-role-ref=power-user,user:將portlet部署後,此portlet預設哪些角色有將此portlet新增到頁面的許可權。
注意:此處的配置不只是只有這些,以前版本的portlet.xml、liferay-portlet.xml、liferay-display.xml的配置屬性都已經挪到了這裡,所以如果看到教程說的是對應的配置,在7.0裡面都是新增到此處。
更多的配置可以參考原始碼裡面的類:PortletPropertyValidator
跳轉控制
頁面上的Portlet的執行順序是這樣的。
首頁進入MVCPortlet控制類的doview方法-->然後進入相應的JSP檔案。
如果我們的控制類裡面沒有doview方法,則是執行父類的doview方法,想在JSP展現的時候從資料庫或者是其他地方載入資料,我們一般將內容放在doview方法裡面。
在頁面中提交表單,或者跳轉到其他頁面,都需要使用portlet的標籤。控制跳轉的主要有三個標籤。
<portlet:renderURL>
<portlet:actionURL>
<portlet:resourceURL>
下面逐個介紹:
<portlet:renderURL>
一般是使用下面的標籤。
注意:在進行下面的之前,不要忘了在init.jsp裡面引入相關的標籤。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %> <%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %> <%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %> <%@ taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %> <%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %> <liferay-theme:defineObjects /> <portlet:defineObjects/>
1、進入doview方法。
<portlet:renderURL var="toViewURL"></portlet:renderURL>
其中的var是定義一個變數,也就是URL地址了,可以在JSP的其他地方使用。如form的action裡面。
執行此標籤會進入後臺控制類的doView方法裡面。
2、跳轉到其他頁面。
下面程式碼的邏輯是先進入doview方法,然後跳轉到other.jsp的頁面。
<portlet:renderURL var="toViewURL">
<portlet:param name="mvcPath" value="/other.jsp"/>
</portlet:renderURL>
注意:mvcPath是固定的引數,也可以換為jspPage,但是推薦使用mvcPath,jspPage已經是廢棄引數,雖然目前版本還支援,但不確定在哪個版本中可能就取消了。
<portlet:actionURL>
renderURL的標籤是進入到doview方法,actionURL可以讓我們進入到指定的後臺方法裡面。
1、進入指定方法
比如現在我們提交了一個表單,想儲存到資料庫中,我們呼叫addBook方法。
<portlet:actionURLvar="addURL" name="addBook"></portlet:actionURL>
在後臺的方法我們有幾種寫法:
方法一:
public void addBook(ActionRequest request,ActionResponse response){ }
方法二:
@ProcessAction(name="addBook") public void actionTest(ActionRequest request,ActionResponse response){ }
區別在於方法一直接是寫的對應的名稱,方法二是使用的註解,看自己喜好,無所謂好壞。
2、進入指定的頁面。
上面的方法執行後,還會跳轉到當前頁面,如果想跳轉到指定的頁面,需要新增mvcPath。
如下:
<portlet:actionURLvar="addURL" name="addBook">
<portlet:param name="mvcPath" value="/other.jsp"/>
</portlet:actionURL>
<portlet:resourceURL>
這個是用來做ajax,或者是檔案下載等的,可以參考之前的部落格。
《Liferay 6.1開發學習(十):在Liferay中使用Ajax》
表單資料提交
比如我們在JSP中有如下的程式碼:
<portlet:actionURL var="addURL" name="addBook"> <portlet:param name="jspPage" value="/other.jsp"/> </portlet:actionURL > <form action="${addURL}" method="post"> <input type="text" name="name"> <input type="submit"> </form>
在後臺使用如下程式碼獲取:
String name = ParamUtil.getString(request, "name");
但是我們會發現獲取不值?!
這是因為在liferay 6.2開始,預設必須要加上namespace。如下圖即可。
<input type="text" name="<portlet:namespace/>name">
或者:我們修改配置為不需要名稱空間。
在property裡面新增,加了此配置後,在JSP中加不加namespace,後臺都可以獲取到值。
com.liferay.portlet.requires-namespaced-parameters=false
或者:使用AUI標籤。AUI標籤會自動的新增namesapce。
<aui:form action="${addURL}" method="post"> <aui:input label="name" name="name"/> <aui:button type="submit" value="save"/> </aui:form>
將值傳到JSP
如果在後臺需要將值傳到前臺,使用request.setAttribute。
request.setAttribute("name", name);
在JSP頁面中,可以使用java程式碼
String name = (String)request.getAttribute("name");
或者EL表示式
${name}
MVCPortlet開發的常用的基礎知識就這些了。