ポータルの新しい仕様のJSR286で
なんか色々できるようになったらしいので
色々試してみようかなと思います。
そんな訳で今回はポートレット間通信の
イベントについてやってみます。


で、今回作るポートレットは送信側で入力した文字列を受信側のポートレットで表示するっていう、ごくごくシンプルなポートレットです。
なんかシンプルすぎたので送信側はJSFで作ってみました。

環境は以下の通りです。
OS Windows Vista Home Premium 32bit
Java 1.6.0.14
IDE NetBEANS 6.5.1
APPサーバ GlassFish v3 Preview
Portalサーバ LIFERAY 5.2.3



1.送信側のポートレットをこんな感じに作ります。
・web.xml

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee <a href="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd</a>">
  <context-param>
    <param-name>com.sun.faces.verifyObjects</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
  <param-name>com.sun.faces.validateXml</param-name>
  <param-value>true</param-value>
  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Page Sources</web-resource-name>
      <url-pattern>*.jsp</url-pattern>
      <url-pattern>*.jspx</url-pattern>
      <url-pattern>*.xhtml</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>nobody</role-name>
    </auth-constraint>
  </security-constraint>
  <security-role>
    <role-name>nobody</role-name>
  </security-role>
  <welcome-file-list>
    <welcome-file>faces/welcomeJSF.jsp</welcome-file>
  </welcome-file-list>
</web-app>
 

・portlet.xml

<portlet-app version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd <a href="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd</a>">
  <portlet>
    <portlet-name>SampleSender</portlet-name>
    <display-name>Sample Event Sender</display-name>
    <portlet-class>com.sun.faces.portlet.FacesPortlet</portlet-class>
    <init-param>
      <name>com.sun.faces.portlet.INIT_VIEW</name>
      <value>/welcomeJSF.jsp</value>
    </init-param>
    <supports>
      <mime-type>text/html</mime-type>
    </supports>
    <portlet-info>
      <title></title>
      <short-title>Look Friends List</short-title>
      <keywords>Look Friends List</keywords> </portlet-info>
    <security-role-ref>
      <role-name>administrator</role-name>
    </security-role-ref>
    <security-role-ref>
      <role-name>guest</role-name>
    </security-role-ref>
    <security-role-ref>
      <role-name>power-user</role-name>
    </security-role-ref>
    <security-role-ref>
      <role-name>user</role-name>
    </security-role-ref>

    <!-- ポートレット2.0用XML名前空間定義 -->
    <supported-publishing-event>
      <qname>EventKeyword</qname>
    </supported-publishing-event>
  </portlet>

  <!-- ポートレット2.0用イベント定義 -->
  <event-definition>
    <qname>EventKeyword</qname>
    <value-type>java.lang.String</value-type>
  </event-definition>
</portlet-app>
 

・send.jsp(送信ポートレットの表示画面)

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%><%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%--
   This file is an entry point for JavaServer Faces application.
--%>

<f:view>
  <h:form id="searchForm">
    <p>文字列を入力してください:<h:inputtext id="word" value="#{SendSample.msgStr}"></h:inputtext></p>
    <p><h:commandbutton id="button1" value="Button1" actionlistener="#{SendSample.moveDetailDisp}"></h:commandbutton></p>
  </h:form>
</f:view>
 

・SendSample.java(送信ポートレットのBEAN)

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


package net.takexoff.sammple;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.xml.namespace.QName;

/**
 *
 * @author go
 */

public class SendSample {
    private String msgStr = "";

    public String getMsgStr() {
        return msgStr;
    }

    public void setMsgStr(String msgStr) {
        this.msgStr = msgStr;
    }

    public void moveDetailDisp(ActionEvent event){
            FacesContext context      = null;
            ExternalContext excnt     = null;
            QName           qname     = null;
            ActionRequest  aRequest   = null;
            ActionResponse aResponse  = null;

            try {
                context = FacesContext.getCurrentInstance();
                excnt = context.getExternalContext();
                aRequest   = (ActionRequest) excnt.getRequest();
                aResponse  = (ActionResponse) excnt.getResponse();
                qname      = new QName("EventKeyword");

                aResponse.setEvent(qname, msgStr);

            } catch (Exception e){
                e.printStackTrace();
            }
    }
}
 

