Liferay7 BPM门户开发之33: Portlet之间通信的3种方式(session、IPC Render Parameter、IPC Event、Cookies)

文章介绍了5种方式,4种是比较常用的:

  • Portlet session
  • IPC Public Render Parameters
  • IPC Event
  • Cookies

参考地址:

https://web.liferay.com/zh/community/wiki/-/wiki/Main/Portlet%E9%97%B4%E7%9A%84%E9%80%9A%E4%BF%A1

方式1:Session

portlet session作用域:

  • APPLICATION_SCOPE  :全局
  • PORTLET_SCOPE:单一实例范围,默认作用域

步骤1:为了在不同的Portlet之间传递信息,需要把默认的作用域范围修改

liferay-portlet.xml 设置不支持私有会话

<portlet>
        <private-session-attributes>false</private-session-attributes>
</portlet>

步骤2:设置Seesion

PortletSession session = renderRequest.getPortletSession();
session.setAttribute("sessionName1", some-value ,PortletSession.APPLICATION_SCOPE);

步骤3:在Portlet2中获取 Seesion中的值

    PortletSession ps = renderRequest.getPortletSession();
    String tabNames = (String)ps.getAttribute("sessionName1",PortletSession.APPLICATION_SCOPE);

这种方法最为简单.

方式2:IPC Render Parameter

在portal-ext.properties里添加下面的属性,我们可以使不同页面中的Portlet互相分享其 Render的状态:

    portlet.public.render.parameter.distribution=ALL_PORTLETS

步骤1:在“Sender-Portlet”中添加下面的属性

    <portlet-app>
        <portlet>
            <supported-public-render-parameter>id1</supported-public-render-parameter>
        </portlet>

        <public-render-parameter>
            <identifier>id1</identifier>
            <qname xmlns:x="http://abc.com/userId">x:param1</qname>
        </public-render-parameter>
    </portlet-app>

Note:We can declare a list of public paramters for a portlet application.

注意:我们可以为Portlet声明一个 Public Render Parameter 列表。

步骤2

我们可以在processAction方法中设置 Public Render Parameter 。作为key,我们使用的是定义好了的 Public Render Parameter 标识符:

    public void processAction(ActionRequest  request, ActionResponse response) throws IOException, PortletException  {
        ........
        response.setRenderParameter("id1", “someIdValue”); ........
    }

步骤3:“Receiver Portlet”的“portlet.xml”文件

在porltet定义中指定哪个 Public Render Parameter 允许被分享

    <portlet-app>
        <portlet>
            <portlet-name >PortletB< /portlet-name>
            <supported-public-render-parameter>id1</supported-public-render-parameter>
        </portlet >
        <public-render-parameter>
            <identifier>id1</identifier>
            <qname xmlns:x="http://abc.com/userId">x:param1</qname>
        </public-render-parameter>
    </portlet-app>

步骤4

Portlet可以通过使用 request.getPublicParameterMap() 方法读取 Public Render Parameter 。

注意:因为 Public Render Parameter 被合并到全局 parameter中了,所以我们也可以用下面的方法去读取:

    request.getParameter(“id1”);

步骤5

我们也可以使用下面的方法去移除一个 Public Render Parameter :

    response.removePublicRenderParameter("id1")

例子:JSP:
view.jsp

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<portlet:defineObjects />

<portlet:actionURL var="actionURL" name="setRenderParameter"/>

<aui:form action="<%=actionURL.toString() %>" method="post">
<aui:input name="name" label="Set Your Name In Public"/>
<aui:button-row>
<aui:button type="submit" value="Set"/>
</aui:button-row>
</aui:form>
接收的JSP
<%@page import="com.liferay.portal.kernel.util.ParamUtil"%>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<portlet:defineObjects />

<!-- In JSP we can directly read public render parameter -->
<!-- Also public render parameter is available in any other life cycle methods -->

<%
String name = ParamUtil.getString(request, "myname");
%>

<H3>Public parameter name is ‘myname‘</H3>
<H3>Its value is </H3>
<b><%=name %></b>

方式3:IPC Event

略.

可参考地址:

https://web.liferay.com/zh/community/wiki/-/wiki/Main/Portlet%E9%97%B4%E7%9A%84%E9%80%9A%E4%BF%A1

方式4:Cookies

这种方式不推荐.

有一些局限性:

1. 不允许超过4KB的数据

