ヘッダーをスキップ
Oracle SOA Suite開発者ガイド
10g(10.1.3.1.0)
B31839-01
  目次へ
目次
索引へ
索引

前へ
前へ
 
次へ
次へ
 

9.1 SOAシステムでのWebアプリケーション開発の概要

SOAシステムの一部となるWebアプリケーションの作成は、スタンドアロンのWebアプリケーションの作成と非常に類似しています。 ただし、データ・ソースと直接通信(たとえば、ビジネス・オブジェクトに直接バインディング)するのではなく、このアプリケーションはWebサービスに依存してデータを提供します。 この章では、データに直接アクセスするWebアプリケーション、およびWebサービスを使用してデータにアクセスするWebアプリケーションの両方の作成方法について説明します。

Oracle ADFは、J2EE標準およびオープン・ソース・テクノロジに基づいて作成されたエンドツーエンド・アプリケーション・フレームワークで、サービス指向アプリケーションの実装を簡素化および迅速化します。 コミュニティのベスト・プラクティスに従い、Oracle ADFを使用して作成したアプリケーションでは、モデル、ビュー、コントローラのアーキテクチャに準拠することで、ビジネス・ロジック、ページ・ナビゲーションおよびユーザー・インタフェースが明確に分離されます。 図9-1に示すように、MVCアーキテクチャは次のようになります。

図9-1 UI、ビジネス・ロジックおよびページ・ナビゲーションが明確に分離されたMVCアーキテクチャ

MVCアーキテクチャを示すイメージ

9.1.1 サポートされているビュー・レイヤー・テクノロジ

Webユーザー・インタフェースを設計するアプリケーションのビュー・レイヤーでは、従来のJavaServer Pages(JSP)または最新のJavaServer Faces(JSF)標準のいずれかを使用できます。 WYSIWYGビジュアル・デザイナをJDeveloperで使用し、データ・バインディングをドラッグ・アンド・ドロップします。

SOADEMO-CLIENTアプリケーションは、Oracle ADF Facesライブラリを使用して、JSF標準に基づいて作成されています。 JSFリファレンス実装によって、基本的なHTML入力フィールド・タイプや単純な表の表示を含むUIコンポーネントの基本セットが提供されますが、ADF FacesライブラリとADF Modelレイヤーを使用することで、次のような豊富な機能が提供されます。

  • 洗練された表モデル: 表は、エンタープライズ・アプリケーションUIの重要な要素です。 デフォルトのJSFでは、表内のページングやソート機能がサポートされていません。 ADF Faces表とADF Model表のバインディングによって、列のソート機能を持ち、ページングや編集が可能な読取り専用の表が表示されます。

  • キー・ベースの現行選択トラッキング: Webユーザー・インタフェースの最も一般的なタスクの1つは、情報リストを表示し、ユーザーがそのリストをスクロールしたり、そのリストから1つ以上のエントリを選択できるようにすることです。 ADF Modelのイテレータ・バインディングでは、データのリフレッシュや位置の変更によって変更される可能性がある位置インジケータに依存せずに、行キーを使用した確実な方法で選択した行をトラッキングできます。 ADF Faces表と複数選択コンポーネントを併用すると、単一または複数の選択を処理し、マスター/詳細情報に移動する画面の作成が容易になります。

  • 共通UIコンポーネントに対する柔軟なモデル: デフォルトのJSFでサポートされているのは、チェック・ボックスとブール型プロパティのバインディングのみです。 ADF Modelでは、ユーザーのデータが示すtrue値または有効値の組合せにチェック・ボックスをマップする機能が追加されます。 リストに対する有効値はデータ・コントロール内のデータ・コレクションから取得され、このリストは、ニーズに応じて、更新を実行したり行ナビゲーションに使用されます。 また、ADF Modelのリスト・バインディングでは、変換可能な「選択なし」選択をオプションでリストに追加することで、NULL処理も容易にします。

9.1.2 ADF Modelでサポートされているビジネス・サービス・テクノロジ

