使用事件功能
事件機制是公共呈現引數的擴充套件版本,具有附加功能以將自定義物件傳遞給其他 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());
}
}
然後可以通過渲染請求從渲染引數中檢索它。