2.每个服务器限制了最多只能有20个Cookies。

时间: 2024-08-06 21:58:47

Liferay7 BPM门户开发之33: Portlet之间通信的3种方式(session、IPC Render Parameter、IPC Event、Cookies)的相关文章

Liferay7 BPM门户开发之17: Portlet 生命周期

Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() init() 在Liferay容器部署portlet时,启动portlet实例化 init有两个写法: public void init() throws PortletException public void init(PortletConfig config) throws PortletEx

Liferay7 BPM门户开发之28: Portlet文件上传,及实体类同步更新上传

抓住核心 -- 王昕 Liferay文件上传的核心就是使用UploadPortletRequest类 继承关系java.lang.Object extended byjavax.servlet.ServletRequestWrapper extended byjavax.servlet.http.HttpServletRequestWrapper extended bycom.liferay.util.servlet.UploadPortletRequest 实现关系:Implemented I

Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发

hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为系统服务挂钩(Liferay Service Hook),还有其他类型的hook... Liferay6.2 时的hook开发比较有限,而在Liferay7则大为不同,OSGi services的彻底改进至Liferay的底层模型框架,使得Liferay可以支持更多的定制扩展!OSGi plugin

Liferay7 BPM门户开发之14: Liferay开发体系简介

Liferay SDK 开发体系 主要分6种: Portlet Hook Theme Layout Templates Web Modules Ext Portlet :类似于servlet的web组件,编译后是war包,是页面的组成元素,可以把它理解为一个web APP 详细介绍:https://web.liferay.com/zh/products/what-is-a-portal/web-platform Hook:钩子插件,用来覆盖门户的JSP文件和配置文件,适用于仅需要少量(jsp)代

Liferay7 BPM门户开发之42: Liferay核心JSP定制扩展

Liferay最大的好处是不仅接口强大,利于扩展,就连JSP定制扩展都提供了3种方式. 修改核心jsp代码,有3种修改方式:1.暴力修改直接修改(位于portal-web/docroot/html),编译部署,会带来风险,而且不能同步更新. 2.全量扩展修改热部署jsp文件(替代原有jsp),这是v7.0下的OSGi方式,实现方式非常优雅. 3.CustomJspBag Hook方式实现CustomJspBag接口,做jsp片段式的修改,同样是增量热部署,也是v7.0下的OSGi方式(需要增加依

Liferay7 BPM门户开发之38: OSGi Bndtools开发入门

前言 OSGi是目前动态模块系统的事实上的工业标准,它适用于任何需要模块化.面向服务.面向组件的应用程序.Eclipse如此庞大和复杂的插件体系,就是基于OSGi.Liferay也是基于OSGi.OSGi是模块化设计的一种标准,适用于大中型项目.在一些小型项目中,开发者也可以自己设计私有的classLoader机制来实现插件开发环境,比如openfire OSGi是在Java平台上开发模块化应用程序的一种方式.它允许你构建模块(称之为bundle),它们彼此之间是隔离的,具备明确的和可管理的依赖

Liferay7 BPM门户开发之36: 使用Portlet filters过滤器做切面AOP

使用Portlet filters过滤器做切面AOP Portlet Filters定义于JSR286 Java Portlet Specification 2.0 Portlet Filters是为了在4个生命周期的过程中,提供外部的AOP支持,这非常不显眼,但也很有用,比如可以用在Liferay的Hook开发中.JSR286 Java Portlet Specification 2.0 的更多介绍:http://www.ibm.com/developerworks/websphere/lib

Liferay7 BPM门户开发之32: 实现自定义认证登陆(定制Authentication Hook)

优秀的平台必然松耦合.易扩展  -- 王昕 第一步:修改liferay-hook.xml <?xml version="1.0"?> <!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd"> <hook> <portal-properties>

Liferay7 BPM门户开发之40: Form表单的Action到Render的数据传递

在Form提交后的变量,很多情况是要展现在jsp页面中,这时Action到Render的变量传递就非常有用. 例如,您在数据库中添加了学生的详细信息. 为了实现这一需求,先创建Form表单(学生的细节,如姓名.出生日期等,通过action url来实现). 当用户提交表单时,这些数据(学生信息)会在你执行CRUD操作的action方法添加. 添加完成后,需要把一些信息展现到jsp页面. 和v6.2不同的是,action方法里不需要写类似这样的语句: actionResponse.setRende