【コラム】

Java API、使ってますか?

23 高い相互運用性を実現するポートレットAPI - JSR 168

23/60

JSR 168: Portlet Specification

JCPでは現在JSR 286としてJavaポートレット仕様バージョン2.0の標準化が進められており、7月よりPublic Reviewが行われている最中だ。次期バージョンのポートレット仕様も気になるところだが、今回はその前に現行の仕様である「JSR 168: Portlet Specification」を紹介しておきたい。

JSR 168はポータルアプリケーションで利用される「ポートレット」と呼ばれる小型のWebコンポーネントを作成するためのAPIである。一般にポータルと言えばシングルサインオンやコンテンツ統合を提供するWebアプリケーションを指す。ポートレットはこのポータルで利用されるUIコンポーネントで、リクエストに応じて動的に画面の生成を行うことができる。今ならばGoogleガジェットのようなものを想像してもらうとわかりやすいだろう。

ポートレットは「ポートレットコンテナ」によって管理される。Webブラウザがポータルにアクセスすると最初にこのポートレットコンテナが呼び出され、内部で管理するポータルを呼び出して画面を生成する。1つのページに複数のポートレットを表示することもできる。

サーブレットの仕組みにも似ているが、ポートレットはあくまでも画面の一部を構成するためのコンポーネントであり、それ単体で完結したアプリケーションにはならない。そのためURLでアクセスすることはできず、必ずポータルアプリケーションを介してアクセスすることになる。また、ポートレットはそれぞれ個別にライフサイクルを持ち、それはポートレットコンテナによって管理される。

JSR 168で興味深いのは、ポータルとポートレットはそれぞれ独立したアプリケーションとして構成されている点である。したがって、あるポートレットを別のポータルアプリケーションに持っていってそのまま利用することもできる。この高い相互運用性がポートレット仕様の特徴だ。

JSR 168の最終仕様は2003年の10月にリリースされているため、現在ではすでにこの仕様に準拠したアプリケーションが多数出回っている。参照実装はApache Foundationによって開発されている「Apache Pluto」で、現在はバージョン1.1.4が公開されている。今回はこのApache Plutoを使ってみよう。

Apache Plutoでポートレット開発

Apache Plutoの最新版はこのサイトからダウンロードできる。Webコンテナ付きで利用できるTomcatバンドル版(pluto-current-bundle.*)が用意されているので、今回はこれを使用する。

ファイルをダウンロードし、インストールしたい場所(以下、{$PLUTO_HOME}と記述)に展開する。中身は通常のTomcatであり、Apache Plutoの本体となるWebアプリケーションがすでに設定済みの状態で用意されている。{$PLUTO_HOME}/binディレクトリに移動して、startup.bat(Windowsの場合)またはstartup.sh(UNIXの場合)を実行すれば、Apache Plutoが有効になった状態のTomcatが起動する(プロンプト1)。

プロンプト1 Plutoの起動例(Windowsの場合)

{$PLUTO_HOME}\bin>.\startup.bat

この状態で「http://localhost:8080/pluto/portal」にアクセスすれば、Plutoで提供されるポータルアプリケーションのページ表示される。ログイン名とパスワードはどちらも「pluto」でアクセスできる(図1、図2)。

図1 ログイン名もパスワードも「pluto」でOK

図2 ログイン後のページ

停止するにはshutdown.batまたはshutdown.shを実行すればよい(プロンプト2)。

プロンプト2 Plutoの停止例(Windowsの場合)

{$PLUTO_HOME}\bin>.\startup.bat

ポータルアプリケーションもWebアプリケーションの一種なので、内部ではサーブレットを利用している。具体的には、ServletContextやServletRequest、ServletResponseがPortlet API(PortletContext、PortletRequest、PortletResponse)によってラップされ、ブラウザからのリクエストはポートレットコンテナに集約されて各ポートレットに振り分けられる。Plutoの場合、この機能は{$PLUTO_HOME}/webapps/plutoによって提供される。