モデル・レイヤーでは、Oracle ADF Modelによって、データ・コントロールと呼ばれるJSR-227サービス抽象化が実装されます。また、最も一般的なビジネス・サービス・テクノロジにそのまま使用できるデータ・コントロール実装も提供されます。 いずれを採用した場合も、JDeveloperとOracle ADFの併用によって、ユーザー・インタフェースの作成時には、ドラッグ・アンド・ドロップ対応の宣言的なデータ・バインディングが提供されます。 サポートされているテクノロジは次のとおりです。

  • Enterprise JavaBeans(EJB)セッションBean: ほとんどのJ2EEアプリケーションではトランザクション・サービスが必要なため、宣言的なトランザクション制御を提供するEJBセッションBeanは妥当な選択です。 ビジネス・サービスのEJBセッションBeanファサードの背後では、通常のJavaオブジェクト(POJO)またはEJBエンティティBeanを使用して、ビジネス・ドメイン・オブジェクトを表します。 JDeveloperでは、EJBセッションBeanの作成、初期セッション・ファサード実装の生成、およびJavaクラスまたはエンティティBeanの作成を統合してサポートしています。 また、Oracle TopLinkをJDeveloperで使用すると、これらのクラスのオブジェクト・リレーショナル・マッピングを構成できます。

  • JavaBeans: Oracle TopLinkのマッピングを利用する機能(必要な場合)を含めて、Javaベースのサービス・クラスも容易に使用できます。

  • Webサービス: アプリケーションに必要なサービスで標準的なWebサービス・インタフェースを公開する場合は、サービス・エンドポイントについて、関連するWeb Services Description Language(WSDL)へのURLをOracle ADFに指定し、サービス・エンドポイントと相互に作用してその結果を表示するユーザー・インタフェースを作成します。

  • XML: アプリケーションで、Webサービスとして公開されていないXMLまたはカンマ区切り値(CSV)データと相互に作用する必要がある場合は、このテクノロジも容易に実行できます。 プロバイダのURLとオプションのパラメータを指定するのみで、データの処理を開始できます。 これによって、REST(REpresentational State Transfer)スタイルのサービスを組み込むことができます。

  • ADFアプリケーション・モジュール: これらのサービス・クラスはADF Business Componentsモジュールの機能で、ビジネス・ルールの自動実施を使用してSQL問合せ結果の更新可能なデータセットを公開します。

9.1.3 Oracle ADFおよびJavaServer Facesを使用した宣言的な開発

JavaServer Facesを使用すると、属性、イベントおよび一貫性のあるランタイムAPIを備えたWeb UIコンポーネントを導入することで、Webユーザー・インタフェースの作成が簡素化されます。 Webページは、JSF標準に準拠した、データ中心の既製コンポーネントのライブラリから組み立てます。

JSFでは、単純な式言語を使用して、表示する情報を処理します。 たとえば、選択したユーザーのセットを参照する式は#{UserList.selectedUsers}、特定のユーザーの名前を参照する式は#{user.name}、ユーザーがマネージャかどうかを評価する式は#{user.role == 'manager'}のようになります。 実行時に、汎用の式評価機能によってそれぞれの式のListStringおよびboolean値が戻されるため、各オブジェクトとそのプロパティへのアクセスが自動化され、コードは必要ありません。

JSF UIコンポーネントの実行時の値は、そのvalue属性によって決定します。 コンポーネントには、その値として静的テキストを設定できますが、通常、value属性にはEL式が含まれています。このEL式は、表示するデータを決定するために、ランタイム・インフラストラクチャによって評価されます。 たとえば、現在ログインしているユーザーの名前を表示するoutputTextコンポーネントでは、value属性に式#{UserInfo.name}が設定されます。

コンポーネントの属性にはEL式を使用して値を割り当てることができるため、データ・ドリブンの動的なユーザー・インタフェースを容易に作成できます。 たとえば、ブール値を使用する式を使用して、条件に応じてコンポーネントを非表示にできます。 カート・ページのパネル・ボックスにはメッセージが表示されますが、カートが空の場合のみ、パネル・ボックスのrendered属性に対して式#{empty (Shopping_Cart.itemList) ? true : false}が使用されます。 Shopping_Cartというオブジェクトで品目リストが空の場合、rendered属性はfalseと評価され、コンポーネントはページに表示されなくなります。

