1. 程式人生 > 實用技巧 >Liferay7.0開發學習(四):MVC Portlet開發詳解

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

liferay中的檔案下載

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開發的常用的基礎知識就這些了。