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: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

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开发的常用的基础知识就这些了。

posted @ 2020-10-12 12:16  溶洞  阅读(381)  评论(0编辑  收藏  举报