|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Domino 用の JSR 168 ポータル・アプリケーションの構築
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Raj Balasubramanian, Consulting IT Architect, IBM レベル:上級 原文の掲載:2005年11月29日 更 新 日:2006年05月26日更新
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. 編集画面 ![]() アプリケーションを操作する基本的な流れは次のようになります。
ポートレットの開発について 多くの方に読んでいただくために、ポートレット・アプリケーションの構築には、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) の動作は、次のとおりです。
文書の詳細 DXLDoc ポートレットがどのように文書の詳細を示すのかを説明します。
文書の編集プロセスの処理手順も同様ですが、異なる URL を使用し、HttpConnect の POST メソッドを使用して Doc ポートレットからのデータを保存します。文書の作成処理も編集に似ていますが、View ポートレットからの情報はまったく必要ありません。この機能で使用される URL も異なっています。 他のフィールドを表示するときは (たとえば、Doc ポートレットで)、以下の手順に従います。
まとめこの記事では、『Notes/Domino データにアクセスするためのカスタム DXL フレームワーク』で説明したカスタム DXL フレームワークを活用し、Domino ディレクトリにアクセスする JSR 168 ポートレット・アプリケーションを構築する方法を解説しました。Java ベースのプラットフォームからアクセスする方法の中心となるのは、この記事で紹介した Data Access Objects (DAO) です。今後の記事では、DAO の残りの部分をカバーすると共に、Linux で Eclipse ベースのリッチクライアント・アプリケーションを使用して同じ Domino ディレクトリにアクセスする方法を解説します。
ダウンロード
リソース
筆者について(原文のまま)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.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||