ポータルだけでなくポートレットもWebアプリケーションの一種である。JSR 168では、サーブレットアプリケーションを作るのと同様の感覚でポートレットを作成することができる。ここではごく簡単なポートレットの作成例を紹介する。基本的な手順は通常のWebアプリケーション作成と同様で、ここでは「SamplePortlet」というプロジェクト名で作成することにする。

リスト1は「Hello Portlet!」と表示するだけのシンプルなポートレットである。JSR 168で提供されるポートレットの雛型であるGenericPortletクラスを元に作成している。doView()は表示用のメソッドで、リクエストをRenderRequest、レスポンスをRenderResponseとして受け取る。ここではRenderResponseからWriterを取得して文字を出力している。

リスト1 HelloWorldPortlet.java

package apisample.portlet;

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

public class HelloWorldPortlet extends GenericPortlet {
    public void doView(RenderRequest request, RenderResponse response)
        throws PortletException, IOException {
        response.setContentType("text/html");
        response.setTitle("Hello World");
        PrintWriter writer = response.getWriter();
        writer.println("<h2>Hello Portlet!</h2>");
    }
}

WEB-INF/web.xmlにはリスト2のように記述する。1つ目のポイントはservlet-classにorg.apache.pluto.core.PortletServletを指定し、init-paramでポートレット名を指定する点である。もう1つのポイントはurl-patternの先頭に「/PlutoInvoker/」というパターンが付加されている点で、/PlutoInvoker/の後ろはポートレット名を指定する。

リスト2 WEB-INF/web.xml

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

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">

    <servlet> 
        <servlet-name>HelloWorldPortlet</servlet-name> 
        <servlet-class>org.apache.pluto.core.PortletServlet</servlet-class> 
        <init-param> 
            <param-name>portlet-name</param-name> 
            <param-value>HelloWorldPortlet</param-value> 
        </init-param> 
        <load-on-startup>1</load-on-startup> 
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloWorldPortlet</servlet-name>
        <url-pattern>/PlutoInvoker/HelloWorldPortlet</url-pattern>
    </servlet-mapping>

</web-app>

ポートレット本体の定義はWEB-INF/portlet.xmlというファイルにリスト3のように記述することで行う。ここではポートレット名に対応して呼び出されるポートレットのクラスを指定する。

リスト3 WEB-INF/portlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<portlet-app version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet" xmlns="http://java.sun.com/xml/ns/portlet">
    <portlet>
        <portlet-name>HelloWorldPortlet</portlet-name>
        <display-name>HelloWorld</display-name>
        <portlet-class>apisample.portlet.HelloWorldPortlet</portlet-class>
        <portlet-info>
            <title>Hello World</title>
        </portlet-info>
    </portlet>
</portlet-app>

これをコンパイルしてWARファイルを作成し、Tomcatにデプロイする。この時点でPlutoの管理ページである「Pluto Admin」ページを表示させると、図3のようにHellWorldPortletがポートレットとして選択できるようになっている。ここでは新たに「Hello World」というページを作成し、そこにHelloWorldPortletを1つだけ配置してみた。すると図4のように「Hello World」ページが追加され、これを選択すると図5のように表示される。

図3 「Pluto Admin」を表示すると「HellWorldPortlet」が選択できるようになっている

図4 いちばん右のタブに「Hello World」が追加されている

図5 「Hello World」タブを選ぶと「Hello Portlet!」が表示された

23/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る

提供:マイナビ

会員登録はこちら

大学・大学院・短大・専門学生向けの就職情報サイト「マイナビ2010」「マイナビ2009」に今すぐ登録しよう!  大手企業からベンチャー企業までの約13,000社の企業情報を公開、エントリーが可能です。2010年卒予定の方は「マイナビ2010」に、2009年卒予定の方は「マイナビ2009」に登録してください。

毎日コミュニケーションズはプライバシーマークを取得しています。



人気記事

一覧

イチオシ記事

新着記事