使用事件功能

事件机制是公共呈现参数的扩展版本,具有附加功能以将自定义对象传递给其他 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());
    }

}

然后可以通过渲染请求从渲染参数中检索它。