参考: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:actionURL var="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:actionURL var="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开发的常用的基础知识就这些了。