目次


JSF、Web サービス、OJB を使用した CRUD 操作

Comments

はじめに

SOA プラットフォームをベースにしたコア・ビジネス・ロジックのプレース・ホルダーとして Web サービスが導入されるようになるにつれ、独立したレイヤー構造でのエンタープライズ・アプリケーション開発が可能になり、その結果として開発や保守も容易になっています。

この記事では、ユーザー・インターフェース・レイヤー、サービス・レイヤー、データベース・レイヤーの作成方法と、各レイヤー間のやり取りについて説明します。これは最終的には、エンド・ツー・エンドのエンタープライズ・ソリューションになります。どのようなエンタープライズ・ビジネスにおいても CRUD 操作が基本の操作となるため、CRUD 操作を行う方法がわかれば、SOA ベースのソリューションの設計や開発の概要を理解できることになります。この記事ではまた、SOA ベースのソリューションの技術的な課題に対処する方法を示すために、JSF を使用してユーザー・インターフェース・レイヤーを作成し、また OJB を使用してデータ・レイヤーでのデータ処理を行います。

図 1. Web サービス
Web サービス
Web サービス

Java サーバー・インターフェース

UI (ユーザー・インターフェース) レイヤーの作成は JSF (Java Server Faces) 技術を使って行います。UI レイヤーには以下のものが含まれます。

  • 一連の API。これらの API によって、UI コンポーネントの表示とステート管理、イベントの処理と入力の検証、値の変換、ページ・ナビゲーションの定義、国際化とアクセシビリティーのサポートを行います。
  • デフォルトの UI コンポーネント・セット
  • JSP ページ内で JavaServer Faces インターフェースを表現するための、2 つの JSP (JavaServer Pages) カスタム・タグ・ファイブラリー。
  • サーバー・サイドのイベント・モデル
  • ステート管理
  • Managed Bean (依存性注入によって作成された JavaBeans )
  • JSP 2.0 と JSF 1.2 の両方のための Unified Expression Language

WebSphere Integration Developer (WID) 6.1 で JSF プロジェクトを作成する方法は、通常の Web プロジェクトを作成する方法と似ています。WID のユーザー・フレンドリーな機能を利用すると、Web プロジェクトを容易に作成することができます。以下では動的な Web プロジェクトを作成することから始めます。そのステップとして、最初に WID 6.1 で JSF プロジェクトを作成します。

  • 「Project Explorer (プロジェクト・エクスプローラー)」を右クリックし、「New (新規)」 > 「Dynamic Web Project (動的 Web プロジェクト)」の順に選択します。
  • 「Project name (プロジェクト名)」と「EAR name (EAR 名)」を指定します。
  • 組み込み機能が提供するフィーチャーを使うための「Basic Facet Support (基本ファセット・サポート)」として、JSTL などの必要な「Project Facet (プロジェクト・ファセット)」にチェックを入れます 。
  • 「Context Root (コンテキスト・ルート)」、「Content Directory (コンテンツ・ディレクトリー)」、「Java Source Directory (Java ソース・ディレクトリー)」を指定します。
  • 「WebContent」を右クリックし、「New (新規)」 > 「JSP」の順に選択して新しい JSF ページを作成します。
  • JSF ページの名前を指定します。
図 2. JSP テンプレートをインポートする
JSP テンプレートをインポートする
JSP テンプレートをインポートする

「Design (デザイン)」ビューでページを開き、必要なコンポーネントを「Enhanced Faces Components (拡張 Faces コンポーネント)」から追加します。これらの拡張 Faces コンポーネントによって、アプリケーションの開発に通常使用されるリッチなウィジェット・セット (ドロップダウン・リスト、選択リスト、データ表、パネルなど) が提供されます。JSF の最大の利点は、多くの UI コンポーネントに基本的なフォームで対応することができ、それらのコンポーネントを JavaBean で該当する操作に接続できる点にあります。適切なルック・アンド・フィールを実現するために、表の中でコンポーネントを作成し、使いやすくなるようにフィールドの並びや配置を調整して表示するようにします。

  • 「HTML Tags (HTML タグ)」 > 「Table (表)」の順に選択し、表の行数と列数を指定します。
  • 必要なラベルをフォーム・フィールドに追加します。
  • 「Enhanced Faces Components (拡張 Faces コンポーネント)」 > 「Input (入力)」の順に選択し、必要なセルにドラッグします。
  • 同じプロセスを繰り返し、他のコンポーネントを追加します。
