liferay与portlet之间的通信

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

我们提供的服务有:网站制作、成都网站建设、微信公众号开发、网站优化、网站认证、荷塘ssl等。为近1000家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的荷塘网站制作公司

一、通过URL传值

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

Java代码

 
 
 
  1. public class CurrentURLUtil {     
  2.     
  3. public static Log log = LogFactory.getLog(CurrentURLUtil.class);     
  4.     
  5. public static int contain(String currentURL, String param) {     
  6.     return currentURL.indexOf(param);     
  7. }     
  8.     
  9. public static String getString(String currentURL, String param) {     
  10.     
  11.     try {     
  12.         int paramIndex = contain(currentURL, param);     
  13.     
  14.         if (paramIndex == -1) {     
  15.             // log.warn("CurrentURL don't contain the parameter that name     
  16.             // is:"+param+",and method will return a blank");     
  17.             return "";     
  18.         } else {     
  19.             int afaterParamSperatorIndex = currentURL.indexOf("&", paramIndex+1);     
  20.     
  21.             if (afaterParamSperatorIndex == -1) {     
  22.                 return currentURL.substring(paramIndex + param.length() + 1);     
  23.             } else    
  24.                 return currentURL.substring(paramIndex + param.length() + 1,     
  25.                         afaterParamSperatorIndex);     
  26.         }     
  27.     } catch (RuntimeException e) {     
  28.         // TODO Auto-generated catch block     
  29.         return "";     
  30.     }     
  31. }     
  32.     
  33.     
  34. public static String getString(String currentURL, String param, String defaultStr) {     
  35.          
  36.     String value = getString(currentURL, param);     
  37.          
  38.     if(Validator.isNull(value))     
  39.         return defaultStr;     
  40.     else    
  41.         return value;     
  42.          
  43. }     
  44.     
  45. public static long getLong(String currentURL, String param) {     
  46.     String value = getString(currentURL, param);     
  47.     if (null == value || value.trim().equals("")) {     
  48.         return 0;     
  49.     } else if(Validator.isNumber(value))     
  50.         return Long.parseLong(value);     
  51.     else    
  52.         return 0;     
  53. }    

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

二、通过session传值

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

三、通过模拟B的PortletURL

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

Java代码

 
 
 
  1. private static long _getPlidFromPortletId(HttpServletRequest request, long groupId,      
  2.             boolean isPrivate, String portletId, Entry ... entry) {     
  3.              
  4.         long plid = 0;     
  5.         if (entry == null) {     
  6.             plid = PortalUtil.getPlidFromPortletId(groupId, isPrivate, portletId);     
  7.             if(Validator.isNull(plid))     
  8.                 plid = Long.valueOf(0);     
  9.         } else {     
  10.             try {     
  11.                 List  layouts = LayoutLocalServiceUtil.getLayouts(groupId, isPrivate, LayoutConstants.TYPE_PORTLET);     
  12.                 for (Layout layout : layouts) {     
  13.                     LayoutTypePortlet layoutTypePortlet =     
  14.                         (LayoutTypePortlet)layout.getLayoutType();     
  15.     
  16.                     if (layoutTypePortlet.hasPortletId(portletId)) {     
  17.                         if (PortalUtil.getScopeGroupId(layout, portletId) == groupId) {     
  18.                             plid = layout.getPlid();     
  19.                                  
  20.                             List  list = PortletPreferencesLocalServiceUtil     
  21.                                 .getPortletPreferences(plid, portletId);     
  22.                             if (Validator.isNotNull(list)) {     
  23.                                 for (PortletPreferences pre : list) {     
  24.                                          
  25.                                     int i = 0;     
  26.                                     if (entry.length < 1){     
  27.                                         plid = pre.getPlid();     
  28. //                                      _plidCache.put(key, plid);     
  29.                                         return plid;     
  30.                                     }     
  31.                                          
  32.                                     javax.portlet.PortletPreferences jpre = PortletPreferencesSerializer     
  33.                                             .fromXML(PortalUtil.getCompanyId(request), pre     
  34.                                                     .getOwnerId(), pre.getOwnerType(), plid,     
  35.                                                     portletId, pre.getPreferences());     
  36.                                     for (; i < entry.length; i++) {     
  37.                                         Entry en = entry[i];     
  38.                                         if (!jpre.getValue(en.getKey().toString(),     
  39.                                                 StringPool.BLANK).equals(     
  40.                                                 en.getValue().toString()))     
  41.                                             break;     
  42.                                     }     
  43.                                     if (i == entry.length){     
  44.                                         plid = pre.getPlid();     
  45. //                                      _plidCache.put(key, plid);     
  46.                                         return plid;     
  47.                                     }     
  48.                                 }     
  49.                             }     
  50.                         }     
  51.                     }     
  52.                 }     
  53.             } catch (SystemException e) {     
  54.                 // TODO Auto-generated catch block     
  55.                 e.printStackTrace();     
  56.             }     
  57.         }     
  58.         return plid;     
  59.     }     
  60.     
  61.     public static PortletURL getPortletURL(long groupId, String portletId,     
  62.             HttpServletRequest request, Entry ... entry) {     
  63.     
  64.         long plid = _getPlidFromPortletId(request, groupId, false, portletId, entry);     
  65.         return new PortletURLImpl(request, portletId, plid,     
  66.                 PortletRequest.RENDER_PHASE);     
  67.     }     
  68.          
  69.     public static PortletURL getPortletURL(long groupId, long plid, String portletId,     
  70.             HttpServletRequest request, Entry ... entry) {     
  71.         return new PortletURLImpl(request, portletId, plid,     
  72.                 PortletRequest.RENDER_PHASE);     
  73.     }    

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

【编辑推荐】

  1. 在Liferay中使用Hibernate
  2. Liferay Portal中的jBPM配置
  3. 开源Portal工具Liferay Portal 4.0发布
  4. hibernate中update与saveOrUpdate的区别
  5. Hibernate模糊查询参数化的问题

分享文章:liferay与portlet之间的通信
文章来源:http://www.csdahua.cn/qtweb/news46/505896.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网