JDeveloperでは、図9-2に示すように、宣言的なツールを使用して複雑な式を作成できます。

図9-2 JDeveloperの式ビルダー

JDeveloperのEL式ビルダー

コントローラ・レイヤーのアプリケーション・ロジックのメンテナンスを簡素化するために、JSFは宣言的なオブジェクト作成メカニズムを備えています。 これを使用するには、JSF faces-config.xmlファイルで使用する必要があるJavaオブジェクトを構成します。 これらのオブジェクトは、マネージドBeanと呼ばれます。これは、これらのオブジェクトには、JavaBeans仕様に従ったプロパティがあり、EL式が初めてオブジェクトを参照したときは、JSFランタイムがそのオブジェクトのインスタンス化を要求に応じて管理するためです。 また、JSFは、これらのBeanが初めて作成されたときにそのプロパティを設定する宣言的なメカニズムも備えています。 マネージドBeanには、JSFランタイムによって割り当てられたランタイム値が含まれた管理プロパティを、開発者が指定したEL式に基づいて設定できます。 さらに、管理プロパティは独自の管理プロパティを持つ他のBeanに依存することもでき、JSFランタイムは、関連するBeanのツリーが適切な順序で作成されることを保証します。

特定のページに緊密に関連した、スコープがrequestのマネージドBeanは、実行時にプロパティとメソッドを使用してページをサポートするため、バッキングBeanと呼ばれます。 ページ内のUIコンポーネントとバッキングBeanのプロパティおよびメソッドとの関係は、コンポーネントの適切な属性に関するJSFページにあるEL式によって確立されます。 次に例を示します。

  • value="#{expr}"

    表示または変更するデータでプロパティを参照します。

  • action="#{expr}"

    イベントを処理するメソッドを参照します。

  • binding="#{expr}"

    プログラムでの操作(表示/非表示、色の変更など)が必要なUIコンポーネントの対応するインスタンスを保持しているプロパティを参照します。

ページのバッキングBeanとして機能しないマネージドBeanは、アプリケーション・ロジックBeanとみなすことができます。 このBeanには、単一のページに固有ではないコードとプロパティが含まれます。 このタイプのマネージドBeanは、本来の目的に限定されずに、ビジネス・サービス・ラッパーとして機能する場合があります。このラッパーは、メソッド結果を単一のリクエストより上のコントローラ・レイヤーにキャッシュし、複数ページから使用できるビジネス・サービス・メソッドの事前または事後処理を集中的に実行します。

マネージドBeanを使用する以外にも、アプリケーション・コードをPhaseListenerクラスに記述して、JSFページに対するリクエスト処理に関連した標準処理フェーズを拡張することもできます。 JSFランタイムが各ステップに対して実行する標準ステップは、ページのライフサイクルと呼ばれます。 実際のJSFアプリケーションでは、特定の種類のカスタム・フェーズ・リスナーを実装することによって、ライフサイクルがカスタマイズされます。このカスタマイズは、通常、ページの初期表示でレンダリングするモデル・データの準備などのタスクを実行するために行われます。

9.1.3.1 JSFを使用した宣言的なページ・ナビゲーション

JSFは、宣言的なUI設計に加えて、ページ・ナビゲーション・ルールを宣言的に定義するメカニズムも備えています。 これらのルールは、開発者がユーザーとページとの相互作用の妥当なナビゲーション結果に論理的な名前を指定することによって定義されます。 たとえば、SOADEMO-CLIENTアプリケーションのbrowseItemsページを表示している際に、エンド・ユーザーが、品目を選択して「View Details」ボタンをクリックすることで、ページと相互作用する場合があります。 この相互作用の論理的なナビゲーション結果は、selectItemページに進んで詳細を表示することです。 このselectItemページから、エンド・ユーザーがbrowseItemsページへ戻る場合もあります。 図9-3に示すように、この結果を表現するために、detailsreturnのような名前を作成します。 ナビゲーション・ルール情報は他の構成情報とともにfaces-config.xmlファイルに保存され、JSFは、実行時にこれらの論理結果名に基づいてページ・ナビゲーションを処理します。

図9-3 JDeveloperのページ・フロー・ダイアグラムでのJSFナビゲーション・ルールの表現

ページ・フロー・ダイアグラムのイメージ

9.1.3.2 Oracle ADF Modelレイヤーを使用した宣言的なデータ・バインディング

Oracle ADF Modelレイヤーは、XML構成ファイルを使用して汎用のデータ・バインディング機能を実行します。 このレイヤーは、ユーザー・インタフェース・テクノロジをビジネス・サービス実装から分離できる、データ・コントロールと宣言バインディングという2つの概念をJSR-227に実装します。

データ・コントロールは、標準的なメタデータ・インタフェースを使用し、サービスの操作およびデータ・コレクション(関連するプロパティ、メソッドおよびタイプを含む)を記述することによって、ビジネス・サービスの実装テクノロジを抽出します。 設計時には、JDeveloperなどのビジュアル・ツールで標準的なサービス・メタデータを使用できるため、データ・コントロール操作またはデータ・コレクションへのUIコンポーネントのバインディングが簡素化されます。 実行時に、汎用のOracle ADF Modelレイヤーは、適切なXMLファイルから、データ・コントロールおよびバインディングに関する情報を読み込み、ユーザー・インタフェースをビジネス・サービスに接続する双方向の結合を実装します。

宣言バインディングは、データ・コントロール内のデータ・コレクションからのデータ・アクセス、およびそのアクセス操作の起動に関する詳細を抽出します。 基本的な宣言バインディング・オブジェクトは次の3種類です。これらのオブジェクトによって、すべてのエンタープライズ・アプリケーションに必要なデータ・バインディングの重要な機能が自動化されます。

  • イテレータ・バインディング。データ・コレクション内の現行の行を、トラッキングするイテレータにバインドします。

  • 値バインディング。UIコンポーネントをデータ・コレクション内の属性に接続します。

  • アクション・バインディング。データ・コントロールまたはそのデータ・コレクションに対するカスタム操作またはビルトイン操作を起動します。

イテレータ・バインディングによって、データのコレクションをスクロールおよびページングし、サマリー情報から詳細情報にドリルダウンできるユーザー・インタフェースのバインディングが簡素化されます。 データを表示するUIコンポーネントでは、値バインディングを使用します。 値バインディングには、単純なテキスト・フィールドを使用する基本的なバインディングから、リスト、表およびツリーUIコントロールの追加ニーズをサポートする洗練されたリスト、表およびツリー・バインディングまであります。 アクション・バインディングは、ハイパーリンクやボタンなどのUIコンポーネントで使用され、コードを記述せずに、データ・コレクションまたはデータ・コントロールに対するビルトイン操作またはカスタム操作を起動します。

ページのUIコンポーネントをサポートするバインディングのグループは、ページ定義ファイルと呼ばれるページ固有のXMLファイルに記述されます。 ADF Modelで提供される汎用のBeanファクトリでは、実行時にこのファイルを使用して、ページのバインディングをインスタンス化します。 これらのバインディングは、バインディング・コンテナと呼ばれる、スコープがrequestのマップに保持され、各ページのリクエスト時にEL式#{バインディング}を使用してアクセスできます。 この式は常に、現行ページのバインディング・コンテナに対して評価されます。 図9-4に、EL値バインディング式によって、ページ内のUIコンポーネントがバインディング・コンテナ内のバインディング・オブジェクトに関連付けられる方法を示します。

図9-4 実行時にEL式でアクセス可能なバインディング・コンテナ内のバインディング

実行時にEL式でアクセス可能なバインディング・コンテナ内のバインディング

図9-5に、アプリケーションでも宣言的なデータ・バインディングに対してADF Modelを使用する場合のJSFアプリケーションのアーキテクチャを示します。 Oracle ADF ModelとJavaServer Facesを組み合せることによって、実際のアプリケーションで必要となる大量のマネージドBeanコードを記述する必要がなくなります。 実際に、ビルトインのアクションまたはサービス・メソッドの起動で処理できないプログラム・コントローラ・ロジックを実行しないかぎり(ADF Modelではコードなしで実行できます)、作成する多くのページでバッキングBeanが不要になります。 また、ビジネス・サービスをラップするアプリケーション・ロジックBeanも不要になります。これは、ADF Modelのデータ・コントロールによってこの機能が実装されるためです。 さらに、ADF Modelは汎用のJSFフェーズ・リスナーを備えており、このリスナーによって、ページ定義メタデータ内の情報に基づいて宣言的な方法で実行する必要があるほとんどの共通操作を実行できるため、多くの場合、カスタムのJSFフェーズ・リスナーを記述する必要はありません。

