ポートレット開発をサポートする2つのプロダクト

第26回でJavaポートレット仕様の次期バージョンとなるJSR 286: Portlet Specification 2.0を取り上げ、その実装としてOpenPortal Portlet Container 2.0の使用方法を紹介した。このときはSubversionリポジトリより成果物をチェックアウトしたが、17日(米国時間)にSun Microsystemsよりリリースされたばかりの「Java Application Platform SDK Update 3 Beta」では、Portlet Container 2.0 Betaのバイナリが追加されている。

また、NetBeansにはポータル開発向けのプラグインとして「Portal Pack」があるが、NetBeans 6.0 Beta 1に合わせて新たに公開された「Portal Pack 2.0 Beta for NetBeans 6.0 Beta 1」においてJSR 286がサポートされている。

今回はこの2つを用いて、JSR 286の新機能を試してみたい。

Portal Pack 2.0 BetaとJava Application Platform SDK Update 3 Betaのインストール

Portal Pack 2.0 BetaはNetBeans IDE 6.0 Beta 1用なので、まずはNetBeans IDE 6.0 Beta 1(以下、NetBeans 6.0)をインストールしておく必要がある。

Portal Pack 2.0 Betaはこのページより入手することができる。「Portal-pack-plugin-2_0Beta.zip」には3つのNetBeansモジュールが含まれているので、これを次の手順でNetBeansにインストールする。

  • NetBenas 6.0を立ち上げ、[Tools]→[Plugins]でプラグインマネージャを起動
  • [Download]タブを表示(図1)
  • [Add Plugins]をクリックし、Portal Pack 2.0 Betaの3つのモジュールを追加(図2)
  • 3つのモジュールにチェックを入れて[Install]ボタンをクリック

図1 プラグインマネージャ

図2 Portal Pack 2.0 Betaの3つのモジュールを追加

続いてポートレットコンテナとして利用するJava Application Platform SDK Update 3 Betaをインストールする。これはこのサイトより入手できる。実行形式のファイルになっているので、インストーラの指示に従ってインストールする。本稿の例ではD:\Sun\SDKフォルダ以下にインストールするものとする。

NetBeans 6.0にPortal Pack 2.0がインストールされている場合、次のようにしてポートレットコンテナとして利用するアプリケーションサーバの設定ができる。

  • [Tools]→[Servers]でサーバマネージャを起動(図3)
  • [Add Servers]をクリックし、図4の画面で「Openortal Portlet Container 2.0 Beta」を選択して[Next]をクリック
  • ServerTypeは「GlassFish / Sun Java System AppServer 9」とし、Java Application Platform SDKのインストール先やパスワードなどの情報を記入(図5)
  • 図6のようにポートレットコンテナの設定を入力して[Finish]をクリック

図3 サーバマネージャ

図4 Portal Pack 2.0 Betaの3つのモジュールを追加

図5 Java Application Platform SDKのインストール情報を入力

図6 ポートレットコンテナの設定を入力

設定が完了すると、[Services]タブの[Servers]の項目に図7のようにポートレットコンテナが追加されてる。

図7 サービス一覧にポートレットコンテナが追加される

パブリックレンダーパラーメータを試す

それでは、さっそくPortal Pack 2.0を利用してPortlet 2.0仕様の新機能を使ったポートレットを作成してみよう。前回はイベントの送受信を試したので、今回はパブリックレンダーパラーメタを使ってみることにする。パブリックレンダーパラーメタとは、レンダーパラメータを異なるポートレット間で共有できるようにする仕組みだ。これによって、イベントを用いなくてもポートレット間でパラメータの受け渡しを行うことが可能になる。

Portal Pack 2.0でポートレットを作成するには、まずプロジェクトウィザードで通常のWebアプリケーションの場合と同様に[Web]→[Web Application]と選択し、次の画面で図8のようにサーバとして先程設定した「OpenPotal Portlet Container 2.0 Beta」を選択する。

続いてフレームワークの選択で「Portlet Support」にチェックを入れる。図9のようにポートレット用の設定項目が表示されるので、[Create Portlet]と[Create Jsps]にチェックを入れ、最初に作成するポートレットの設定を入力する。ここではパラメータをセットする元のポートレットとして「SetParameterPortlet」を作成しておく。このとき、ポートレットのバージョンは「2.0」にすること。設定内容は後から/WEB-INF/portlet.xmlを編集することで修正できる。

図8 プロジェクトの作成 その1

図9 プロジェクトの作成 その2

以上で、図10のようにポートレットの雛型が生成されるはずだ。ここで、共有するレンダーパラメータのための設定を/WEB-INF/portlet.xmlに追加する。自分で記述してもいいが、Portal Pack 2.0にはパブリックレンダーパラメータのためのウィザードが付属している。

まず、図11のようにプロジェクトツリーの「Public Render Parameter」を右クリックし、[Add Render Parameter]を選択する。続いて図12のようにパラメータのための設定を記入すればよい。IdentiferとName Spaceにはそれぞれパラメータの識別子とXMLの名前空間を、PrefixとLocal Partには名前空間上のパラメータ名を入力する。

図10 プロジェクトツリー

図11 プロジェクトツリー

図12 パブリックレンダーパラメータの設定

これで、/WEB-INF/portlet.xmlにはリスト1のような設定が追加されるはずだ。

リスト1 /WEB-INF/portlet.xmlのパブリックレンダーパラメータの設定

        <public-render-parameter xmlns:x='http://sun.com/params'>
                <identifier>name-id</identifier>
                <qname>x:name</qname>
        </public-render-parameter>