図 3. JSF コンポーネントのプロパティー
JSF コンポーネントのプロパティー
JSF コンポーネントのプロパティー

「Properties (プロパティー)」タブをクリックし、コンポーネントのプロパティーを指定します。

ウィジェットやその他のコンポーネントを使用したページの設計が終わったら、次の部分に移り、これらのコンポーネントを JavaBean の該当プロパティーにマッピングします。JSF では JavaBean をManaged Bean と呼びます。Managed Bean はプロパティーを保持し、それらのプロパティーを操作する手段を提供します。Managed Bean を起動するためには以下のステップに従います。

  • 必要なプロパティーを持つ Managed Bean を作成します。
  • プロパティーを選択して右クリックし、「Generate Getters and Setters (getter および setter の生成)」を選択します。
  • メソッドを作成し、必要な操作 (実際のビジネス・ロジック、またはサービス呼び出し) を指定します。図 4 は Managed Bean の扱い方を示しています。
図 4. Managed Bean のプロパティーと操作
Managed Bean のプロパティーと操作
Managed Bean のプロパティーと操作
図 5. ページ・データ
ページ・データ

「Page Data (ページ・データ)」で「Use Bean (Bean を使用)」を右クリックし、「New (新規)」 > 「JavaBean」の順に選択します。

図 6. データ・コンポーネント
データ・コンポーネント

Faces Managed Bean を選択する

必要なプロパティーとメソッド呼び出しを持った Managed Bean を作成できたら、この Bean に対応するクラスの名前をこの Managed Bean の名前として指定します。クラスの機能と使い方により、この Bean のスコープを指定して再利用可能なものにすることができます。これらは faces-config.xml に反映されます。

この新しい Bean の定義を完成するためには、左下にある「Page Data (ページ・データ)」というパネルを使います。「Page Data (ページ・データ)」パネルで「Faces Managed Bean」を選択して更新すると、その Bean が、使用可能な変数とメソッドと共に表示されます。Websphere Integration Developer を使うと、JSF ページで設計、作成されたフィールドに Bean のプロパティーを直接マッピングすることができます。図 7 は WID に用意されたドラッグ・アンド・ドロップ機能を示しています。

図 7. Bean のプロパティーをドラッグ・アンド・ドロップする
Bean のプロパティーをドラッグ・アンド・ドロップする
Bean のプロパティーをドラッグ・アンド・ドロップする

Create (作成) と同様に、Retrieve (取得)、Update (更新)、Delete (削除) という他の操作に対するプロパティーと操作もマッピングすることができます。この 4 つの操作が完成したら、EAR をサーバーにデプロイし、UI から次のレイヤーにデータを送信するテスト・クライアントを使ってテストします。

  • 変数を、「Design (デザイン)」ビューの対応フィールドにマッピングします。
  • フォームの送信でトリガーされるメソッドを「Submit (送信)」ボタンにマッピングします。

Web サービスを使用する

Web サービスは UI レイヤーとデータベース・レイヤーを接続する相互運用レイヤーを構成します。

図 8. Web サービスの概要
Web サービスの概要
Web サービスの概要

サービスの定義は以下の 6 つの主な要素を使って行います。

  1. Types: 交換されるメッセージの記述に使われるデータ型を定義します。
  2. Message: 送信されるデータの抽象定義を表します。メッセージは論理部分で構成され、各論理部分は何らかの型システムの中の定義と関連付けられます。
  3. PortType: 一連の抽象操作を表します。各操作では入力メッセージと出力メッセージを参照します。
  4. Binding: 特定の portType によって定義される操作やメッセージに対する具体的なプロトコルとデータ・フォーマットの仕様を指定します。
  5. Port: バインディングのためのアドレスを指定し、それによって 1 つの通信エンドポイントを定義します。
  6. サービス: 関連する一連のポートを集約するために使われます。

