温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

liferay与portlet之间如何通信

发布时间:2021-12-27 13:54:16 来源:亿速云 阅读:139 作者:小新 栏目:编程语言

这篇文章主要介绍了liferay与portlet之间如何通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、通过URL传值

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

Java代码

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,A负责开锁,B负责锁上,两个千万不能搞错,当锁为空或false时,B就去等侍,直到锁打开。但是一定要记得在B处理完成后把锁销毁。这种方式,我也只在项目中用过一次。

三、通过模拟B的PortletURL

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

Java代码

private static long _getPlidFromPortletId(HttpServletRequest request, long groupId,                  boolean isPrivate, String portletId, Entry... entry) {                          long plid = 0;             if (entry == null) {                 plid = PortalUtil.getPlidFromPortletId(groupId, isPrivate, portletId);                 if(Validator.isNull(plid))                     plid = Long.valueOf(0);             } else {                 try {                     List 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 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... 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... entry) {             return new PortletURLImpl(request, portletId, plid,                     PortletRequest.RENDER_PHASE);         }

根据上面代码能看出,最关键是要取得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里面

感谢你能够认真阅读完这篇文章,希望小编分享的“liferay与portlet之间如何通信”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI