iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >liferay与portlet之间如何通信
  • 549
分享到

liferay与portlet之间如何通信

2023-06-17 13:06:10 549人浏览 薄情痞子
摘要

这篇文章主要介绍了liferay与portlet之间如何通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、通过URL传值这个是我在项目中***次遇到这样的问题,找出的一个

这篇文章主要介绍了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显示工作结果,这个方案比较酷。具体实现如下:

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

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

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

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

--结束END--

本文标题: liferay与portlet之间如何通信

本文链接: https://www.lsjlt.com/news/289457.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • liferay与portlet之间如何通信
    这篇文章主要介绍了liferay与portlet之间如何通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、通过URL传值这个是我在项目中***次遇到这样的问题,找出的一个...
    99+
    2023-06-17
  • Angular中组件之间如何通信
    本文小编为大家详细介绍“Angular中组件之间如何通信”,内容详细,步骤清晰,细节处理妥当,希望这篇“Angular中组件之间如何通信”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识...
    99+
    2022-10-19
  • 计算机之间如何实现通信
    这篇文章给大家介绍计算机之间如何实现通信,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在计算机网络中,计算机之间的通信是通过网络协议实现的。什么是网络协议?网络协议是为计算机网络中进行数据交换而建立的规则、标准或约定的...
    99+
    2023-06-14
  • Android中Service与Activity之间通信的几种方式
    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通...
    99+
    2022-06-06
    service activity 通信 Android
  • Android Activity与Service通信(不同进程之间)详解
    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通...
    99+
    2022-06-06
    程之 service 进程 activity Android
  • Java socket通信与C++之间的关系是什么
    Java socket通信与C++之间的关系是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。c++builer与Java socket通信是我们在编程中经常用到的,有不少的...
    99+
    2023-06-17
  • 怎样精确实现C#form与form之间通信
    今天就跟大家聊聊有关怎样精确实现C#form与form之间通信,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实现C# form与form之间的通信不是很容易的,笔者在网上查到了一个解...
    99+
    2023-06-17
  • 如何实现React组件之间的通信
    这篇文章主要为大家展示了“如何实现React组件之间的通信”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现React组件之间的通信”这篇文章吧。1.定义两...
    99+
    2022-10-19
  • Spring AOPr如何打通两个切面之间的通信
    目录场景描述解决方案跳转过程其他方案场景描述 在秒杀微服务中,笔者在需要各种校验前端传来的参数后,通过 Redis 加锁限流(切面A)并返回,最后封装订单数据推送到 RabbitMQ...
    99+
    2022-11-13
  • Golang与RabbitMQ实现多服务之间的异步通信
    要使用Golang与RabbitMQ实现多服务之间的异步通信,你需要按照以下步骤进行操作:1. 安装RabbitMQ:首先,你需要安...
    99+
    2023-10-08
    Golang
  • Android Fragment与Activity之间的相互通信实例代码
    Android Fragment与Activity之间的相互通信 前言 自从Android3.0引入Fragment之后,主要是为了支持动态灵活的界面设计和屏幕的适配问题。F...
    99+
    2022-06-06
    android fragment activity fragment 通信 Android
  • Java学习之线程同步与线程间通信详解
    目录线程同步的概念同步代码块同步方法线程组线程组的相关方法线程组对象的基本应用线程间的通信线程通信简单应用线程同步的概念 由于同一个进程的多个线程共享同一块存储空间,在带来方便的同时...
    99+
    2022-12-27
    Java线程同步 Java线程通信 Java线程
  • SpringCloud如何解决服务之间的通信问题
    目录1、如何解决服务之间的通信问题?2、如何在java代码中发起http方式请求?3、实现服务间通信的小案例4、现有RestTemplate方式通信存在的问题?5、解决RestTem...
    99+
    2022-11-12
  • web网页与小程序间如何进行通信
    本篇内容介绍了“web网页与小程序间如何进行通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们的微信小程序采用的web-view的方式内...
    99+
    2023-06-21
  • Java中线程之间的通信是如何实现的
    这篇文章将为大家详细讲解有关Java中线程之间的通信是如何实现的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程...
    99+
    2023-05-31
    java 线程 通信
  • kubernetes如何实现集群各模块之间的通信
    这篇文章主要为大家展示了“kubernetes如何实现集群各模块之间的通信”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes如何实现集群各模块之间的通信”这篇文章吧。一: 通信结...
    99+
    2023-06-04
  • Linux进程间如何通信
    这篇文章主要介绍“Linux进程间如何通信”,在日常操作中,相信很多人在Linux进程间如何通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux进程间如何通信”的疑惑...
    99+
    2022-10-19
  • Vue如何实现父子组件之间的通信功能
    这篇文章主要为大家展示了“Vue如何实现父子组件之间的通信功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue如何实现父子组件之间的通信功能”这篇文章吧。在...
    99+
    2022-10-19
  • Angular2如何实现父子组件之间共享服务通信
    小编给大家分享一下Angular2如何实现父子组件之间共享服务通信,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!第一步:定义服务parentService.ts1).这里用Injectab...
    99+
    2022-10-19
  • 如何进行Docker容器之间的通信的方法实现
    如何进行Docker容器之间的通信的方法实现,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。情景:本地已经搭建laradock开发环境(php7.3+mysql5.7),现在...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作