Web サービスは、UI レイヤーとデータベース・レイヤーを接続する、相互運用可能なレイヤーを作成します。このため、変更が発生したときにこの Web サービス・レイヤーのみを再デプロイすれば、ビジネス・ロジックの保存やルールの定義が可能になります。この相互運用可能なレイヤーによって、コア・ビジネス・ロジックに影響を与えずに UI とバックエンド・レイヤーを柔軟にアップグレードすることができます。

ここでは以下の 3 つの主なステップに従って Web サービスを作成します。

  1. データ・オブジェクトと WSDL を保存するライブラリーを作成します。
  2. 生成された Java スケルトンを保存する Web プロジェクトを作成します。
  3. 生成されたクライアントを保存する Java プロジェクトを作成します。

ライブラリーを作成する

ライブラリーを作成し、作成された WSDL をそのライブラリーに保存することによって、そのライブラリーを他のプロジェクトと共有することができ、また作成された WSDL を管理するための共通の場を提供することができます。またこのライブラリーは、プロジェクト全体で使用されるデータ・オブジェクトの保存にも使用することができます。そのため、これらのデータ・オブジェクトに対して、どの時点でどのような更新を行う場合にも、更新を 1 ヶ所で行うことができ、他のプロジェクトとの競合を避けることができます。

データ・オブジェクトの定義は、プロジェクトで使用される操作とデータのタイプに応じて行われます。日常のビジネス操作では、データは意味のある形式のオブジェクトへとラップされ、XML フォーマットで送信されます。複合オブジェクトへのラップや、複合オブジェクトからのラップの解除は XML パーサーによって行われ、それによってビジネスの要求への対応がなされます。こうした XML パーサーには数多くの種類があります。これらのデータ・オブジェクトはライブラリーなどの共通の場所で定義されており、インターフェースによってインポートされるため、実際の WSDL 定義を変更せずに必要に応じて更新することができます。

ライブラリーとデータ・オブジェクトを作成する場合は以下のステップに従います。

  • 「Business Ingegration (ビジネス・インテグレーション)」ビューで右クリックし、「New (新規)」 > 「Library (ライブラリー)」の順に選択し、ウィザードに従ってライブラリーを作成します。
  • 「WebContent」を右クリックし、「New (新規)」 > 「Other (その他)」 > 「XML」 > 「XML Schema (XML スキーマ)」の順に選択して新しい XSD を作成します。
  • 新しく作成された XSD を右クリックし、「Business Object Editor (ビジネス・オブジェクト・エディター)」を開きます (図 9)。
  • 「Properties (プロパティー)」タブで要素の名前と型を指定します。

この時点で、オブジェクト群のオブジェクトをグループ化することができ、全体として複合オブジェクトを作成することができます。この複合オブジェクトの各オブジェクトは、整数、ストリング、ブール値などの基本データ型を含みます。複合オブジェクトの基本的な構造を示したものが図 9 と図 10 です。

図 9. Business Object Editor を扱う
Business Object Editor を扱う
Business Object Editor を扱う
図 10. 複合ビジネス・オブジェクトの構造
複合ビジネス・オブジェクトの構造
複合ビジネス・オブジェクトの構造

データ・オブジェクトが用意できたら、WSDL を作成します。この WSDL は、これらのデータ・オブジェクトを入力引数に取り、操作のタイプに応じた出力を生成します。これらのデータ・オブジェクトを使うためには、これらのオブジェクトを WSDL にインポートし、対応する名前空間を指定する必要があります。

JavaBean を生成する

上で作成した WSDL は、入力パラメーターと出力パラメーターを使って実行される操作を定義します。実際のコア・ビジネス・ロジックは、これらの操作を実装することで定義されます。そのためには Java Bean シェルを生成します。図 11 は Java Bean シェルを作成する方法を示しています。

図 11. 複合ビジネス・オブジェクトの構造
複合ビジネス・オブジェクトの構造
複合ビジネス・オブジェクトの構造

WSDL を右クリックし、「Web Services (Web サービス)」 > 「Generate Java Bean skeleton (Java Bean スケルトンの生成)」の順に選択します。

