本文へジャンプ

Lotus > Lotus Developer Domain > 
   
 

Domino 用の JSR 168 ポータル・アプリケーションの構築

 
   
 
コンテンツ
JSR 168 ポートレット
ポートレットの設計
DAO 設計
すべてを一緒に配置する
まとめ
ダウンロード
リソース
筆者について(原文のまま)

Raj Balasubramanian, Consulting IT Architect, IBM

レベル:上級
原文の掲載:2005年11月29日
更 新 日:2006年05月26日更新
原文はこちら (US)


以前の記事では、Web を介して Lotus Domino データベースを操作する DXL フレームワークの作成について解説しました。この記事では、Domino データベースへのフロントエンドとして JSR 168 ポータル・アプリケーションを構築する方法に注目します。


developerWorks: Lotus 記事『Notes/Domino データにアクセスするためのカスタム DXL フレームワーク』では、3 つのシンプルなエージェントを使用して、Web 経由で Domino データベースを表示、作成、更新する DXL フレームワークの作成方法を解説しました。この記事では、Domino データベースへのフロントエンドとして JSR 168 ポータル・アプリケーションを構築する方法を取り上げます。

この記事は、Domino および Web 開発の経験があり、前の DXL フレームワークの記事を読まれた方を対象に書かれています。


JSR 168 ポートレット

この記事で例として用いるユーザー・インターフェースは JSR 168 ポートレットのセットで構成され、Domino アプリケーションにアクセスするためのフロントエンドを提供します。この記事のコード・ベースを適切に活用するために、設計のベスト・プラクティスを使用して、ユーティリティーおよびデータアクセス用のクラスを構築します。この記事では、データアクセス・クラスを活用する JSR 168 ベースのポートレットを紹介します。データアクセス・クラスについては、今後の記事で取り上げる予定です。これらのクラスは、フロントエンドの設計またはプラットフォームに関連しない、あるいは依存しない形で設計されています。このため、今後の記事でも、リッチアプリケーションの設計に同じクラスを使用します。また、同じクラスを使用して、任意の Domino アプリケーションに容易にアクセスできます。

図 1 は、この記事で解説するさまざまなコンポーネントとその相互関係をシステム・レベルで示したものです。

図 1. コンポーネントとその相互関係


通常のユーザーは Web ブラウザーを介してアプリケーションにアクセスします。アプリケーションは JSR 168 ベースのポートレットで、Jetspeed 2 ポートレット・コンテナーが実行されている Tomcat 5.0.30 でホストされています。バックエンドの Domino Server ではリリース 6.5.1 が実行され、このサーバー上でターゲットの Domino アプリケーション (dxlnab.nsf) がホストされています。このアプリケーションは、カスタム DXL エージェントを持つ Domino ディレクトリです (エージェントの詳細については、記事『Notes/Domino データにアクセスするためのカスタム DXL フレームワーク』を参照してください)。

フロントエンド

まずは、フロントエンドから見ていきましょう。最終的な実働アプリケーションのさまざまな状態を下図に示します。いずれも、3 つのカスタム・エージェントが追加された Domino ディレクトリにアクセスしています。この記事の目的に即して、バックエンドの文書からは主要なフィールド (First Name、Last Name、Full Name)だけが公開されています。フィールドの追加方法については後述します。

図 2 は、アプリケーション・インターフェースの最初の画面を示します。

図 2. 最初の画面


DXL Notes View ポートレットに表示されている文書をクリックすると、文書の詳細が表示されます (図 3 参照)。

図 3. 文書の詳細


「create」ボタンをクリックすると、図 4 に示す画面が表示されます。

図 4. 文書作成の画面


「edit」ボタンをクリックすると、図 5 に示す画面が表示されます。

図 5. 編集画面


