ポルトレット仕様の紹介、パート1
エンタープライズポータルの数が増えるにつれ、さまざまなベンダーが、ポートレットと呼ばれるポータルコンポーネント用のさまざまなAPIを作成しました。このさまざまな互換性のないインターフェイスは、アプリケーションプロバイダー、ポータルカスタマー、およびポータルサーバーベンダーに問題を引き起こします。これらの問題を克服するために、ポートレット仕様であるJSR(Java Specification Request)168が開始され、ポートレットとポータル間の相互運用性が提供されました。
JSR 168は、ポートレットを、ポートレットコンテナによって管理され、要求を処理して動的コンテンツを生成するJavaベースのWebコンポーネントとして定義します。ポータルは、情報システムにプレゼンテーション層を提供するプラグ可能なユーザーインターフェイスコンポーネントとしてポートレットを使用します。
JSR168の目標は次のとおりです。
- ポートレットのランタイム環境、またはポートレットコンテナを定義します
- ポートレットコンテナとポートレット間のAPIを定義します
- ポートレットの一時データと永続データを保存するメカニズムを提供する
- ポートレットにサーブレットとJSP(JavaServer Pages)を含めることができるメカニズムを提供する
- 簡単にデプロイできるように、ポートレットのパッケージを定義します
- JSR168ポータル間でのバイナリポートレットの移植性を許可する
- Web Services for Remote Portlets(WSRP)プロトコルを使用して、JSR168ポートレットをリモートポートレットとして実行します。
IT業界はJSR168を広く受け入れています。ポータルスペースのすべての主要企業は、JSR 168エキスパートグループの一部です:Apache、ATG、BEA、Boeing、Borland、Broadvision、Citrix、EDS、Fujitsu、Hitachi、IBM、Novell、Oracle 、SAP、SAS Institute、Sun Microsystems、Sybase、TIBCO、およびVignette。公式サポーターのリストはさらに長くなっています。
現在、JSR 168は公開レビュー中であり、最終バージョンは2003年9月に予定されています。
この記事では、最初にポータルとポートレットを定義し、次にAPIの基本オブジェクトを含むJSR168が導入する概念について説明します。次に、ユーザー情報、ローカリゼーション、キャッシングなど、JSRのより高度な機能について詳しく説明します。次に、ポータルベンダーが現在定義されている機能をポートレット仕様で拡張できるようにする拡張ポイントについて説明します。この記事は、ポートレットアプリケーションのパッケージ化とデプロイメントの説明で終わります。
Portlet仕様のシリーズ全体をお読みください。
- パート1:仕様の基礎となる用語と概念に足を踏み入れる
- パート2:ポートレットAPIのリファレンス実装がその秘密を明らかにする
基本的な定義
このセクションでは、ポータルの基本アーキテクチャ、ポートレットコンテナ、ポータルページなど、ポートレット仕様で使用される基本的な定義について説明します。
ポータル
ポータルは、Webベースの異なるソースからの個人化、シングルサインオン、およびコンテンツ集約を提供するアプリケーション、およびホスト情報システムのプレゼンテーション層です。集約は、Webページ内のさまざまなソースからのコンテンツを統合するプロセスです。ポータルには、カスタマイズされたコンテンツをユーザーに提供するための高度なパーソナライズ機能が備わっている場合があります。ポータルページには、さまざまなユーザー向けのコンテンツを作成するさまざまなポートレットのセットが含まれる場合があります。
図1は、ポータルの基本アーキテクチャを示しています。ポータルWebアプリケーションは、クライアント要求を処理し、ユーザーの現在のページでポートレットを取得してから、ポートレットコンテナを呼び出して各ポートレットのコンテンツを取得します。ポートレットコンテナは、ポートレットのランタイム環境を提供し、ポートレットAPIを介してポートレットを呼び出します。ポートレットコンテナは、Portlet InvokerAPIを介してポータルから呼び出されます。コンテナは、ポートレットプロバイダSPI(サービスプロバイダインターフェイス)を使用してポータルに関する情報を取得します。
ページ
図2は、基本的なポータルページのコンポーネントを示しています。ポータルページ自体は完全なマークアップドキュメントを表し、いくつかのポートレットウィンドウを集約します。ポートレットに加えて、ページはナビゲーション領域とバナーで構成されている場合もあります。ポートレットウィンドウは、ポートレットのタイトル、装飾、およびポートレットによって生成されたコンテンツを含むタイトルバーで構成されます。装飾には、ポートレットのウィンドウの状態とモードを変更するためのボタンを含めることができます(これらの概念については後で説明します)。

