zoukankan      html  css  js  c++  java
  • 转载如何实现portlet之间的传递参数

    Liferay 6开发学习(三十):跨页面Portlet之间的调用与数据传递

    2014年10月09日 Liferay 评论 2 条 阅读 4,209 views 次

    Portlet之间的通信方法有多种,比如PortletSession,Public Render Parameter,Portlet event等。但是这些方法使用起来都很复杂,像Public Render Parameter和event等,在跨页上就力所不及。

    在很多时候我们要想实现Portlet之间的参数传递和数据共享,我最常用的方法有两个:

    1、通过URL传参:方法,见之前的博客《Liferay中通过URL传参数

    2、使用Portlet URL调用方法,见下文。

    主要应用场景

    Portlet URL调用的方法,主要应用于一个Portlet向另一个Portlet传递参数,或者是提交表单,可以是同一个页面,也可以是不同的页面。

    (Portlet必须被放到页面上才可以使用)

    模拟业务场景

    假设有下面一种业务场景:

    现在有一个新闻系统,有三个页面,A是新闻列表页面/web/guest/home,B是新闻的详情页面/web/guest/newsview,C是新闻的管理页面/group/guest/newsmanager。

    业务逻辑为:

    1、在A页面中,点击新闻的标题进入B页面,在B页面的展现相应的新闻详情。

    2、B页面中,除了有新闻的详情的Portlet外,还有另外的比如新闻点击排行、热门新闻等Portlet。

    3、C页面中是新闻的管理,在管理上有一个新闻的预览按钮,点击后预览新闻的样子,并以弹出层的形式展现,为了复用代码,我们希望在这里点击阅览后,弹出的是B页面中的新闻展现,但是同时又不显示页面中的其他Portlet(点击排行、热门新闻等)。

    实现:

    1、针对第一条我们可以使用,前文件说的URL传参的方法,在新闻列表的a标签中添加为/web/guest/newsview?articleId=xxx。

    2、在B页面上添加新闻展现的Portlet,在此portlet的doView方法里面接收并处理articleId。

    3、但是在新闻管理中,如果我们使用URL传参的方法,就会发现一是没有办法只显示新闻的正文部分(会带着导航和头尾信息),二是没有办法只显示新闻这个Portlet。

    这个时候Portlet URL调用的方法就派上了用场:

    第一步:C的新闻管理portlet页面中导入标签<%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>

    第二步:在页面中写下如下标签:

    1
    2
    3
    <liferay-portlet:renderURL var="viewUrl" plid="<%=viewPlid%>" portletName="newsview_WAR_newsportlet" windowState="pop_up" >
     <liferay-portlet:param name="articelId" value="<%=aritcleId %>"/>
     </liferay-portlet:renderURL>

    我们写下一个如下的标签:

    <liferay-ui:icon image="view" url="${viewUrl}" useDialog="true"/>

    目前就实现了以弹出层的方法来弹出指定的Portlet了,现在来解析一下上面的代码:

    1、liferay-portlet:renderurl标签,是实现调用的为目标Portlet的doview方法,和我们一般使用的portlet:renderUrl相似。里面的参数也类似。

    2、plid为目标portlet所在的页面的id,如果是当前页面的plid可以从themedisplay里面取到,如果是指定页面的,我们可以基于friendlyUrl取到,方法为:

    1
    long?viewPlid?= PortalUtil.getPlidFromFriendlyURL(themeDisplay.getCompanyId(), "/web/guest/newsview");

    3、portletName为目标Portlet的名称,这个名称的规则是固定的,以_WAR_分割,前面是portlet.xml里面的 portletname,后面为当前portlet所在的工程名称,如果news-portlet,这里就是newsportlet,如果是CMS- portlet,这里就是CMSportlet。

    4、windowState="pop_up"是去掉显示的头尾信息。

    5、下面的标签实现的是Liferay自带的一个显示标签,传入地址,加上userDialog="true",就可以让传入的地址以弹出框的形式出现。

    扩展说明

    基于标签

    上面是在一个portlet里面提交内容到另一个Portlet的doview方法里面,如果是指定的方法呢,我们可以使用actionUrl,如下面

    1
    2
    3
    4
    <liferay-portlet:actionURL var="viewUrl" plid="<%=viewPlid%>" name="toView" portletName="newsview_WAR_newsportlet">
        <liferay-portlet:param name="mvcPath" value="/html/newsview/view.jsp"/>
        <liferay-portlet:param name="articelId" value="${news.articleId}"/>
     </liferay-portlet:actionURL>

    上面的代码就是我们将内容提交到了newsview这个Portlet里面的doView方法里面,并加了一个参数articleId,完成之后跳 转到view.jsp页面。整体使用和Portlet的标签是很类似的。我们可以将这个viewUrl地址放到form的action里面,就可以实现在 一个portlet里面将表单提交到另一个Portlet里面的功能。

    基于Java代码

    我们再来看上面的内容,知道最终的viewUrl生成是一个地址串,这个地址串可以使用标签生成,同样的也可以使用Java代码生成,比如:

    PortletURL?viewUrl = PortletURLFactoryUtil.create(renderRequest,portletId, plid, PortletRequest.ACTION_PHASE);

    这个代码和上面的标签是类似的,里面的plid是目标portlet所在的页面ID,portletId,就是上面的portletName的参数值。

    最后一个是类型:PortletRequest.ACTION_PHASE是对应actionURL,PortletRequest.RENDER_PHASE对应RenderUrl。

    如果是要添加参数:

    viewUrl.setParameter("参数名", "参数值");
    viewUrl.setWindowState(LiferayWindowState.POP_UP);

    基于JavaScript

    同样的我们也可以使用JS代码来生成上面的内容,示例如下:

    1
    2
    3
    4
    5
    6
    7
    <aui:script>
    AUI().ready('liferay-portlet-url', function(A){
    var portletURL = new Liferay.PortletURL();
    portletURL.setParameter("key1", "value");
    portletURL.setPortletId("newsview_WAR_newsportlet");
    portletURL.setPlid(viewplid);
    </aui:script>

    转载地址为http://www.huqiwen.com/2014/10/09/liferay-6-study-30-portlet-url-invocation/

  • 相关阅读:
    hihoCoder #1062 : 最近公共祖先·一
    hihoCoder #1050 : 树中的最长路
    hihoCoder #1049 : 后序遍历
    108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树
    107 Binary Tree Level Order Traversal II 二叉树的层次遍历 II
    106 Construct Binary Tree from Inorder and Postorder Traversal 从中序与后序遍历序列构造二叉树
    105 Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树
    104 Maximum Depth of Binary Tree 二叉树的最大深度
    102 Binary Tree Level Order Traversal 二叉树的层次遍历
    101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树
  • 原文地址:https://www.cnblogs.com/airycode/p/4840087.html
Copyright © 2011-2022 走看看