アプリケーションを操作する基本的な流れは次のようになります。
  1. View ポートレットと Doc ポートレットという 2 つのポートレットを使用してページに入ります。View ポートレットには、バックエンドの Domino ディレクトリからのビュー・データが 10 行分表示されます。ビュー内の移動用に [Previous] ボタンと [Next] ボタンがあります。
  2. 各ビュー・エントリー内の矢印 ( -> ) リンクをクリックすると、文書の詳細情報が表示されます (この例では、いくつかのフィールドしか表示されていませんが、表示数に制限はありません)。
  3. 次に、現在の文書の編集または新規文書の作成を選択できます。
  4. 現在の文書の編集を選択すると、特定のフィールド用の編集フィールドが表示されます (図 5 参照)。この時点で、変更を行い、変更内容を保存できます。変更した内容は、すぐに View ポートレットに反映されます。また、変更をキャンセルすることもできます。
  5. 新規文書の作成を選択すると、Doc ポートレットに文書作成の画面 (図 4) が表示されます。この段階で、新しい名/姓およびフルネームを入力し、新規エントリーを保存できます。View ポートレットが更新され、変更内容が反映されます。ここでも、変更をキャンセルできます。

ポートレットの開発について

多くの方に読んでいただくために、ポートレット・アプリケーションの構築には、Rational Application Developer などの高度なツールは使用せず、Eclipse を使用しています。構築およびデプロイ用のツールとして Xdoclet と Maven を使用しました。また、アプリケーションのデプロイとテストは、Apache Jetspeed Portal 2 で行いました。


上に戻る

ポートレットの設計

JSR 168 ベースの 2 つのポートレットは、状態とユーザーが実行したアクションに基づいて、doView メソッドを使用してさまざまな JSP 文書を表示します。アクションは、対応するポートレットの processAction メソッドで取り込まれます。その後、processAction によって設定/処理されたアクションに基づいて、doView の一部としてレンダリングが行われ、JSP 文書が表示されます。アプリケーションの JSP/状態ベースのフロー図を図 6 に示します。

図 6. JSP/状態ベースのフロー図


2 つのポートレットは PortletSession を使用して通信します (詳細については、「JSR 168 FAQ」ページを参照してください)。View ポートレットは、アプリケーション・レベルのスコープ (PortletSession.APPLICATION_SCOPE) を使用して、文書オブジェクトを PortletSession 内の変数として設定します。Doc ポートレットはレンダリング時にこの変数を検索し、存在する場合は文書をレンダリングします。変数が存在しない場合、ポートレットは汎用メッセージを表示します。

ポートレット自体は、Facade および Value Object パターンで設計されています。両方のポートレットの portlet クラスは、すべてのサービス作業を facade に委任するコントローラーとして機能します。次に、facade は、実行されたアクションに基づいて適切な値オブジェクトを返すか、消費します。ポートレット用のすべてのビューは、JSP を使用して構築されます。この設計により、バックエンドでの将来的な変更から切り離されます。変更があった時点で、使用する facade を書き換えればよいのです。図 7 は、さまざまなクラスとその相互関係を示すクラス図です。

図 7. クラスとその相互関係


dxlobj パッケージと dxldao パッケージは、この記事のために設計された汎用データアクセス・クラスです。この 2 つのパッケージは、[チームルーム] またはカスタム NSF アプリケーションにアクセスするためにユーザーが使用できるように設計されています。Data Access Objects (DAO) は汎用的な方法で設計され、バックエンド・アプリケーションには依存しません。

2 つのポートレットの View (raj.portlets.DXLView) と Doc (raj.portlets.DXLDoc) は、facade (raj.facade.NABFront) に依存して、バックエンドの Domino アプリケーションにアクセスするすべての作業を行います。ビューはそれ自身が表示するアプリケーション・データと不可分なので、これらの設計はアプリケーション固有のものになります。一方、facade は View ポートレット用に people 値オブジェクト (raj.vo.People) を返すか、Doc ポートレット用に person 値オブジェクト (raj.vo.Person) を返します。また、facade は person 値オブジェクトを受け入れ、バックエンドでユーザー・エントリーを更新または作成します。2 つの値オブジェクトには、バックエンドの Domino 文書内のフィールドに関連する属性が含まれています。たとえば、raj.vo.Person の fname 属性は、バックエンドの Domino データベースの Person フォーム内の FirstName フィールドに対応します。前述のように、この記事では、バックエンド・アプリケーションから 3 つのフィールドだけが公開されています。ポートレットの文書ビューに作成モードおよび編集モードで Company Name を公開する方法を説明することにより、クラスとポートレットの設計について掘り下げます。