図9-5 ADF Modelのデータ・バインディングを使用するJSFアプリケーションのアーキテクチャ

ADF Modelのデータ・バインディングを使用するJSFアプリケーションのアーキテクチャ

フレームワークの中核モジュールは、JSR-227仕様を実装する宣言的なデータ・バインディング機能であるOracle ADF Modelです。 Oracle ADF Modelレイヤーによって、ユーザー・インタフェースをビジネス・サービスにコードなしでバインドする、統合されたアプローチが可能になります。

9.1.4 Webアプリケーションの作成

Oracle ADFアプリケーションの作成に関する一般的な開発プロセスは、データを提供するサービスの作成から開始します。 たとえば、SOADEMO-CLIENTアプリケーションでは、Java Persistence API(JPA)エンティティを使用して、PRODUCTデータベース表の製品にマップします。 また、EJBセッションBeanを使用して、データの集計と表示に使用するサービスを作成します。 これらのサービスを作成した後は、Webクライアントの作成に使用するデータ・コントロールを生成できます。 たとえば、開発者は、SOADEMO-CLIENTアプリケーションのProductsFacadeLocalデータ・コントロールを使用して、標準CRUDメソッドの実行結果を、様々なADF FacesコンポーネントとしてセッションBeanにドラッグ・アンド・ドロップできます。 EJBのデータ・コントロールの作成方法については、第4.7項「ADFデータ・コントロールを使用したサービスの公開」を参照してください。

SOADEMO-CLIENTがCustomerService Webサービスを使用して顧客を作成する際にデータにアクセスするように、WebクライアントがWebサービスを介してデータにアクセスする際には、複数のインスタンスが介在する場合があります。 データ・コントロールはWebサービスからも作成でき、場合によっては、ADF Modelレイヤーを使用せずにWebサービスを直接使用する必要があります。 Webサービスに対するデータ・コントロールの作成方法については、第5.3.3項「Webサービスからのデータ・コントロールの作成方法」を参照してください。 Webサービスを直接使用する場合の詳細は、第9.6.3項「バッキングBeanを使用したサービスの起動方法」を参照してください。

データ・コントロールを作成した後は、JSFナビゲーション・ダイアグラムを使用して、ページとそのページ間のナビゲーションを作成します。 詳細は、第9.3項「Webページの作成」を参照してください。 ナビゲーションを設定した後は、ページに複雑な機能を追加できます。 ページでコンポーネントを操作したり、追加ロジックが必要になる場合があります。 その場合は、ページに対してバッキングBeanを作成できます。 詳細は、第9.4項「Webページに対するバッキングBeanの作成と使用」を参照してください。

通常、Webページは、データの表示に使用するページと、データの収集に使用するページの2種類に分類されます。 SOADEMO-CLIENTアプリケーションでは、表を宣言的に作成するためにProductsFacadeLocalデータ・コントロールが使用されています。この表には、ADFデータ・バインディングを使用して、browseItems JSPの製品が表示されます。 詳細は、第9.5項「ADFデータ・バインディングを使用したコレクションおよび詳細データの表示」を参照してください。

また、登録ページでは、ユーザー情報を収集し、CustomerService Webサービスとして公開されている外部の顧客サービス・アプリケーションにその情報を送信します。 このページでは、データ・バインディングにADFを使用しません。 かわりに、入力テキスト・フィールドを作成し、ページの対応するバッキングBeanで入力データのバインディングを処理します。 詳細は、第9.6項「Webサービスで使用するデータの収集」を参照してください。 この項では、WebサービスでADFデータ・コントロールを使用する方法、およびWebサービスをバッキングBeanから手動で起動する方法を詳細に説明しています。