liferay ipc porltet间通讯DEMO
liferay ipc porltet间通信DEMO
portlet2.0 的通信特性
JSR268中定义了portlet之间的通信协议
基本的原理就是事件监听机制,portlet A 触发事件。portlet B对时间进行监听并作出反应。传递的数据放在 事件的 payload 里面。并且事件通信的两个portlet可以不再同一个page,需要修改portlet.event.distribution=layout。 具体参见liferay in action 里 ipc 那一章。
下面展示通过liferay in action 的一个例子。
pitchPortlet view.jsp 上有一个 按钮。通过该按钮 该portlet发送一个事件。
catcherPorlet 写好时间监听函数。
step 1. 创建 pitchPortlet.(使用liferay官方下载的eclipse,已经集成好liferay)
a. 修改portlet.xml
<event-definition>
<qname xmlns:x="http://liferay.com/events">x:ipc.pitch</qname>
<value-type>java.lang.String</value-type>
</event-definition>
声明 portlet 事件。
b. 定义事件发生者(在pitchPortlet 的xml定义)
<supported-publishing-event>
<qname xmlns:x="http://liferay.com/events">x:ipc.pitch</qname>
</supported-publishing-event>
c. 定义事件处理者 (在 catchPortlet 的xml定义)
<supported-processing-event>
<qname xmlns:x="http://liferay.com/events">x:ipc.pitch</qname>
</supported-processing-event>
d.完整的xml定义:见附件
e.完成 PitcherPortlet
@ProcessAction(name="pitchBall")
public void pitchBall(ActionRequest actionRequest, ActionResponse actionResponse)throws IOException, PortletException {
//其他逻辑
//qname 与事件定义时一直
QName qName = new QName ("http://liferay.com/events", "ipc.pitch");
actionResponse.setEvent(qName, pitchType);
}
f.完成catchPortlet
@ProcessEvent(qname="{http://liferay.com/events}ipc.pitch")
public void catchBall(EventRequest request, EventResponse response) {
Event event = request.getEvent();
String pitch = (String)event.getValue();
response.setRenderParameter("pitch", pitch);
}
g. pitchPortlet /view.jsp
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<portlet:defineObjects />
<p>Click the link below to pitch the ball. </p>
<portlet:actionURL var="pitch" name="pitchBall"></portlet:actionURL>
<a href="<%=pitch%>">Pitch!</a>
h. catchPortlet /view.jsp
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<portlet:defineObjects />
<%
String pitch = (String)renderRequest.getParameter("pitch");
%>
<p>And the pitch is....</p>
<p>
<% if (pitch!=null) { %>
<%=pitch %>!
<% } else { %>
... waiting for pitch.
<% } %>
I :部署运行 点击pitch 就可以看到 catchPortlet 的反应
portlet2.0 的通信特性
JSR268中定义了portlet之间的通信协议
基本的原理就是事件监听机制,portlet A 触发事件。portlet B对时间进行监听并作出反应。传递的数据放在 事件的 payload 里面。并且事件通信的两个portlet可以不再同一个page,需要修改portlet.event.distribution=layout。 具体参见liferay in action 里 ipc 那一章。
下面展示通过liferay in action 的一个例子。
pitchPortlet view.jsp 上有一个 按钮。通过该按钮 该portlet发送一个事件。
catcherPorlet 写好时间监听函数。
step 1. 创建 pitchPortlet.(使用liferay官方下载的eclipse,已经集成好liferay)
a. 修改portlet.xml
<event-definition>
<qname xmlns:x="http://liferay.com/events">x:ipc.pitch</qname>
<value-type>java.lang.String</value-type>
</event-definition>
声明 portlet 事件。
b. 定义事件发生者(在pitchPortlet 的xml定义)
<supported-publishing-event>
<qname xmlns:x="http://liferay.com/events">x:ipc.pitch</qname>
</supported-publishing-event>
c. 定义事件处理者 (在 catchPortlet 的xml定义)
<supported-processing-event>
<qname xmlns:x="http://liferay.com/events">x:ipc.pitch</qname>
</supported-processing-event>
d.完整的xml定义:见附件
e.完成 PitcherPortlet
@ProcessAction(name="pitchBall")
public void pitchBall(ActionRequest actionRequest, ActionResponse actionResponse)throws IOException, PortletException {
//其他逻辑
//qname 与事件定义时一直
QName qName = new QName ("http://liferay.com/events", "ipc.pitch");
actionResponse.setEvent(qName, pitchType);
}
f.完成catchPortlet
@ProcessEvent(qname="{http://liferay.com/events}ipc.pitch")
public void catchBall(EventRequest request, EventResponse response) {
Event event = request.getEvent();
String pitch = (String)event.getValue();
response.setRenderParameter("pitch", pitch);
}
g. pitchPortlet /view.jsp
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<portlet:defineObjects />
<p>Click the link below to pitch the ball. </p>
<portlet:actionURL var="pitch" name="pitchBall"></portlet:actionURL>
<a href="<%=pitch%>">Pitch!</a>
h. catchPortlet /view.jsp
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<portlet:defineObjects />
<%
String pitch = (String)renderRequest.getParameter("pitch");
%>
<p>And the pitch is....</p>
<p>
<% if (pitch!=null) { %>
<%=pitch %>!
<% } else { %>
... waiting for pitch.
<% } %>
I :部署运行 点击pitch 就可以看到 catchPortlet 的反应
1 楼
lijiayao10
2012-05-03
把例子源码发给我,谢谢啦
a304101279@163.com
a304101279@163.com
2 楼
lyh20081984
2012-06-25
我也想要源码,照着你上面的教程会报错,new Qname那里就不一样了,而且不是完整的,没理清头绪,给我一份吧,感谢!lyh20081984@126.com