これまでに示したように、ポートレットの設計はアプリケーションに大きく依存します。このため、[チームルーム] データベースがあり、2 つのポートレットを使用して [Domino チームルーム] にアクセスしたい場合は、バックエンドの目的の Domino データベース内にあるフィールド (データ) を公開する適切な値オブジェクトを持つ Teamroom View ポートレットと Teamroom Doc ポートレットを作成することになります。


上に戻る

DAO 設計

次に、データアクセス・ユーティリティーの設計を簡単に見ていきましょう。データアクセス用にユーティリティーを用いることを決めた最大の理由は、どのようなタイプの Domino データベースにアクセスするときも、同じクラスを使用できるからです。設計はデータベースに依存しません。また、ユーティリティーは異なる認証タイプをサポートする機能を持ちます。現在実装されているのは、基本認証とセッションベース認証 (LTPA) です。SSL のサポートが必要な場合は、ビュー (MVC など) はそのままにしておき、ユーティリティー・クラスを変更してサポートを追加できます。

カスタム DXL DAO クラスは、Apache Jakarta プロジェクトの HttpClient サブプロジェクトを使用します。DXL データを get/post するための Domino Server へのすべての接続は、これらのクラスを使用しています。解析には、XML org.xml.sax パッケージ (SAX 処理用) と javax.xml パッケージが使用されます。実際のパッケージは、この記事の最後にある「ダウンロード」セクションからダウンロードできます。また、「ダウンロード」セクションには、参照用として Java Doc が掲載されています。


上に戻る

すべてを一緒に配置する

JSR 168 ポートレートのセット (raj.portlets.DXLDoc および raj.portlets.DXLView) は、データのロードと更新を raj.facade.NABFront クラスに委任します。次に、このクラスは作業を DAO ユーティリティーに委任します。ポートレット自体は、ポートレット・コンテキストを使用して、Domino データベースにアクセスするためのランタイム・パラメーターを取得します (名前、ビュー、認証タイプ、証明書、Domino Server とポートなど)。これらのランタイム・パラメーターをアプリケーション・コンテキストで持つことには問題ないため、ランタイム・パラメーターは両方のポートレットで共有されます。

View ポートレット

View ポートレット (raj.portlets.DXLView) の動作は、次のとおりです。
  1. ポートレット・コンテナーがポートレットをロードすると、ポートレットは初期化されます。初期化の一部として、ポートレット・コンテキストからランタイム・パラメーターがロードされます。この方法の一部で、DAOConfig オブジェクトが初期化され、ポートレット・コンテキストから生成されます。
  2. ユーザーがポートレットを含むページにアクセスすると、ポートレット・コンテナーはポートレットの doView メソッドを呼び出します。このメソッドは DAOConfig オブジェクトを渡し、ワーカー・クラス NABFront を初期化します。View ポートレットの doView メソッドは、NABFront の getPeople メソッドを呼び出します。
  3. NABFront は DXLDAOFactory を初期化し、DXLViewObject を取得するためのハンドルを取得します。
  4. DXLDAOFactory は ViewXML を初期化し、ViewXML プロセス・メソッドを呼び出します。
  5. ViewXML のプロセス・メソッドは、HttpConnect の getData メソッドを使用してターゲットの Domino Server から XML を取得します (どのサーバー、ポート、データベース、ビューなどを使用するかの詳細は、DAOConfig オブジェクトに含まれています)。
  6. ViewXML は SAX パーサーを使用して XML を処理し、DXLViewObject を作成して、これを DXLDAOFactory に渡します。
  7. DXLDAOFactory は DXLViewObject を NABFront に渡します。
  8. NABFront は DXLViewObject から特定のデータを抽出し、ローカライズされた People オブジェクトをポートレットに返します。
  9. ポートレットの doView メソッドは People オブジェクトを request 属性にセットし、要求をビュー JSP (page/view.jsp) に送信します。
  10. ユーザーは、ポートレット内でビューの表示を見ます。

文書の詳細

