Portlet 之间通信有三种方式:
1. PortletSession
2. IPC
3. Cookies
现在有个需要解决的问题,怎么使用 Portlet A 在满足一定条件的情况下,穿参数给 Portlet B,通过该参数改变 Portlet B 的状态。
原本打算使用 IPC, 因为上述三个方法中就属 IPC 概念最通俗易懂操作简单。
但是 IPC 事件的周期首先需要 processAction 再是 processEvent, 在 Resource 状态下貌似是没办法触发 IPC。
于是使用第一种方法,步骤如下
1. liferay-portlet.xml 添加一个属性,注意属性必须按照顺序添加:
<portlet>
...
<private-session-attributes>false</private-session-attributes>
...
</portlet>
2. Portlet A 添加:
PortletSession session = request.getPortletSession();
session.setAttribute("LIFERAY_SHARED_directive", "test" ,PortletSession.APPLICATION_SCOPE);
session.setAttribute 方法第一个参数是对应于 Http Session 的 key,唯一的区别就是定义的 key 必须得有前缀,不然无法在其他 Portlet 中获取。
portal.properties 里的定义:
session.shared.attributes=COMPANY_,LIFERAY_SHARED_,org.apache.struts.action.LOCALE,PORTLET_RENDER_PARAMETERS_,PUBLIC_RENDER_PARAMETERS_POOL_,USER_
3. Portlet B 使用:
PortletSession portletSession = request.getPortletSession();
String directive = (String)portletSession.getAttribute("LIFERAY_SHARED_directive",PortletSession.APPLICATION_SCOPE);
最后需要注意的一点,这个方式适用于同一个 web application 的两个不同 war 包。