図 12. 「Specify Service Project Settings (サービス・プロジェクト設定の指定)」画面
「Specify Service Project Settings (サービス・プロジェクト設定の指定)」画面
「Specify Service Project Settings (サービス・プロジェクト設定の指定)」画面

「Service project (サービス・プロジェクト)」の名前、「Service Project type (サービス・プロジェクト・タイプ)」、「Service EAR project (サービス EAR プロジェクト)」の名前を指定します。

クライアントを生成する

実装されたクラスの機能をチェックするために、クライアントを生成します。このクライアントによって実際に Web サービスを呼び出し、すべてが適切かどうかを確認します。実際の場合には、WSDL をユーザーに提供し、この WSDL からユーザーがクライアントを生成して必要な機能を呼び出します。図 13 はクライアントの作成方法を示しています。

図 13. クライアントを生成する
クライアントを生成する
クライアントを生成する

WSDL を右クリックし、「Web Services (Web サービス)」 > 「Generate Client (クライアントの生成)」の順に選択します。

図 14. 「Specify Client Project Settings (クライアント・プロジェクト設定の指定)」画面
「Specify Client Project Settings (クライアント・プロジェクト設定の指定)」画面
「Specify Client Project Settings (クライアント・プロジェクト設定の指定)」画面

「Client project (クライアント・プロジェクト)」をクリックし、クライアント・プロジェクトの名前を指定します。

ObJectRelationalBridge (OJB)

データはどのようなプロジェクトでも主要コンポーネントであるため、適切なときに適切な方法でデータを操作、保存する必要があります。応答の遅れ、ダーティー・リード/ライトはシステムのパフォーマンスを低下させ、システム全体としての一貫性を損ないます。この記事では、DB レイヤーは終端に置かれてデータを保存しており、このデータが UI レイヤーとサービス・レイヤーを通じて渡されます。

ORM ツールを導入すると、データの操作と保守が容易になり、データを直接 Java にマッピングすることができます。OJB はそうした ORM ツールの 1 つであり、Apache によって設計、開発されたものです。OJB を使用すると、リレーショナル・データベースに Java オブジェクトを永続化することが可能になります。

以下は OJB の重要な特徴を挙げたものです。

  • 複数の永続化 API をサポートできるため、柔軟な対応が可能です。
  • OJB を使用して設計、開発されたアプリケーションは、将来の機能強化にスケーラブルに対応することができます。
  • JNDI ルックアップと Bean 管理による持続性 (BMP: Bean Managed Persistence) をサポートしています。
  • XML ベースの ORM によって、実行時の操作が容易になります。
  • 構成が柔軟になり、一連の定義済みコンポーネントから選択可能なプラグイン・メカニズムを実現することができます。
  • 100% Pure Java 指向のオープンソースによって、開発が迅速になります。

UI レイヤーとサービス・レイヤーが完成したら、実際にデータをデータベースに保存するデータベース・レイヤーに移ります。OJB に用意されたアノテーション機能と XML 構成機能を利用すると、テーブルの列を Bean のプロパティーに直接マッピングできるため、データの操作が容易になります。OJB に組み込みのメソッドを利用すると、オブジェクト・モデルでのデータの保存、更新、削除を容易に行うことができます。

図 15. 新規 Java プロジェクトを作成する
新規 Java プロジェクトを作成する
新規 Java プロジェクトを作成する

これを実現するためには、DAO とドメイン・クラスを保存する 2 つのメイン・パッケージを持つ Java プロジェクトを作成します。Java の命名規則に従い、適切な名前を持つパッケージを作成します。ドメイン・パッケージは、プロパティーを特定のテーブルの列のプロパティーにマッピングするドックレットを含むクラスを保存します。一方、DAO パッケージは、ドメイン・オブジェクトを保存する実際の操作のメソッドを含みます。必要な JAR を lib フォルダーにインポートすると、データベースのサポートに必要な JAR が含まれるようになります。この記事ではデータベースとして DB2 を使用するため、DB2 に必要な JAR をインポートします。

図 16. repository_database.xml を構成する
repository_database.xml を構成する
repository_database.xml を構成する

