Liferay Portlet之间的通信

从我做Liferay到现在,这个问题一直都存在着,直到最近我才算是找到了一个可靠的方案,能够满足各种需求,从我最开始做到现在一共用到了四种方案,从低到高,我们一个一个的讲。


一、通过URL传值
    这个是我在项目中第一次遇到这样的问题,找出的一个方案,原理就是A把B需要的参数加在自已生成的URL后面,然后再把整个页面view一次,B根据取得的参数再做相应的处理,取URL参数代码如下:

	public class CurrentURLUtil {

	public static Log log = LogFactory.getLog(CurrentURLUtil.class);

	public static int contain(String currentURL, String param) {
		return currentURL.indexOf(param);
	}

	public static String getString(String currentURL, String param) {

		try {
			int paramIndex = contain(currentURL, param);

			if (paramIndex == -1) {
				// log.warn("CurrentURL don't contain the parameter that name
				// is:"+param+",and method will return a blank");
				return "";
			} else {
				int afaterParamSperatorIndex = currentURL.indexOf("&", paramIndex+1);

				if (afaterParamSperatorIndex == -1) {
					return currentURL.substring(paramIndex + param.length() + 1);
				} else
					return currentURL.substring(paramIndex + param.length() + 1,
							afaterParamSperatorIndex);
			}
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			return "";
		}
	}
	

	public static String getString(String currentURL, String param, String defaultStr) {
		
		String value = getString(currentURL, param);
		
		if(Validator.isNull(value))
			return defaultStr;
		else
			return value;
		
	}

	public static long getLong(String currentURL, String param) {
		String value = getString(currentURL, param);
		if (null == value || value.trim().equals("")) {
			return 0;
		} else if(Validator.isNumber(value))
			return Long.parseLong(value);
		else
			return 0;
	}

}
 

    这种方法有比较多的缺陷,比如传的参数只能是string,如果是map,list,大数据就不可行了,另外还有一个问题,安全性不高,你无法预料到这个页面上有多少portlet,每个portlet会有多少操作,而每个操作都会产生一个url,会不会出现相同key?出错的机率较高。

二、通过session传值
    这种方式和第一种方式原理都是相同的,只不过要安全一些。A触发一个action,在action里面把自已要处理的工作做完了后,把B需要的东西放在session里面,B在render里面去取这些东西,然后来完成自已的工作,或者就在JSP里面完成这些工作。但是这样就出现了一个问题,你无法知道A先处理完还是B先处理完,解决的这个问题的方法有两个,一个是让B在处理之间等待一段时间,这个时间A一定能把工作完成,另外一个方法是用锁的方式来解决,建一个static map<SessionId, Boolean>,A负责开锁,B负责锁上,两个千万不能搞错,当锁为空或false时,B就去等侍,直到锁打开。但是一定要记得在B处理完成后把锁销毁。这种方式,我也只在项目中用过一次。

三、通过模拟B的PortletURL
    后面两种方式也是我最近半年来才学会的,应该是安全的。先上一段代码是模拟B的PortletURL的关键