2.受信側のポートレットはこんな感じです
・web.xml

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee <a href="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd</a>">
  <session-config>
  <session-timeout>30</session-timeout>
  </session-config>
  <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
 

・portlet.xml

<portlet-app xmlns='<a href="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd</a>' xmlns:xsi='<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>' xsi:schemaLocation='<a href="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd</a> <a href="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd</a>' version='2.0'>
  <portlet>
    <portlet-name>SampleReceive</portlet-name>
    <display-name>Sample Event Sender</display-name>
    <portlet-class>net.takexoff.sample.ReceiveSample</portlet-class>
    <expiration-cache>0</expiration-cache>
    <supports>
      <mime-type>text/html</mime-type>
    </supports>
    <portlet-info>
      <title></title>
    </portlet-info>
    <security-role-ref>
      <role-name>administrator</role-name>
    </security-role-ref>
    <security-role-ref>
      <role-name>guest</role-name>
    </security-role-ref>
    <security-role-ref>
      <role-name>power-user</role-name>
    </security-role-ref>
    <security-role-ref>
      <role-name>user</role-name>
    </security-role-ref>
    <supported-processing-event>
      <qname>EventKeyword</qname>
    </supported-processing-event>
  </portlet>

  <event-definition>
    <qname>EventKeyword</qname>
    <value-type>java.lang.String</value-type>
  </event-definition>
</portlet-app>
 

・recieve.jsp(受信ポートレットの画面)

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0" xmlns:portlet="http://java.sun.com/portlet">
  <jsp:directive.page language="java" contenttype="text/html; charset=UTF-8" pageencoding="UTF-8"></jsp:directive.page>
  <portlet:actionurl var="viewUrl" portletmode="view"></portlet:actionurl>
  イベントで受信した文字列 : ${msgStr}
</jsp:root>
 

・RecieveSample.java

package net.takexoff.sample;

import javax.portlet.GenericPortlet;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.PortletException;
import java.io.IOException;
import java.io.PrintWriter;
import javax.portlet.PortletConfig;
import javax.portlet.PortletContext;
import javax.portlet.PortletRequestDispatcher;

/**
 * Receive Portlet Class
 */

public class ReceiveSample extends GenericPortlet {
    private PortletContext portletContext;
    private String msgStr;

    public void init(PortletConfig config) throws PortletException {
        super.init(config);
        portletContext = config.getPortletContext();
    }
   
    public void doView(RenderRequest request,RenderResponse response) throws PortletException,IOException {
        //Uncomment below lines to see the output
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        //writer.println("View Mode");
        msgStr = request.getParameter("recieveParam");
        request.setAttribute("msgStr" ,  msgStr);

        // ページの出力をJSPファイルにディスパッチ
        try {
            PortletRequestDispatcher dispatcher = portletContext.getRequestDispatcher("/recieve.jsp");
            dispatcher.include(request, response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @javax.portlet.ProcessEvent(qname = "EventKeyword")
    public void processEvent(javax.portlet.EventRequest request, javax.portlet.EventResponse response) throws javax.portlet.PortletException, java.io.IOException {
        javax.portlet.Event event = request.getEvent();
        java.lang.String value = (java.lang.String) event.getValue();
        response.setRenderParameter("recieveParam",value);
       // request.getPortletSession().setAttribute("key", value);
    }
}
 

3.作ったポートレットの動作確認をしてみまーす。 まず、送信側のポートレットにメッセージを入力します


まだ、ボタンをクリックしてないから下のポートレットには 反映されてないですね じゃあ、クリックしちゃいましょう。
すると

はい。下のポートレットに私の反省が反映されちゃいましたね。
こんな感じでイベントを使うことでポートレット間の通信ができるようになります。

次は同じくポートレット間通信の 共有レンダリングをやってみたいと思ったりしてます。では。