zoukankan      html  css  js  c++  java
  • 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开发的常用的基础知识就这些了。

  • 相关阅读:
    CountDownLatch、CyclicBarrier、Semaphore的区别
    Java最小堆解决TopK问题
    【转载】缓存穿透,缓存击穿,缓存雪崩解决方案分析
    缓存雪崩问题及处理方案
    memcached 缓存数据库应用实践
    Redis分布式锁的正确实现方式
    JVM垃圾回收--年轻代、年老点和持久代(转)
    策略模式—Java实现(转)
    (转) Redis哨兵的详解
    Hibernate中1+N问题以及解决方法
  • 原文地址:https://www.cnblogs.com/show58/p/13801985.html
Copyright © 2011-2022 走看看