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/

转载如何实现portlet之间的传递参数的更多相关文章

  1. 父窗口和iframe子窗口之间相互传递参数和调用函数或方法

    1.父窗口向子窗口传递参数: 可以在url中添加参数:2.html?a=1&b=2&c=3 然后在子页面上可用js解析,提供一个函数: function getQueryStr(sAr ...

  2. Vue:不同页面之间的传递参数--params

    在嵌套vue-router情况下,不同页面之间传递参数可以通过params实现.而params传参分为两种情况: 1.参数在url中显示 首先你要确定自己要传的参数,并在控制路由的文件中的Router ...

  3. angular 1.x 控制器之间互相传递参数

    我们要向前方看齐,基于js引用类型的对象就不记了,所以使用基于事件的方式: angular 中 $on,$emit,$boardcast来实现父控制器和子控制器互相通讯, 其中$on表示事件监听, $ ...

  4. Vue:不同页面之间的传递参数(二)---query

    1) 在router文件下的index.js中,添加相关路径 routes: [ { path: '/', name: 'Hello', component: HelloWorld }, { path ...

  5. PB窗体之间进行传递参数

    例:A窗口传递给B窗口y A窗口: 定义参数名称并赋值String s_parm  s_parm=username+'%'+password,然后openwithparm(w_main,s_parm) ...

  6. [转载]LinkButton跳转页面及传递参数

    在DataList中使用LinkButton按钮(LinkButtonDelete),该按钮用于链接跳转到删除页面.在模板中双击该按钮,跳转到.cs页面.问题是我们如何获得该条信息的ID,如果不知道I ...

  7. js两个页面之间URL传递参数中文乱码

  8. android fragment传递参数_fragment之间传值的两种方法

    在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...

  9. mvc中view与controll之间传递参数时,可以使用url进行传递

    mvc中view与controller之间传递参数时,可以使用url进行传递,但是在url的地址中需要加上“id=123”这样的东西才行. 具体如代码: window.location.href = ...

随机推荐

  1. RunAsDate v1.36 突破软件试用30天的工具

    http://www.nirsoft.net/utils/run_as_date.html RunAsDate v1.36 - Run a program with the specified dat ...

  2. java(2) 面向对象

    1.类的封装 *在定义一个类时,将类中的属性私有化,即使用prviate关键字来修饰,私有属性只能在它所在的类中被访问.为了能让外界访问私有属性,需要提供一些使用public修饰的公有方法,其中包括用 ...

  3. Linux 下Redis集群安装部署及使用详解(在线和离线两种安装+相关错误解决方案)

    一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,其中主要包括在联网的Linux环境和脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网 ...

  4. LeetCode 33 Search in Rotated Sorted Array(循环有序数组中进行查找操作)

    题目链接 :https://leetcode.com/problems/search-in-rotated-sorted-array/?tab=Description   Problem :当前的数组 ...

  5. 第二步 (仅供参考) sencha touch 使用cmd打包apk

    最新版本的cmd可以直接将sencha touch项目打包成本地应用,不过还有很多不足,本文仅供参考 通过sencha app build native命令可以直接将项目打包成本地应用,不过在命令运行 ...

  6. sencha touch list 批量选择扩展(2013-7-29)

    扩展js代码 /* *list多选扩展 */ Ext.define('ux.SimpleList', { alternateClassName: 'simpleList', extend: 'Ext. ...

  7. Node复制文件

    本人开发过程中,经常遇到,要去拷贝模板到当前文件夹,经常要去托文件,为了省事,解决这个问题,写了一个node复制文件. // js/app.js:指定确切的文件名.// js/*.js:某个目录所有后 ...

  8. 在sublime中安装使用TortoiseSVN-sublime使用心得(4)

    通过sublime text 2.0 安装 TortoiseSVN 插件. 和其它插件不同的是,安装成功后,重启sublime text 2.0 ,在Preferences->Package S ...

  9. 背包----Proud merchants

    一件物品p,q,v 分别表示物品的价格,钱少于q时就不能买,和物品的价值 n表示物品数量,m表示初始有的钱 问最多能买多少东西 01背包 注意点是,因为有一个q作为限制条件,所以n件物品不是随意选的了 ...

  10. Python3.6.3中,functools似乎不能用

    用pip install安装时报编码错误: return s.decode(sys.__stdout__.encoding) UnicodeDecodeError: 'utf-8' codec can ...