private static long _getPlidFromPortletId(HttpServletRequest request, long groupId, 
			boolean isPrivate, String portletId, Entry<String, String>... entry) {
		
		long plid = 0;
		if (entry == null) {
			plid = PortalUtil.getPlidFromPortletId(groupId, isPrivate, portletId);
			if(Validator.isNull(plid))
				plid = Long.valueOf(0);
		} else {
			try {
				List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(groupId, isPrivate, LayoutConstants.TYPE_PORTLET);
				for (Layout layout : layouts) {
					LayoutTypePortlet layoutTypePortlet =
						(LayoutTypePortlet)layout.getLayoutType();

					if (layoutTypePortlet.hasPortletId(portletId)) {
						if (PortalUtil.getScopeGroupId(layout, portletId) == groupId) {
							plid = layout.getPlid();
							
							List<PortletPreferences> list = PortletPreferencesLocalServiceUtil
								.getPortletPreferences(plid, portletId);
							if (Validator.isNotNull(list)) {
								for (PortletPreferences pre : list) {
									
									int i = 0;
									if (entry.length < 1){
										plid = pre.getPlid();
//										_plidCache.put(key, plid);
										return plid;
									}
									
									javax.portlet.PortletPreferences jpre = PortletPreferencesSerializer
											.fromXML(PortalUtil.getCompanyId(request), pre
													.getOwnerId(), pre.getOwnerType(), plid,
													portletId, pre.getPreferences());
									for (; i < entry.length; i++) {
										Entry en = entry[i];
										if (!jpre.getValue(en.getKey().toString(),
												StringPool.BLANK).equals(
												en.getValue().toString()))
											break;
									}
									if (i == entry.length){
										plid = pre.getPlid();
//										_plidCache.put(key, plid);
										return plid;
									}
								}
							}
						}
					}
				}
			} catch (SystemException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return plid;
	}

	public static PortletURL getPortletURL(long groupId, String portletId,
			HttpServletRequest request, Entry<String, String>... entry) {

		long plid = _getPlidFromPortletId(request, groupId, false, portletId, entry);
		return new PortletURLImpl(request, portletId, plid,
				PortletRequest.RENDER_PHASE);
	}
	
	public static PortletURL getPortletURL(long groupId, long plid, String portletId,
			HttpServletRequest request, Entry<String, String>... entry) {
		return new PortletURLImpl(request, portletId, plid,
				PortletRequest.RENDER_PHASE);
	}

      根据上面代码能看出,最关键是要取得plid,如果你两个需要通信的portlet在一个页面上,那就省了大事了,不然你就要去调用_getPlidFromPortletId这个,最后一个参数是为了匹配这个portlet的configartion信息,因为一个网站有十几个页面,可能其中三个页面会有这一个portlet,增加这个参数能提高准确性,但是影响性能。PortletURL得到了,那后面的事就好办了,如果你是A只是为了传信息本身不做任何处理,把参数放到PortletURL里,然后用<a href="<%=PortletURL.toString()%>">就可以了,如果A要做完自已的工作再传,那就以Action里面做完自已的工作,然后sendRedirect到PortletURL.toString()就可以了。这种方式应该是比较安全可靠的,并且我在几个项目中都已经实施过了。注意 :此方案仅能支持B属性<instanceable>false</instanceable>的portlet

四、通过jQuery.ajax异步通信
    这个是最新的一个方案,目前正在进行的项目我用了这个方案,其基本思想是:A后台通知B去工作,然后A前台让B显示工作结果,这个方案比较酷。具体实现如下:


    1.A通过jQuery.ajax去请求B的jsonAction(参照前面Liferay异步提交文章)


    2.然后根据返回结果让B显示处理结果(参照前面Liferay异步刷新文章中的第二种类型)


    注:如果你A也要处理工作,那就让A先处理然后根据结果再调用B的jsonAction,最后让A和B都分别显示各自的工作结果。当然你也可以把A和B要做的工作都放在一个jsonAction里面

liferay跨组件间通信实例 立即下载

相关推荐

Liferay跨页面Portlet之间的调用与数据传递.docx

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

liferay中的portlet之间的通信

1、相互间传递数据,通过事件机制实现。在通信的portlet配置文件中都做一个空间声明,并在portlet类中进行数据处理。 2、A Portlet 中的页面调用B portlet的方法,并将数据显示到B的页面。事例如下: 事例  A  搜索portlet  B 分页显示Portlet ,实现将A搜索结果显示在B的页面。 条件:A、B同在一个页面。 过程:A页面的关键词通过 ajax传输

guijianchou123456的博客 809

最新最全的Portlet 通信过程详解

在 Portal 的开发过程中,Theme 与 portlet 之间的通信,以及 portlet 之间的通信是开发人员常常遇到的问题。通常 Portlet 之间需要能够互相通信,即一个 portlet 的状态发生改变,要通知其他的 portlet,这些收到通知的 Portlet 状态也要做相应的改变。根据 JSR 168 规范,Portlet 由容器管理,它们之间是相互独立的,并不共享 Session 对象。那么如何在 Portlet 之间传递参数呢?在本文中,将根据不同应用场景介绍参数传递的方式。

(一)Liferay-可配置portlet

新建一个portlet修改liferay-portlet.xml,在对应portlet添加一个configuration-action-class标签<configuration-action-class>类名地址</configuration-action-class>新建“类名”并继承DefaultConfigurationActionpublic class 类名 extends Defaul

ITwuyang的博客 1263

mysql 学习笔记(1):mysql 基本概念和 mysql workbench 的基本使用方法

…

qq_52740163的博客 1355

新手自己动手设置3D-slicer中文版(超详细图文)

3DSlicer是一个开源的免费软件,用于医学图像分析(包括配准和交互式分割)和可视化(包括3D渲染)以及用于图像引导治疗研究的软件平台。复制qm文件,粘贴于3D-slicer文件相关文件夹内,\bin\translations\。打开3dslicer,edit菜单下Application Settings,支持的操作系统:Linux,Mac OSX和Windows。本人英语太差,所以第一反应就是中文版,官网无中文版下载,下载后不能直接使用,必须要发布成qm文件;qm文件已经生成,位于ts文件同一文件夹。

linjianping513的博客 9854

[Liferay]Portlet 之间使用 PortletSession 进行通信

Portlet 之间通信有三种方式: 1. PortletSession 2. IPC 3. Cookies 现在有个需要解决的问题,怎么使用 Portlet A 在满足一定条件的情况下,穿参数给 Portlet B,通过该参数改变 Portlet B 的状态。 原本打算使用 IPC, 因为上述三个方法中就属 IPC 概念最通俗易懂操作简单。 但是 IPC 事件的周期首先需要

Paranoid_Android的专栏 1525

555时基芯片的5种经典电路设计:从方波发生器到PWM调光实战

本文深入解析了555时基芯片的5种经典电路设计,从基础的无稳态方波发生器、单稳态触发器,到实用的占空比可调PWM信号源,并重点介绍了如何引入TVS保护电路增强系统鲁棒性。最后通过一个带保护的PWM LED调光台灯实战项目,综合展示了信号生成、功率驱动与电路保护的核心技术,是电子爱好者掌握模拟电路设计与应用的绝佳指南。

weixin_29207439的博客 491

liferay portlet之间的通信

从我做Liferay到现在,这个问题一直都存在着,直到最近我才算是找到了一个可靠的方案,能够满足各种需求,从我最开始做到现在一共用到了四种方案,从低到高,我们一个一个的讲。 [b]一、通过URL传值[/b] 这个是我在项目中第一次遇到这样的问题,找出的一个方案,原理就是A把B需要的参数加在自已生成的URL后面,然后再把整个页面view一次,B根据取得的参数再做相应的处理,取UR...

战斗机 197

解决com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60027, active 20, maxActive 20错误

全网详细解决com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60027, active 20, maxActive 20, creating 0, createErrorCount 24的错误

念兮为美 417

成功解决AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

​ 成功解决AttributeError: 'ImageDraw' object has no attribute 'textsize' 目录 解决问题 解决思路 解决方法 解决问题 AttributeError: 'ImageDraw' object has no attribute 'textsize' 解决思路 属性错误:'ImageDraw'对象没有属性'textsize' 解决方法 最新的Pillow 10.0.0 版本已经删除了这个函数,导致两个库(Pillow 、wordc

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 4780

转文:liferay portlet之间的通信

7月没写什么玩意,转文过了充数!!!Liferay Portlet之间的通信 关键字: liferay portlet之间的通信 本文来自:http://tyler-zhou.javaeye.com/blog/506707从我做Liferay到现在,这个问题一直都存在着,直到最近我才算是 找到了一个可靠的方案,能够满足各种需求,从我最开始做到现在一共用到了四种方案,从低到高,我们一个一个的讲。一、通过URL传值     这个是我在项目中第一次遇到这样的

步行者的专栏 1705

静态编译Qt5源码(Kylin-Desktop-V10-SP1-2203-LoongArch64+qt5.15.16)

之前的文档,记录的是通用情况,本次笔者记录下Qt5的静态编译过程,供有需要的小伙伴参考使用的操作系统是Kylin-Desktop-V10-SP1-General-Release-2203-LoongArch64,处理器是龙芯3A5000,架构是loongarch。

aggs1990的专栏 1402

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

Portlet之间的通信方法有多种,比如PortletSession,PublicRenderParameter,Portletevent等。但是这些方法使用起来都很复杂,像PublicRenderParameter和event等,在跨页上就力所不及。 在很多时候我们要想实现...

328

SAP Fiori 从技术上而言到底包含哪些组件?

SAP Fiori是企业级UX设计的系统化解决方案,基于五大原则构建:角色导向(Role-based)、自适应(Adaptive)、简洁(Simple)、一致(Coherent)和愉悦(Delightful)。其技术实现包含SAPUI5开发框架、Fiori Launchpad统一入口、OData服务网关等核心组件,通过标准化设计模式与开发工具链,显著提升企业应用的用户体验和开发效率。典型案例显示,遵循Fiori原则可缩短30%以上的操作时长,降低50%的培训成本。该体系既保持跨设备一致性,又支持业务场景的深

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 223

【AI大模型:前沿】41、建筑行业大模型创业全指南:从技术突破到成本控制与落地路径

建筑行业大模型是“高门槛、高回报”的长周期赛道,适合有建筑行业资源+AI技术背景的团队切入。数据是基础,场景切割是策略,合规是底线。通过聚焦“设计生成+规范审查”等刚需场景,用“仿真数据+开源模型”降低成本,3-5年内有望成长为行业独角兽。对于中小团队,避开千万级全流程模型的红海,深耕“小而美”的单点工具,同样能实现盈利与快速扩张。关键成功公式建筑AI创业 = 50%数据壁垒构建 + 30%场景精准切入 + 20%成本控制能力。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2114

Liferay中的Portlet事件通信

Liferay中的Portlet事件通信在有的项目开发中是需要实现的一种机制。 下面转自http://liferaycms.blogspot.com/2011/07/inter-portlet-communication.html Inter portlet commun

步行者的专栏 2304

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Liferay7 BPM门户开发之33: Portlet之间通信的3种方式(session、IPC Render Parameter、IPC Event、Cookies)...

  文章介绍了5种方式,4种是比较常用的: Portlet session IPC Public Render Parameters IPC Event Cookies 参考地址: https://web.liferay.com/zh/community/wiki/-/wiki/Main/Portlet%E9%97%B4%E7%9A%84%E9%80%9A%E4%BF%A1   方式1:Ses...

weixin_33751566的博客 118

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

liferay中portlet与portlet之间通

新建两个portlet类; 在test001类用于提交数据

迷失的键盘 651

portlet之间的通信

      fetion为portlet的名字   这样就可以直接访问名字为 fetion 的 portlet 了,还可以传参数

java_min的专栏 565

【liferay】5、使用PortletURL进行跨portlet通信 liferay6.2

【问题】 1、当我们一个页面存在多一个portlet的时候,如在不同的portlet之间传参? 【解决办法】 1、在liferay官方有几种方式,比较复杂麻烦,不是太实用,这里不再赘述。 2、通过friendlyurl后缀中用?param1=111的方式可以传参,但是如果我们把友好url修改了,也需要修改代码,不是很方便 3、那么还有一种方式,我们可以使用Portlet...

weixin_30426957的博客 315

Liferay 6.1开发学习(十四):在自己的Portlet中使用Liferay的全文检索【转】

一、建立索引类 继承BaseIndexer类,编写一个索引类,如叫做CmsArticleIndexer。重写里面的相关搜索方法。一般需要重写 getClassNames getSummary doDelete doGetDocument doRei...

223

Liferay Portal(五)各Portlet之间传递参数

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34212762的博客 168
上一篇: Liferay异步提交
下一篇: Liferay 权限策略
iteye_4621
博客等级 码龄8年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值