使用事件功能

事件機制是公共呈現引數的擴充套件版本,具有附加功能以將自定義物件傳遞給其他 portlet,但具有事件階段的開銷。

為實現這一目標,該機制包括

  1. 釋出者 portlet
  2. 處理器(消費者)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());
    }

}

然後可以通過渲染請求從渲染引數中檢索它。