• 转载如何实现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/

  • 相关阅读:
    selenium测试(Java)-- 键盘事件(七)
    selenium测试(Java)--鼠标事件(六)
    selenium测试(Java)--元素操作(五)
    selenium测试(Java)--浏览器控制(四)
    selenium测试(Java)(三)
    selenium定位方法(java实例)(二)
    selenium测试环境搭建(一)
    HTML5前端(移动端网站)性能优化指南
    dede使用方法----如何调用最新文章,最热文章,友情链接
    dede使用方法---如何调用指定栏目
  • 原文地址:https://www.cnblogs.com/airycode/p/4840087.html
Copyright © 2020-2023  润新知