DXLDoc ポートレットがどのように文書の詳細を示すのかを説明します。
  1. ポートレット・コンテナーがポートレットをロードすると、ポートレットは初期化されます。初期化の一部として、ポートレット・コンテキストからランタイム・パラメーターがロードされます。この方法の一部で、DAOConfig オブジェクトが初期化され、ポートレット・コンテキストから生成されます。
  2. ユーザーが View ポートレット内の文書リストを見て、詳細を表示したい文書をクリックすると、processAction メソッドが起動されます。このメソッドは、初期化された NABFront の getPerson メソッドを呼び出し、選択された文書の UNID を渡します。
  3. NABFront は getDocObject を呼び出します。
  4. DXLDAOFactory は DocDXL を初期化し、parseXML メソッドを呼び出します。
  5. DocDXL の parseXML メソッドは、HttpConnect の getData メソッドを使用してターゲットの Domino Server から XML (文書の DXL) を取得します (どのサーバー、ポート、データベース、ビューなどを使用するかの詳細は、DAOConfig オブジェクトに含まれています)。
  6. DocDXL は DOM パーサーを使用して XML を処理し、DXLViewNoteObject を作成して、これを DXLDAOFactory に渡します。
  7. DXLDAOFactory は DXLViewNoteObject を NABFront に渡します。
  8. NABFront は DXLViewNoteObject から特定のデータを抽出し、ローカライズされた Person オブジェクトをポートレットに返します。
  9. View ポートレットの processAction メソッドは、dxlperson request パラメーターとして Person オブジェクトを設定します。この属性のスコープは APPLICATION_SCOPE に設定されます。
  10. Doc ポートレットの doView メソッドは People オブジェクトを request 属性にセットし、要求をビュー JSP (page/view.jsp) に送信します。これによって、ユーザー・ビューが表示されます。ユーザーは、ポートレット内でビューの表示を見ます。
  11. doView メソッドはdxlperson request 属性から Person オブジェクトを取得し、要求をビュー JSP (page/viewdoc.jsp) に送信します。
  12. ユーザーは、選択したビューの詳細を Doc ポートレットで見ます。

文書の編集プロセスの処理手順も同様ですが、異なる URL を使用し、HttpConnect の POST メソッドを使用して Doc ポートレットからのデータを保存します。文書の作成処理も編集に似ていますが、View ポートレットからの情報はまったく必要ありません。この機能で使用される URL も異なっています。

他のフィールドを表示するときは (たとえば、Doc ポートレットで)、以下の手順に従います。
  1. 他のフィールドとそれに対応する getter/setter を追加することにより、raj.vo.Person で Person 値オブジェクトを更新します。
  2. facade NABFront を変更し、DXL 内の適切なアイテム名と照合することにより、バックエンドからのフィールドに適切な値を生成します。
  3. ポータル・アプリケーションで viewdoc.jsp を変更し、Person オブジェクトからの適切な値を JSP ページに表示します。


上に戻る

まとめ

この記事では、『Notes/Domino データにアクセスするためのカスタム DXL フレームワーク』で説明したカスタム DXL フレームワークを活用し、Domino ディレクトリにアクセスする JSR 168 ポートレット・アプリケーションを構築する方法を解説しました。Java ベースのプラットフォームからアクセスする方法の中心となるのは、この記事で紹介した Data Access Objects (DAO) です。今後の記事では、DAO の残りの部分をカバーすると共に、Linux で Eclipse ベースのリッチクライアント・アプリケーションを使用して同じ Domino ディレクトリにアクセスする方法を解説します。

上に戻る

ダウンロード

説明ファイル名サイズダウンロード方法
DXL ポートレットのサンプルDXLPortlets.war235KBFTP
dxlobj.jar ファイルdxlobj.jar16KBFTP
dxldao.jar ファイルdxldao.jar3KBFTP
ダウンロード方法の説明 (US) Adobe® Reader®が必要


上に戻る

リソース

上に戻る

筆者について(原文のまま)

Raj Balasubramanian is a Consulting IT Architect for IBM Software Services for Lotus (ISSL). He works on customer engagements delivering application and infrastructure related projects. When he is not travelling to customer sites or reading a math book, he spends time talking about robots and the new Mars rover with his sons.

上に戻る