使用事件功能
事件机制是公共呈现参数的扩展版本,具有附加功能以将自定义对象传递给其他 portlet,但具有事件阶段的开销。
为实现这一目标,该机制包括
- 发布者 portlet
- 处理器(消费者)portlet,两者都可以是不同 portlet 应用程序的一部分。
首先,
将 <supported-publishing-event>
标记添加到 portlet.xml
中的发布者 portlet
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
<supported-publishing-event>
<qname xmlns:x="http:sun.com/events">x:Employee</qname>
</supported-publishing-event>
</portlet>
将 <supported-processing-event>
标记添加到 portlet.xml
中的处理器 portlet
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
<supported-processing-event>
<qname xmlns:x="http:sun.com/events">x:Employee</qname>
</supported-processing-event>
</portlet>
将 <event-definition>
tag 添加到两个 portlet,定义事件名称并输入 portlet.xml
<event-definition>
<qname xmlns:x="http:sun.com/events">x:Employee</qname>
<value-type>com.sun.portal.portlet.users.Employee</value-type>
</event-definition>
</portlet-app>
接下来我们需要为事件类型创建类(如果是自定义类型)
public class Employee implements Serializable {
public Employee() {
}
private String name;
private int userId;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getUserId() {
return userId;
}
public void setUserId(int id)
{
this.userId = id;
}
}
现在,在发布者 portlet 中,事件需要在操作阶段发布
QName qname = new QName("http:sun.com/events" , "Employee");
Employee emp = new Employee();
emp.setName("Rahul");
emp.setUserId(4567);
res.setEvent(qname, emp);
发布我们发布的事件,它需要在事件阶段由发布者 portlet 处理。
事件阶段在 JSR 286 中引入,并在适用时在 portlet 的呈现阶段之前执行
@ProcessEvent(qname = "{http:sun.com/events}Employee")
public void processEvent(EventRequest request, EventResponse response) {
Event event = request.getEvent();
if(event.getName().equals("Employee")){
Employee payload = (Employee)event.getValue();
response.setRenderParameter("EmpName",
payload.getName());
}
}
然后可以通过渲染请求从渲染参数中检索它。