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

时间: 2024-11-07 02:12:19

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

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

在嵌套vue-router情况下,不同页面之间传递参数可以通过params实现.而params传参分为两种情况: 1.参数在url中显示 首先你要确定自己要传的参数,并在控制路由的文件中的Router中path内添加对应的字段如: { path:'/paramsUrl/:name/:age/:sex', component:paramsUrl} 我要传的参数是姓名,年龄以及性别. 在你要跳转的组件内定义参数,如: stu:{name:'Tom',age:18,sex:'male'} 同时在HTM

android fragement之间互相传递参数

在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种是通过共同的Activity传递.这种方法是在Activity里面添加一个字段.来临时保存要一些值. 其实我开始想的是用SharedPreferences,不过想想太麻烦! 然后翻了一下Fragment的API.找到了另外一个方法来传递.就像Activity一样便捷的实现参数传递程序中的一段代码.是

PB窗体之间进行传递参数

例:A窗口传递给B窗口y A窗口: 定义参数名称并赋值String s_parm  s_parm=username+'%'+password,然后openwithparm(w_main,s_parm),w_main为跳转到的窗口,s_parm为我们传递过来的参数. B窗口: 定义变量String s_username,s_password,s_parm进行接收, s_parm=message.stringparm i_pos=pos(s_parm,'%') s_username=left(s_p

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

在DataList中使用LinkButton按钮(LinkButtonDelete),该按钮用于链接跳转到删除页面.在模板中双击该按钮,跳转到.cs页面.问题是我们如何获得该条信息的ID,如果不知道ID值,我们又怎么知道需要删除的是哪一条信息呢?通过下面的方法就可以了: 在LinkButtonDelete控件中加入属性CommandArgument和CausesValidation,如下:<asp:LinkButton ID="LinkButtonDelete"  Command

action之间重定向传递参数

方法一  <action name="save" class="orderAction" method="save" >    <result name="success" type="redirect">detail.action?oid=${oid}</result>   </action> 方法二 <action name="save&q

JS多个函数之间传递参数问题

JS多个函数之间传递参数的一个重要思想是在页面定义一个隐藏域,当第一个函数请求到数据时候修改隐藏域的值,第二个函数用jQuery的选择器选择页面中隐藏域的值. 比如: 页面中定义一个隐藏的页号. <!-- 隐藏查询条件的页号 --> <input type="hidden" name="currentPage" id="currentPage"> 第一个ajax函数获取页面中的页号: function queryNum(c

Activity之间传递参数

Activity之间的数据传递 1传递简单数据 2传递数据包(Bundle) 3传递值对象 4获取Activity的返回参数 1------传递简单的数据 新建android工程,取名SendArgs,在activity_main.xml文件里添加一个按钮,用于启动另一个Activity,然后新建一个Activity(手动建class再extends Activity的,需要在AndroidManifest.xml文件里添加配置信息,建议直接新建android activity),取名Aty.

QTP多个Action之间传递参数的方法详解

点击打开链接 脚本的朋友们都会碰到多个Action之间传递参数的问题,想当年我也是研究了好久才成功的,网上虽然有很多文章都在讲这个问题,但是大多都是雷同的抄来抄去不能解决实际问题,也有可能是我太笨了吧.下面我们来详细讲一下QTP多个Action之间传递参数的方法. 一.假设Action1调用Action2并且Action1传递参数给Action2 1.Action1的代码及设置 '定义两个变量 Dim strMessA:strMessA = "我是" Dim strMessB:strM

页面与页面之间传递参数

方式一: <jsp:useBean id="userForm" class="com.wgh.UserForm" scope="page"/>在这个类里面set get<jsp:setProperty name="userForm" property="*"/> 输入框<input name="pwd" type="password" i