基本的なパッケージ構造を作成でき、従属 JAR ファイルをインポートしたら、今度は XML ファイルを構成します。これらの XML ファイルは config フォルダーに保存されます。メインの構成ファイルには、データベース名や他のクレデンシャルの構成に使われる repository_database.xml が含まれています。repository_database.xml の次に扱うのは build.xml ファイルです。build.xml ファイルは、必要な JAR のロード元となるクラスパスとドメイン・オブジェクトの場所とをマッピングします。また build.xml は、project-schema.xml ファイルと repository_user.xml ファイルを配置する場所も指定します。この 2 つのファイルは、build.xml ファイルが実行されると config フォルダーの中に生成されて配置されます。図 17 は典型的な build.xml ファイルを示しています。

図 17. build.xml を構成する
build.xml を構成する
build.xml を構成する

UI レイヤーをサービス・レイヤーと統合する

これで 3 つの個別レイヤーが用意できたので、これらのレイヤー同士を統合してエンド・ツー・エンドのフローを作成する必要があります。最初に、UI と Web サービスとを統合します。UI は動的な Web プロジェクトであるため、サービス・クライアントの JAR を追加すると、Web サービスで定義された操作を UI レイヤーで利用できるようになります。そのためには、以下のようにします。

図 18. Web サービス・クライアントを UI に追加する
Web サービス・クライアントを UI に追加する
Web サービス・クライアントを UI に追加する

UI プロジェクトを右クリックし、「Properties (プロパティー)」 > 「J2EE Module Dependencies (J2EE モジュール依存関係)」の順に選択し、クライアントの JAR にチェックを入れます。

サービス・ロケーターを使用してサービスを呼び出し、適切なポート・タイプを持つエンドポイントを見つけます。サーバーが別のポートをリッスンしている場合には、それに応じて適切に変更する必要があります。UI レイヤーのオブジェクトのタイプに応じて、サービス・レイヤーで定義されるオブジェクトに UI レイヤーのオブジェクトをマッピングします。図 19 は、UI レイヤーの Managed Bean から Web サービスを呼び出すサンプル・コードを示しています。

図 19. Managed Bean から サービスを呼び出す
Managed Bean から サービスを呼び出す
Managed Bean から サービスを呼び出す

サービス・レイヤーをデータベース・レイヤーと統合する

サービス・レイヤーをデータベース・レイヤーと統合するためには、データベース Java プロジェクトを依存関係 JAR として、Web サービス・プロジェクトの J2EE モジュールの依存関係の中に追加します。注意する点として、データベース・プロジェクトに必要な JAR が、Web サービス・プロジェクト用に生成される EAR に追加されていることを確認します。図 20 は、データ・プロジェクトを依存関係 JAR として Web サービス・プロジェクトに追加する方法を示しています。

図 20. データベース JAR の依存関係を追加する
データベース JAR の依存関係を追加する
データベース JAR の依存関係を追加する

Web サービス・プロジェクトを右クリックし、「Properties (プロパティー)」 > 「J2EE Module Dependencies (J2EE モジュール依存関係)」の順に選択し、DB の JAR にチェックを入れます。

図 21. ドメイン・オブジェクトと DAO オブジェクトを作成する
ドメイン・オブジェクトと DAO オブジェクトを作成する
ドメイン・オブジェクトと DAO オブジェクトを作成する
  • ドメイン・オブジェクトと DAO オブジェクトを作成します。
  • 適切な DAO を使ってドメイン・オブジェクトを設定します。

まとめ

この記事では、サービスをコア・レイヤーとして使用し、また JSF や OJB といった最先端の技術を使用して、SOA プラットフォーム上でアプリケーションを迅速に開発する方法を概説しました。また、ユーザー・インターフェース・レイヤー、サービス・レイヤー、データベース・レイヤーの作成方法と、各レイヤー同士を統合する方法についても説明しました。

これらの方法は、SOA を実践し、可視化するための基本的な方法であり、またあらゆる種類の技術を結合することが可能な、サービスの相互運用性を実現するための基本的な方法であると言えます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=SOA and web services
ArticleID=449846
ArticleTitle=JSF、Web サービス、OJB を使用した CRUD 操作
publish-date=10302009