壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 599|回复: 0

portalet之间的通信

[复制链接]
发表于 2010/6/1 10:53:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

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

这种方法有比较多的缺陷,比如传的参数只能是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;   
  •                                         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);   
  •     }  
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;

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里面

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 17:30 , Processed in 0.015455 second(s), 15 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表