ポートレット
前述のように、ポートレットは、要求を処理して動的コンテンツを生成するJavaベースのWebコンポーネントです。ポートレットによって生成されるコンテンツはフラグメントと呼ばれ、特定のルールに準拠したマークアップ(HTML、XHTML、またはWML(Wireless Markup Language)など)の一部です。図3に示すように、フラグメントを他のフラグメントと集約して完全なドキュメントを形成できます。通常、ポートレットのコンテンツは他のポートレットのコンテンツと集約されてポータルページを形成します。ポートレットコンテナは、ポートレットのライフサイクルを管理します。
Webクライアントは、ポータルによって実装された要求/応答パラダイムを介してポートレットと対話します。通常、ユーザーは、リンクをたどったりフォームを送信したりするなどして、ポートレットによって生成されたコンテンツを操作します。その結果、ポータルはポートレットアクションを受信し、ユーザーの操作の対象となるポートレットに転送します。
ポートレットによって生成されるコンテンツは、ポートレットのユーザー構成に応じて、ユーザーごとに異なる場合があります。
ポートレットコンテナ
ポートレットコンテナはポートレットを実行し、必要なランタイム環境でそれらを提供します。ポートレットコンテナにはポートレットが含まれ、そのライフサイクルを管理します。また、ポートレット設定用の永続的なストレージメカニズムも提供します。ポートレットコンテナは、ポータルからホストされているポートレットでリクエストを実行するためのリクエストを受信します。ポートレットコンテナは、ポートレットによって生成されたコンテンツを集約する責任を負いません。ポータル自体が集約を処理します。
ポータルとポートレットコンテナは、アプリケーションスイートの単一のコンポーネントとして、またはポータルアプリケーションの2つの別個のコンポーネントとして一緒に構築できます。
コンセプト
このセクションでは、ポートレットのライフサイクル、インターフェイス、モードとウィンドウの状態、セッションアクセス、永続ストレージアクセス、サーブレットとJSPページを含める方法など、JSR168の基本的なプログラミングの概念について説明します。
ポートレットのライフサイクル
JSR168ポートレットの基本的なポートレットライフサイクルは次のとおりです。
- 初期化:ポートレットを初期化し、ポートレットを稼働させます
- リクエストの処理:さまざまな種類のアクションリクエストとレンダリングリクエストを処理します
- 破棄:ポートレットをアウトオブサービスにします
ポートレットコンテナは、ポートレットのライフサイクルを管理し、ポートレットインターフェイスで対応するメソッドを呼び出します。
ポートレットインターフェイス
すべてのポートレットは、ポートレットインターフェイスを実装するか、ポートレットインターフェイスを実装するクラスを拡張する必要があります。ポートレットインターフェイスは、次のメソッドで構成されています。
init(PortletConfig config):
ポートレットを初期化します。このメソッドは、ポートレットをインスタンス化した後に1回だけ呼び出されます。このメソッドは、ポートレットで使用される高価なオブジェクト/リソースを作成するために使用できます。processAction(ActionRequest request, ActionResponse response):
ユーザーがこのポートレットでアクションをトリガーしたことをポートレットに通知します。クライアント要求ごとに1つのアクションのみがトリガーされます。アクションでは、ポートレットはリダイレクトを発行したり、ポートレットモードまたはウィンドウの状態を変更したり、永続状態を変更したり、レンダリングパラメータを設定したりできます。render(RenderRequest request, RenderResponse response):
マークアップを生成します。現在のページのポートレットごとに、renderメソッドが呼び出され、ポートレットは、ポートレットモードまたはウィンドウの状態、レンダリングパラメータ、要求属性、永続状態、セッションデータ、またはバックエンドデータに依存するマークアップを生成できます。destroy():
ライフサイクルの終了をポートレットに示します。このメソッドを使用すると、ポートレットはリソースを解放し、このポートレットに属する永続データを更新できます。
ポートレットモード
ポートレットモードは、ポートレットが実行する機能を示します。通常、ポートレットは、現在実行している機能に応じて、さまざまなタスクを実行し、さまざまなコンテンツを作成します。ポートレットモードは、実行するタスクと生成するコンテンツをポートレットに通知します。ポートレットを呼び出すと、ポートレットコンテナは現在のポートレットモードをポートレットに提供します。ポートレットは、アクション要求を処理するときにプログラムでモードを変更できます。
JSR 168は、ポートレットモードを次の3つのカテゴリに分類します。
- 必要なモード:すべてのポータルは、編集、ヘルプ、および表示の各モードをサポートしている必要があります。ポートレットは、少なくともページのマークアップのレンダリングに使用される表示モードをサポートしている必要があります。編集モードは、ユーザーごとの設定を変更してポートレットマークアップをカスタマイズするために使用され、ヘルプモードはヘルプ画面を表示するために使用されます。
- オプションのカスタムモード:これらはポータルがサポートする可能性のあるモードです。オプションモードでは、ポートレットが呼び出されない場合があります。オプションのモードには、「about」メッセージを表示するAboutモードが含まれます。管理者がポートレットを構成できるようにする構成モード。Edit_defaultsモード。管理者が編集モードの値を事前設定できるようにします。ポートレットのプレビューを表示するプレビューモード。簡単に印刷できるビューをレンダリングするための印刷モード。
- ポータルベンダー固有のモード:これらのモードは仕様で定義されていないため、ベンダー固有です。
ウィンドウの状態
ウィンドウの状態は、ポートレットによって生成されたコンテンツに割り当てられるポータルページスペースの量を示します。ポートレットを呼び出すと、ポートレットコンテナは現在のウィンドウの状態をポートレットに提供します。ポートレットは、ウィンドウの状態を使用して、レンダリングする情報の量を決定できます。ポートレットは、アクションリクエストを処理するときに、プログラムでウィンドウの状態を変更できます。
JSR 168は、次のウィンドウ状態を定義します。
- 通常:ポートレットが他のポートレットとページを共有する可能性があることを示します。これはデフォルトのウィンドウ状態です。
- 最大化:ポートレットがポータルページ上の唯一のポートレットである可能性があること、またはポートレットがポータルページ内の他のポートレットと比較してより多くのスペースを持っているため、通常のウィンドウ状態よりも豊富なコンテンツを生成できることを示します。
- 最小化:ポートレットが最小限の出力のみをレンダリングするか、出力をまったくレンダリングしないことを示します。
これらのウィンドウ状態に加えて、JSR168ではポータルでベンダー固有のウィンドウ状態を定義できます。
ポートレットは、これら3つのウィンドウ状態のいずれかで呼び出すことができますが、3つの状態すべてに対して同じマークアップを自由に生成できます。
永続ストア
ポートレットは、PortletPreferences
オブジェクトを使用して特定のユーザーの永続データを格納できます。プリファレンスは、アクションフェーズで読み書きでき、レンダリングフェーズで読み取ることができます。設定を書き込むための推奨モードは、ユーザーにカスタマイズ画面を提供する編集モードです。プリファレンスは、string型またはstring型のキーに関連付けられたstring配列値のいずれかです。プリファレンスは、デプロイメント記述子のデフォルト値で事前設定できます。
プリファレンスとデプロイメント記述子内のポートレットの定義は、一緒にポートレットを定義します。これは、ポートレットエンティティと呼ばれることもあります。
セッション
JSR 168のセッションの概念はHttpSession
、Webアプリケーション用に定義されたものに基づいています。ポートレットアプリケーションはWebアプリケーションであるため、サーブレットと同じセッションを使用します。ポートレットが一時データをポートレット専用に格納できるようにするため、デフォルトのセッションスコープはポートレットスコープです。このスコープでは、ポートレットは、ユーザー要求全体で必要な、ポートレットエンティティに固有の情報を格納できます。このスコープで格納された属性は、2つのポートレット(または同じポートレット定義の2つのエンティティ)が互いの設定を上書きしないように、セッションでポートレットコンテナによってプレフィックスが付けられます。
ポートレットセッションスコープに加えて、JSR168はWebアプリケーションセッションスコープをサポートします。このスコープでは、Webアプリケーションのすべてのコンポーネントが情報にアクセスできます。この情報を使用して、同じWebアプリケーションの異なるコンポーネント間(たとえば、ポートレット間、またはポートレットとサーブレット間)で一時的な状態を共有できます。
サーブレット/ JSPページを含む
Model-View-Controllerパターンをサポートするには、ポートレットにサーブレットとJSPページから生成されたコンテンツを含めることができる必要があります。このようにして、ポートレットはコントローラーとして機能し、Beanにデータを入力し、出力をレンダリングするためのJSPページを含めることができます。
JSR 168では、サーブレットとJSPページのインクルードメカニズムはサーブレットAPIでも同じです。ポートレットコンテキストを介して、指定されたパスに対して要求ディスパッチャーが取得されます。include()
この方法は、その後、このリクエストディスパッチャオブジェクトで呼び出されます。
PortletRequestDispatcher rd = getPortletContext()。getRequestDispatcher(editJSP); rd.include(portletRequest、portletResponse);
WSRPとの連携
WSRPは、J2EE(Java 2 Platform、Enterprise Edition)や.Netなどのさまざまなプログラミング環境を使用するリモートマシンで実行されているポートレットによって生成されたコンテンツを集約します。WSRPサービスは、ポータルまたは他のアプリケーションをプラグアンドプレイする、プレゼンテーション指向のユーザー向けWebサービスです。それらは、ポータルを消費することにより、手動のコンテンツまたはアプリケーション固有の適応を必要とせずに、企業がコンテンツまたはアプリケーションを提供できるようにします。ポータルは、プログラミングの労力なしでWSRPサービスを簡単に集約できます。
JSR 168専門家グループは、JSR168とWSRPの間の概念を注意深く調整しました。次のリストは、主要な概念が両方の標準間でどの程度調整されているかを示しています。