- 浏览: 216983 次
- 性别:
- 来自: 湖北->上海
最新评论
-
苹果超人:
我也遇到这个问题,我想在ConfigurationAction ...
杀千刀的PortletPreferences -
flago:
Liferay 的论坛设置的默认显示多少条帖子怎么设置??
liferay中vm中如何调用java类代码 -
ofdata:
遭遇此问题
杀千刀的PortletPreferences -
yaokaiwen99:
大哥求一个简单的flexigrid在liferay中应用的例 ...
Liferay异步提交 -
gaigai511225:
你好 插件环境那个url 具体怎么写 我照您的方式写了出错 ...
Liferay异步提交
从我做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里面
评论
是因为只用JSR168的原因吗?
liferay的资源很少,这篇不错,IPC
发表评论
-
JSR 286 Portlet 的新特性,第 3 部分: Portlet 过滤器和 Portlet 窗口
2010-06-01 10:24 2488在 本系列 的 第 1 部分 简要回顾了JSR 1 ... -
JSR 286 Portlet 的新特性,第 2 部分: 资源服务、事件与共享呈现参数
2010-05-31 18:42 2201在本系列的 第 1 部分 简要回顾了 J ... -
JSR 286 Portlet 的新特性,第 1 部分: Portlet 2.0 新特性介绍
2010-05-31 17:55 2379本系列文章专门针 ... -
Session share
2010-05-14 12:18 0Tomcat Server.xml <Servi ... -
Liferay集群负载均衡配置
2009-10-30 11:14 4882先介绍一下项目系统的环境, Liferay Version: ... -
Liferay 集群部署
2009-10-30 00:00 0十二点了,明天断续 -
Liferay 权限策略
2009-10-29 23:45 3094先上一张大家都很熟悉的图 这张图可以说是整 ... -
Liferay异步提交
2009-10-29 18:06 3396liferay的异步提交其实是非常简单的,他用的是json & ... -
Liferay异步刷新
2009-10-29 18:05 3171Liferay portlet异步刷新,分为两种情况。 ... -
准备开始整理半年来对lifeay新的学习成果
2009-10-29 18:04 1491有半年没有写过liferay的blog了,不过对life ... -
Ajax知识
2009-06-11 17:50 0<SCRIPT LANGUAGE=" ... -
改变Liferay Portal Context(让Liferay不在使用ROOT目录)
2009-05-25 22:46 1823在部署的时候如果遇到我们会遇到让liferay与其他的项目并存 ... -
velocity调用DB持久层,生成actionurl
2009-05-22 17:42 1173#set($hostelCacheService = $ser ... -
liferay 所有版本下载地址
2009-05-21 13:29 3206从1.7.5一直到现在的5.2.3,应有尽有。 htt ... -
liferay ldap配置与相关代码
2008-11-28 11:06 38221.下载LDAP server 并安装, liferay支 ... -
liferay 的加密技术(CRYPT,SHA,SSHA,MD2,MD5)
2008-11-27 15:59 4285package com.liferay.util; impo ... -
liferay openid配置与代码详解
2008-11-21 21:14 28241.liferay的openid的配置很简单的,先去 open ... -
liferay验证码认证
2008-08-27 15:26 2733生成验证码相关: /** * Copyright (c ... -
很烦,想站在阳台上大声的喊
2008-08-20 19:42 1794终于到回家了,好累, ... -
网络爬虫相关(自已记下来,怕以后忘记)
2008-08-16 13:15 1925package com.taobao.html; impor ...
相关推荐
Liferay Portlet工程示例代码提供了开发者们一个深入理解并实践Liferay Portal平台上的portlet开发的宝贵资源。Liferay Portal是一款开源的企业级门户系统,它允许用户创建、管理和集成各种Web应用程序,而portlet...
综上所述,"Liferay Portlet 站内消息组件"是一个基于JSP的portlet,它的主要职责是提供站内通信功能,使得Liferay用户能够在同一平台上进行有效的交流。通过对消息的发送、接收、回复和管理,它增强了Liferay的社区...
最后,书中可能还会包含一些高级话题,如Portlet的缓存策略、portlet间通信的高级技巧、portlet的性能优化以及如何发布和部署Portlet到Liferay Portal Server。 总之,《Liferay Portlet开发参考手册》是一本全面且...
总结来说,Liferay的Portlet通信和数据传递是一个涉及多个层面的问题,需要根据具体业务场景灵活运用各种机制。通过理解PortletSession、Public Render Parameters、Portlet事件以及Portlet URL调用的工作原理,...
- **Portlet间通信**:通过JSR-286的`PortletSession`或Liferay的`Event`机制,实现不同Portlet间的协作。 - **RESTful服务**:创建Portlet API,以JSON或其他格式暴露数据,供其他应用或Portlets调用。 总之,理解...
7. **Portlet间通信(Portlet-to-Portlet Communication, PTC)**:Liferay支持portlet之间的直接通信,如通过ActionRequest或RenderRequest发送消息。`test-portlet`可以使用portlet action URL或render URL来与另...
本文将深入探讨"Liferay IPC(Inter-Portlet Communication)portlet间通信DEMO",并基于提供的`portlet.xml`文件来解析相关的配置信息。 1. **Liferay IPC简介** Liferay IPC机制使得不同的portlet能够共享数据和...
例如portlet生命周期、portlet渲染机制、portlet间通信(JSR-286的ResourceRequest和ResourceResponse)、portlet的缓存策略、portlet的国际化处理、portlet的安全性设置,以及如何使用Liferay的工作流API等。...
Portlet之间的通信--- Liferay 内部Portlet通信-Liferay中的示例Portlet 示例:从Portlet A输入标题,并使用Portlet B在同一页面上显示标题。
4. **开发或配置portlet**:在Liferay中创建或安装一个portlet,这个portlet可以与Alfresco通信,展示和处理Alfresco的内容。 5. **工作流集成**:如果需要,可以通过Alfresco的API或者使用预定义的工作流程模板,...
这在需要协同工作的portlet之间尤其有用。 - 用户与portlet的交互,如点击按钮,会触发动作请求,开发者可以在Portlet的`processAction()`方法中处理这些请求。 5. **Liferay服务API**: - Liferay提供了丰富的...
Liferay的portlet通信机制,如Portlet渲染模式和事件处理,也是开发过程中需要掌握的关键点。 总之,深入研究Liferay Portal涉及到理解Portlet的部署、配置、开发,以及如何在不同环境下适应性部署。掌握这些知识,...
例如,获取或更新用户信息,或者处理其他portlet间的通信。 在portlet的JSP页面中,可以使用Struts2的标签库来渲染视图。例如,`<s:form>`用于创建表单,`<s:textfield>`用于显示输入字段,`<s:submit>`用于提交...
机器人 Liferay Portlet 集成了 IBM Watson 和 Respoke,以在门户框架上创建下一代统一通信。 不仅仅是统一通信,IBM Watson 还可以通过问答的方式提供友好的认知服务。
3. **portlet间通信**:了解如何通过Portlet Messaging或Portal Eventing实现portlet间的协作。 4. **主题和布局**:掌握如何自定义portlet的主题,使其与Liferay门户的外观和感觉保持一致。 5. **权限管理**:...
4. **portlet通信**:portlet之间的通信可以通过多种方式实现,如公共渲染参数(Public Render Parameters)、portlet间通信API(Portlet Inter-Portlet Communication, IPC)或者通过JavaScript。IPC允许portlet...
文档中将详细介绍portlet生命周期、渲染、事件处理以及portlet与portlet之间的通信。 3. **Liferay Portal 配置** Liferay Portal的配置涉及到多个层次,包括服务器级别的配置、portlet部署配置以及应用级别的设置...
6. **Event and Subscription API**: 事件和订阅API允许portlet之间进行通信。一个portlet可以发布事件,其他portlet则可以订阅并响应这些事件,实现协同功能。 7. **User and Group API**: 用户和组API用于管理...
2. **portlet开发**:学习如何使用Java和Maven创建portlet,以及如何处理portlet间通信。 3. **主题定制**:掌握CSS、HTML和FreeMarker模板语言,为Liferay创建独特的外观。 4. **服务构建**:了解Liferay的服务...
Liferay是一个基于Java Enterprise Edition (J2EE) 的应用,它整合了多种技术,如EJB (Enterprise JavaBeans) 和JMS (Java Message Service),用于后台处理和通信。在前端,Liferay采用了Struts MVC框架,增强了用户...