ポートレット開発をサポートする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]ボタンをクリック
続いてポートレットコンテナとして利用する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]をクリック
設定が完了すると、[Services]タブの[Servers]の項目に図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を編集することで修正できる。
以上で、図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 プロジェクトツリー |
これで、/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]を選ぶ。
あとはウィザードの手順に従って、図14の画面でポートレットの詳細設定を記入し、JSPファイルを生成する場合には次の図15の画面で[Create Jsps]にチェックを入れればよい。
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」の方に反映される。