实现基于事件机制的portlet间通信

本文介绍JSR286规范下portlet间的通信机制,包括如何定义发布事件和处理事件的portlet,实现portlet间的数据传递。通过具体代码示例展示了事件发布与处理的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

portlet间通信包括 : 本地portlet与本地portlet通信
远程portlet与远程portlet通信
本地portlet与远程portlet通信

JSR286规范中定义了本地portlet之间的通信,共享session ,共享资源、事件机制

通过event进行portlet之间通信:

1. 定义publishing event的portlet,定义event-definition ,及supported-publishing-event


<?xml version="1.0"?>

<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0">

<portlet>
<portlet-name>foodaoportlet</portlet-name>
<display-name>FooDaoPortlet</display-name>
<portlet-class>com.liferay.wyy.dao.DAOPortlet</portlet-class>
<init-param>
<name>view-template</name>
<value>/view/view.jsp</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>view</portlet-mode>
</supports>
<portlet-info>
<title>FooDaoPortlet</title>
<short-title>FooDaoPortlet</short-title>
<keywords></keywords>
</portlet-info>
<security-role-ref>
<role-name>administrator</role-name>
</security-role-ref>
<security-role-ref>
<role-name>guest</role-name>
</security-role-ref>
<security-role-ref>
<role-name>power-user</role-name>
</security-role-ref>
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
<supported-processing-event>
<qname xmlns:x="http://wangyy.example.com/food">x:foodItem</qname>
</supported-processing-event>
<!-- 定义支持发布的event -->
<supported-publishing-event>
<qname xmlns:x="http://wangyy.example.com/food">x:foodItem</qname>
</supported-publishing-event>
</portlet>

<!-- 支持event定义 -->
<event-definition xmlns:x="http://wangyy.example.com/food">
<qname>x:foodItem</qname>
<value-type>com.liferay.wyy.dao.model.FoodItem</value-type>
</event-definition>
</portlet-app>


2.定义处理event的portlet, 定义supported-processing-event 及event-definition


<?xml version="1.0"?>

<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0">

<portlet>
<portlet-name>eventprocessportlet</portlet-name>
<display-name>EventProcessPortlet</display-name>
<portlet-class>
com.liferay.wyy.event.portlet.EventProcessPortlet
</portlet-class>
<init-param>
<name>view-template</name>
<value>/view/view.jsp</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>view</portlet-mode>
</supports>
<portlet-info>
<title>EventProcessPortlet</title>
<short-title>EventProcessPortlet</short-title>
<keywords></keywords>
</portlet-info>
<security-role-ref>
<role-name>administrator</role-name>
</security-role-ref>
<security-role-ref>
<role-name>guest</role-name>
</security-role-ref>
<security-role-ref>
<role-name>power-user</role-name>
</security-role-ref>
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
<!-- 定义支持处理的event 需要放在publishing-event之前-->
<supported-processing-event>
<qname xmlns:x="http://wangyy.example.com/food">x:foodItem</qname>
</supported-processing-event>
</portlet>
</portlet-app>


3. 发布event的portlet中处理:
在processAction中添加setEvent代码

//setEvent
QName qName = new QName("http://wangyy.example.com/food", "foodItem");
res.setEvent(qName, foodItem);


4.处理event的portlet中代码

/**
* 处理event事件
* @param request
* @param response
* @throws PortletException
* @throws IOException
*/
@ProcessEvent(qname = "{http://wangyy.example.com/food}foodItem")
public void processFoodItemEvent(EventRequest request, EventResponse response)
throws PortletException, IOException{
Event event = request.getEvent();
FoodItem foodItem = (FoodItem)event.getValue();
System.out.println("Processing event in EventProcessPortlet id=" + foodItem.getId() + ", name=" + foodItem.getName());
response.setRenderParameter("foodItemName", foodItem.getName());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值