このパラメータをSetParameterPortletで有効にするために、/WEB-INF/portlet.xmlのSetParameterPortletの設定部分にリスト2のようにタグを追加する。

リスト2 WEB-INF/portlet.xmlのSetParameterPortletの設定

        <portlet>
                <description>SetParameterPortlet</description>
                ......省略......
                <supported-public-render-parameter>name-id</supported-public-render-parameter>
        </portlet>

apisample.portlet.SetParameterPortlet.javaはリスト3のようにした。processAction()メソッドの中でレンダーパラメーラをセットしている。従来だとこのパラメータはSetParameterPortlet内でのみ有効だったが、今回はこれを共有パラメータにしているので別のポートレットからも使えるというわけだ。

リスト3 SetParameterPortlet.java

package apisample.portlet;

import javax.portlet.GenericPortlet;
import javax.portlet.ActionRequest;
import javax.portlet.RenderRequest;
import javax.portlet.ActionResponse;
import javax.portlet.RenderResponse;
import javax.portlet.PortletException;
import java.io.IOException;
import javax.portlet.PortletRequestDispatcher;

public class SetParameterPortlet extends GenericPortlet {
    @Override
    public void processAction(ActionRequest request, ActionResponse response) 
            throws PortletException,IOException {
        // レンダーパラメータをセット
        String name = request.getParameter("name");
        response.setRenderParameter("name", name);
    }

    @Override
    public void doView(RenderRequest request,RenderResponse response) 
            throws PortletException,IOException {
        response.setContentType("text/html");
        // ページの出力をJSPファイルにディスパッチ
        PortletRequestDispatcher dispatcher =
            getPortletContext().getRequestDispatcher
                    ("/WEB-INF/jsp/SetParameterPortlet_view.jsp");
        dispatcher.include(request, response);
    }
}

ページの出力は/WEB-INF/jsp/SetParameterPortlet_view.jspにディスパッチしているので、これはリスト4のようにした。

リスト4 /WEB-INF/jsp/SetParameterPortlet_view.jsp

<?xml version="1.0" encoding="UTF-8" ?>

<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" />

    <portlet:actionURL var="viewUrl" portletMode="view"/>

    <h3>名前入力</h3>
        <form action="${viewUrl}" method="post">
        <input type="text" name="name" value="${name}"/><br/>
        <input type="submit" name="send" value="Send"/>
    </form>

</jsp:root>

次に、パラメータを受け取る側のポートレットを「ReceiveParameterPortlet」として作成する。新たにポートレットを追加するには、プロジェクトツリーのプロジェクト名の上で右クリックし、[New]→[Portlet]を選択する。メニューに[Portlet]が見当たらない場合には、[Other]を選択して図13の一覧から[Portlet]を選ぶ。

図13 新規ポートレットの作成 その1

あとはウィザードの手順に従って、図14の画面でポートレットの詳細設定を記入し、JSPファイルを生成する場合には次の図15の画面で[Create Jsps]にチェックを入れればよい。

図14 新規ポートレットの作成 その2

図15 新規ポートレットの作成 その3

ReceiveParameterPortletについても、パラメータを有効にするための設定をリスト5のように追加しておく。

リスト5 /WEB-INF/portlet.xmlのReceiveParameterPortletの設定

        <portlet>
                <description>ReceiveParameterPortlet</description>
                ......省略......
                <supported-public-render-parameter>name-id</supported-public-render-parameter>
        </portlet>

apisample.portlet.ReceiveParameterPortlet.javaはリスト6のようにする。パブリックレンダーパラメータも、通常のレンダーパラメータと同様の方法で取得できる。

リスト6 ReceiveParameterPortlet.java

package apisample.portlet;

import javax.portlet.GenericPortlet;
import javax.portlet.ActionRequest;
import javax.portlet.RenderRequest;
import javax.portlet.ActionResponse;
import javax.portlet.RenderResponse;
import javax.portlet.PortletException;
import java.io.IOException;
import javax.portlet.PortletRequestDispatcher;

public class ReceiveParameterPortlet extends GenericPortlet {
    @Override
    public void doView(RenderRequest request,RenderResponse response) 
            throws PortletException,IOException {
        response.setContentType("text/html");

        // レンダーパラメータを取得
        String name = request.getParameter("name");
        if (name == null) {
            name = "";
        }
        request.setAttribute("name", name);

        // ページの出力をJSPファイルにディスパッチ
        PortletRequestDispatcher dispatcher = 
            getPortletContext().getRequestDispatcher
                    ("/WEB-INF/jsp/ReceiveParameterPortlet_view.jsp");
        dispatcher.include(request, response);
    }
}

/WEB-INF/jsp/ReceiveParameterPortlet_view.jspは、取得したパラメータの値を表示するのでリスト7のようにした。

リスト7 /WEB-INF/jsp/ReceiveParameterPortlet_view.jsp

<?xml version="1.0" encoding="UTF-8" ?>

<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" />

    <portlet:actionURL var="viewUrl" portletMode="view"/>

    <h2>Hello ${name} !</h2>

</jsp:root>

完成したらプロジェクトをビルドし、ポートレットコンテナにデプロイする。Webブラウザから「http://localhost:8080/portletdriver/dt」にアクセスすれば、図16のように表示される。今回作成したのは下の2つのポートレットだ。「SetParameterPortlet」の方に名前を入力して[Send]をクリックすれば、図17のようにそれが「|Receive!|ParameterPortlet」の方に反映される。

図16 Webブラウザからポートレットドライバにアクセス

図17 パラメータがポートレットを跨いで渡されている