ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド
11g リリース2(11.1.2.4.0)
B66160-04
  目次へ移動
目次

前
 
次
 

2 Java EE WebアプリケーションでのADFモデル・データ・バインディングの使用方法

この章では、EJBセッションBeanに対してADFモデルのデータ・コントロールを作成する方法、さらに「データ・コントロール」パネルを使用して、データバインドされたUIコンポーネントをJSF Webページで作成する方法について説明します。

この章には、次の項が含まれます:

UIコンポーネントにバインドするビジネス・サービスの構成の詳細は、第3章「データ・コントロールへのビジネス・ロジックの追加」を参照してください。ADFモデル・データ・バインディングの使用の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。

2.1 ADFデータ・バインディングの概要

ADFモデルによって、ユーザー・インタフェース・テクノロジとビジネス・サービス実装の分離を可能にする2つの概念(データ・コントロール宣言的バインディング)が実装されています。

データ・コントロールでは、関連するプロパティ、メソッド、タイプの情報を含め、サービスの操作とデータ・コレクションを表す標準のメタデータ・インタフェースを使用してビジネス・サービスの実装技術を抽象化します。EJBセッション・ファサードを使用するアプリケーションでは、開発者はファサードのデータ・コントロールを作成できます。その後、JDeveloperの「データ・コントロール」パネル(図2-1を参照)に表示されたデータ・コントロールの表現を使用して、セッション・ファサードに自動的にバインドされるUIコンポーネントを作成できます。実行時に、ADFモデル・レイヤーによって、適切なXMLファイルからデータ・コントロールおよびバインディングを記述した情報が読み取られ、ユーザー・インタフェースとビジネス・サービスの双方向の結合が実装されます。

図2-1 「データ・コントロール」パネル

データ・コントロールの高レベルのノード

宣言的なバインディングによって、データ・コントロール内のデータ・コレクションからのデータ・アクセスの詳細と、その操作の実行が抽象化されます。次に、バインディング・オブジェクトの基本的な種類を示します。

図2-2は、バインディングによってUIコンポーネントをデータ・コントロール・コレクションおよびメソッドに関連付ける様子を示しています。

図2-2 バインディングによるデータ・コントロールへのUIコンポーネントの関連付け

データ・コントロールとページ間のバインディング

ページのUIコンポーネントをサポートするバインディングのグループは、ページ定義ファイルというページ固有のXMLファイルに記述されます。ADF Modelレイヤーでは実行時にこのファイルが使用され、ページのバインディングがインスタンス化されます。これらのバインディングは、バインディング・コンテナと呼ばれるリクエスト・スコープ・マップに保持されます。JSFアプリケーションでは、バインディング・コンテナは、各ページ・リクエスト時にEL式#{bindings}を使用してアクセスできます。例2-1に、フォーム内のチェック・ボックスをOrdersSessionEJBLocalデータ・コントロールのorderFilled属性にバインディングするために使用されるコードを示します。

例2-1 JSF Webページのチェック・ボックスのバインディング・コード

<af:selectBooleanCheckbox value="#{bindings.orderFilled.inputValue}"
                   label="#{bindings.orderFilled.label}"
                   shortDesc="#{bindings.orderFilled.hints.tooltip}" id="sbc1"/>

ヒント:

ADF EL式の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFデータ・バインディングEL式の作成に関する項を参照してください。


データのバインディングにADFモデル・レイヤーを使用するには、JDeveloperを使用して、サービス用のデータ・コントロールを作成する必要があります。データ・コントロールが「データ・コントロール」パネルのツリー階層として表示され、ツリーの各サブノードにコレクション、操作、メソッドまたは属性が表されます。その後、Webページのビジュアル・エディタまたはその他のユーザー・インタフェース・コンポーネントに、それらのサブノードをドラッグ・アンド・ドロップすることにより、データバインドされたコンポーネントを作成できます。たとえば、JSPページ用にデータバインドされたHTML要素、JSFページ用にデータバインドされたUIコンポーネント、およびADF Swingパネル用にデータバインドされたSwing UIコンポーネントを作成できます。データ・コントロールからサブノードをページにドラッグすると、JDeveloperによって、ページからサービスへのバインディングを表すメタデータが自動的に作成されます。実行時、 ADFモデル・レイヤーは、データ・コントロールとバインディングの両方に対する適切なXMLファイルからメタデータ情報を読み取り、ユーザー・インタフェースとビジネス・サービスとの間の2方向の接続を実装します。

2.2 ADFデータ・コントロールを使用したビジネス・サービスの公開

アプリケーションのサービスの準備ができたら、JDeveloperを使用して、UIコンポーネントとサービスとの宣言的バインドに必要な情報を提供するデータ・コントロールを作成できます。Java EEアプリケーションでは、通常、データベース内の表を表すエンティティBeanを作成し、全EJBに対するセッション・ファサードを作成します。このファサードは、ベースとなるエンティティへの一元化されたインタフェースです。Oracle ADFアプリケーションでは、セッションBeanに対するデータ・コントロールを作成でき、そのデータ・コントロールには、セッションBean下のすべてのEJBに関する記述が含まれます。

データ・コントロールの生成には、「データ・コントロールの作成」コマンドを使用します。データ・コントロールは、1つ以上のXMLメタデータ・ファイルで構成され、これらのファイルでは、実行時にバインディングと連動するサービスの機能が定義されます。データ・コントロールは、Beanの実装を変更することなく、基礎となるBeanと連動して動作します。

たとえば、Summitデモ・アプリケーションでは、多数のリレーショナル・データベース表が含まれるsummitデータベース・スキーマが使用されます。アプリケーションのモデル・プロジェクトには、Summitデモ・アプリケーションが使用するスキーマ内の表を表すエンティティBeanが多数含まれています。Customer Bean、Product Bean、Order Beanなどです。また、モジュールには、表から作成されたBeanにアクセスするためのセッションBean、OrdersSessionEJBBeanも含まれています。セッションBeanに対してデータ・コントロールが存在し、開発者はセッションBeanとセッションBeanがカプセル化しているエンティティBeanに含まれるデータとロジックを使用して宣言的にUIページを作成できます。

2.2.1 ADFデータ・コントロールの作成方法

データ・コントロールは、JDeveloperのアプリケーション・ナビゲータ内から作成します。

始める前に:

データ・コントロール使用の一般的な知識があると役立ちます。詳細は、2.2項「ADFデータ・コントロールを使用したビジネス・サービスの公開」を参照してください。

次のタスクを完了する必要があります。

アプリケーション・ワークスペース、JPA/EJB 3.0エンティティ、およびエンティティ用に1つ以上のセッションBeanを作成します。詳細は、Oracle Fusion Middleware Oracle JDeveloperユーザー・ガイドのEJBビジネス・サービス・レイヤーの操作方法に関する項を参照してください。

注意:

Javaサービス・ファサード・クラスをデータ・コントロールの基礎とすることもできます。Javaサービス・ファサードを使用すると、EJBコンテナ内から、またはEJBコンテナを使用せずに、どちらからでもビジネス・メソッドを公開することが可能です。Javaサービス・ファサードのテンプレートは、「新規ギャラリ」にあります。また、データ・コントロールの基礎とするクラスは、JavaBeans仕様に準拠している必要がある点に注意してください。特に、クラスにはpublicなデフォルト・コンストラクタが必要です。


データ・コントロールを作成する手順:

  1. 「アプリケーション・ナビゲータ」で、データ・コントロールの作成対象のセッションBeanを右クリックし、コンテキスト・メニューから「データ・コントロールの作成」を選択します。

  2. 「EJBインタフェースの選択」ダイアログで、「ローカル」または「リモート」を選択します。Webアプリケーションの場合、通常は「ローカル」を選択します。


    注意:

    データ・コントロールの基礎となるBeanの名前を後に変更した場合、再度「データ・コントロールの作成」コマンドを使用して、データ・コントロールのメタデータを再生成する必要があります。

    データ・コントロールの作成後にBeanに単に変更を加えた場合は、データ・コントロールを再生成する必要はありません。Beanへの変更はデータ・コントロールに反映されます。ただし、基礎となるBeanの変更をデータ・コントロールに反映させるために、プロジェクトを一度閉じて再度開く必要がある場合があります。


2.2.2 データ・コントロール作成時のプロジェクト内の処理

EJBセッションBeanに基づいてデータ・コントロールを作成すると、JDeveloperによってデータ・コントロール定義ファイル(DataControls.dcx)が作成され、ファイルが概要エディタで開かれ、ファイルの階層が「データ・コントロール」パネルに表示されます。このファイルにより、データ・コントロールがサービスおよびバインディングと直接連動して動作することが可能になります。図2-3は、概要エディタでのDataControls.dcxファイルを示しています。

図2-3 概要エディタでのDataControls.dcxファイル

DataControls.dcxファイルの概要エディタ

例2-2に、対応するXMLファイルのコードを示します。これは、エディタ・ウィンドウの「ソース」タブをクリックすると表示されます。

例2-2 DataControls.dcxファイル

<?xml version="1.0" encoding="UTF-8" ?>
<DataControlConfigs xmlns="http://xmlns.oracle.com/adfm/configuration" version="11.1.2.58.66" id="DataControls"
                    Package="model">
  <AdapterDataControl id="OrdersSessionEJBLocal" FactoryClass="oracle.adf.model.adapter.DataControlFactoryImpl"
                      ImplDef="oracle.adfinternal.model.adapter.ejb.EjbDCDefinition" SupportsTransactions="false"
                      SupportsSortCollection="true" SupportsResetState="false" SupportsRangesize="false"
                      SupportsFindMode="false" SupportsUpdates="true" Definition="model.OrdersSessionEJBLocal"
                      BeanClass="model.OrdersSessionEJBLocal" xmlns="http://xmlns.oracle.com/adfm/datacontrol">
    <CreatableTypes>
      <TypeInfo FullName="model.Product"/>
      <TypeInfo FullName="model.Item"/>
      <TypeInfo FullName="model.Ord"/>
      <TypeInfo FullName="model.Customer"/>
      <TypeInfo FullName="model.Emp"/>
    </CreatableTypes>
    <Source>
      <ejb-definition ejb-version="3.0" ejb-name="OrdersSessionEJB" ejb-type="Session"
                      ejb-business-interface="model.OrdersSessionEJBLocal" ejb-interface-type="local"
                      initial-context-factory="weblogic.jndi.WLInitialContextFactory"
                      DataControlHandler="oracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler"
                      xmlns="http://xmlns.oracle.com/adfm/adapter/ejb"/>
    </Source>
  </AdapterDataControl>
</DataControlConfigs>

2.2.2.1 DataControls.dcxの概要エディタ

DataControls.dcxファイルの概要エディタには、データ・モデルのマスター/ディテール階層のビューおよびセッション・ファサードのメソッドが表示されます。ノードを選択するとフィールドが表示され、これらのフィールドを「属性」タブの対応するエンティティ・クラス内のデータベース列にマッピングできます。「アクセッサ」タブでは、エンティティの関係が定義されている対応するエンティティ・クラスのフィールドが表示されます(たとえばOneToManyおよびManyToOne)。「操作」タブでは、コレクション・アクセッサのaddおよびremoveメソッドなど、エンティティに対する操作のメソッドが表示されます。

概要エディタおよび「データ・コントロール」パネルで使用されるアイコンの説明は、表2-1を参照してください。

データ・コントロールの設定を変更するには、要素を選択し、「編集」アイコンをクリックします。データ・コントロールの編集方法の詳細は、3.2項「データ・コントロールの構成」を参照してください。

2.2.2.2 「データ・コントロール」パネル

データ・コントロールを作成すると、「データ・コントロール」パネルが「アプリケーション・ナビゲータ」に表示されます。「データ・コントロール」パネルはパレットとして機能し、ノードを「データ・コントロール」パネルからWebページのデザイン・エディタにドラッグすることにより、データバインドされたUIコンポーネントを作成できます。

DataControls.dcxの概要エディタと同様に、「データ・コントロール」パネルは、マスター・データ・コレクションの下にネストされたディテール・データ・コレクションを表示することで、データ・モデル内のマスター/ディテール階層を示します。たとえば、図2-4は、「データ・コントロール」パネルに表示されたSummitデモ・アプリケーションのデータ・コントロールを示しています。CustomerEmpItemOrdおよびProduct Beanはすべて、図ではアクセッサ戻りコレクションとして表されており、これらはさらにBeanで定義された名前付き問合せに対応します。

図2-4 「データ・コントロール」パネル

「データ・コントロール」パネルに表示されたSummitデモのノード

「データ・コントロール」パネルには、セッションBeanの各サービス・メソッドも、メソッド名と一致する名前のメソッド・アイコンとして表示されます。メソッドが引数をとる場合、その引数は、メソッドのノード内にネストされたパラメータとして「パラメータ」ノードに表示されます。図2-4に示すように、メソッドによって返されるオブジェクトも表示されます。

DataControls.dcxファイルの概要エディタに表示されるノードに加え、「データ・コントロール」パネルにはバインディングに使用できる他のオブジェクトのノードも表示されます(エンティティBean属性、組込み操作およびメソッド・パラメータなど)。


ヒント:

「データ・コントロール」パネルが表示されない場合、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「データ・コントロール」パネルの開き方に関する項でパネルを開く手順を確認してください。


返される各コレクションまたはオブジェクトには、関連付けられているBeanに定義された属性およびカスタム・メソッドが表示されます。図2-5は、itemFindAllアクセッサ・メソッドによって返されるItem Beanに定義されている属性とメソッドを示しています。

図2-5 返されるコレクションの子ノード

アクセッサ戻りコレクションの子ノード

デフォルトでは、Beanで問合せ可能な各属性に対して暗黙的な名前付き基準が作成されます。それらは、図2-5に示すように、「データ・コントロール」パネルで「名前付き基準」ノードの下に「すべての問合せ可能な属性」ノードとして表示されます。このノードは、第8章「データバインドされた検索フォームの作成」で説明するような、クイック検索フォームの作成に使用されます。

図2-5に示すように、「データ・コントロール」パネルで返されるコレクションの下の「操作」ノードには、データ・コントロールが提供する使用可能な組込み操作がすべて表示されます。操作で1つ以上のパラメータを受け入れると、そのパラメータは、ネストされた「パラメータ」ノードに表示されます。実行時に、これらのデータ・コレクション操作の1つがデータ・バインディング・レイヤーによって名前別に起動されると、データ・コントロールは、組込み機能を処理するBeanインタフェース上の適切なメソッドにそのコールを委譲します。ほとんどの組込み操作は、現在の行に作用します。ただし、execute操作はデータ・コントロール自体をリフレッシュし、commitおよびrollback操作は、トランザクションの範囲内で実行されたすべての変更に影響を与えます。組込み操作は、次のとおりです。

  • Create: 現在の行になる新規行を作成しますが、挿入はしません。

  • Delete: 現在の行を削除します。

  • Execute: アクセッサ・メソッドを実行または再実行することによって、データ・コレクションをリフレッシュします。

  • First: 行セット内の最初の行を現在の行に設定します。

  • Last: 行セット内の最後の行を現在の行に設定します。

  • Next: 行セット内の次の行を現在の行に設定します。

  • Next Set: 1つ後の行のセットに移動します。

  • Previous: 行セット内の前の行を現在の行に設定します。

  • Previous Set: 1つ前の行のセットに移動します。

  • removeRowWithKey: パラメータとして渡された行キーのシリアライズされた文字列表現を使用して行の検索を試行します。検出されると、その行が削除されます。

  • setCurrentRowWithKey: パラメータとして渡された行キーのシリアライズされた文字列表現を使用して行の検索を試行します。検出されると、その行が現在の行になります。

  • setCurrentRowWithKeyValue: パラメータとして渡された主キーの属性値を使用して行の検索を試行します。検出されると、その行が現在の行になります。

  • commit: 現在のトランザクションで行われたすべての変更をデータベースに永続化させます。(ステートフルBeanによって管理されたトランザクション・メソッドが含まれているセッション・ファサードでのみ使用可能)

  • rollback: 現在のトランザクションのコンテキスト内でのすべての変更を元に戻します。(ステートフルBeanによって管理されたトランザクション・メソッドが含まれているセッション・ファサードでのみ使用可能)


注意:

デフォルトでは、JavaBeansコンポーネントはrowIndexをキーと見なします。明示的にキーを定義しない場合、索引が使用されます。


「データ・コントロール」パネルは、DataControls.dcxファイルと、データ・コントロールに関連付けられたすべてのデータ・コントロール構造ファイルを直接表したものです。ファイルを編集することで、パネルに表示されている要素を変更できます。データ・コントロールの基礎となるサービスが変更されると、これらの変更はデータ・コントロールに反映されます。

2.3 「データ・コントロール」パネルの使用

「データ・コントロール」パネルから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインドされたユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、選択したデータ・コントロールにそのコンポーネントをバインドするために必要な、様々なコードおよびオブジェクトがJDeveloperによって自動的に作成されます。

「データ・コントロール」パネルでは、各オブジェクトは特定のアイコンで表されます。表2-1は、各アイコンが表すもの、「データ・コントロール」パネルの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。

表2-1 データ・コントロールのアイコンおよびオブジェクト階層

アイコン 名前 説明 作成できるコンポーネント

データ・コントロール・アイコン


データ・コントロール

データ・コントロールを表します。データ・コントロール自体を使用してUIコンポーネントを作成することはできませんが、その下に表示される子オブジェクトは、いずれも使用できます。ビジネス・サービスの定義方法によっては、複数のデータ・コントロールが存在することがあります。

他のオブジェクトのコンテナとして機能し、作成には使用されません。

アクセッサ戻りアイコン。


アクセッサによって返されるコレクション

ビジネス・サービスでBean形式のアクセッサ・メソッドによって返されるオブジェクトを表します。たとえば、セッションBeanを作成する際、セッションBean下に各Javaエンティティに対するアクセッサ・メソッドも作成するよう選択した場合、アクセッサによって返されるコレクションがそれらの各エンティティに対して表示されます。

エンティティに他のエンティティへの関係が含まれている場合(外部キーなど)、そのエンティティについて子アクセッサによって返されるコレクションが表示されます。Oracle ADFでは、親および子エンティティ間の関係はマスター/ディテール関係と呼ばれます。

コレクション下の子には、コレクションを構成する要素の属性、コレクション全体に対する操作、コレクション内の各要素の行に対する操作などがあります。

コレクションの場合: フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント、およびマスター/ディテール・ウィジェット。

単一オブジェクトの場合: フォーム、マスター/ディテール・ウィジェットおよび選択リスト。

フォームおよびナビゲーション・コンポーネントの作成の詳細は、第4章「データバインドされた基本的なページの作成」を参照してください。

表の作成の詳細は、第5章「ADFによるデータバインドされた表の作成」を参照してください。

ツリーおよび他のマスター/ディテールUIコンポーネントの作成の詳細は、第6章「マスター/ディテール・データの表示」を参照してください。

リストの作成の詳細は、第7章「データバインドされた選択リストの作成」を参照してください。

属性アイコン


属性

オブジェクト内の個別のデータ要素(行の属性など)を表します。属性は、自分の属するコレクションまたはメソッド戻りの下に、子として表示されます。

このアイコンは「データ・コントロール」パネルで使用されますが、DataControls.dcxファイルの概要エディタでは使用されません。

ラベル、テキスト・フィールドおよび選択リストの各コンポーネント。

テキスト・フィールドの作成の詳細は、4.2項「属性を使用したテキスト・フィールドの作成方法」を参照してください。

メソッド・アイコン


メソッド

メソッドを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、または単一の値と構造のコレクションを戻すことができます。

コマンド・コンポーネント。

パラメータをとるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。

メソッドからのコマンド・コンポーネントの作成の詳細は、4.6項「既存レコードを編集するフォームの作成」を参照してください。

パラメータを使用するフォームの作成の詳細は、4.5項「パラメータをとるメソッドを使用するフォームの作成」を参照してください。

メソッド戻りアイコン。


メソッド戻り

メソッドによって戻されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。

メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッド戻りの下に子として表示されるオブジェクトは、コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、または親コレクションで実行できる操作などです。

単一の値の場合: テキスト・フィールドおよび選択リスト。

コレクションの場合: フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント。

単一値のメソッド戻り値がドロップされた場合、メソッドを起動するコードは自動的に生成されません。メソッドを起動するために、実行可能ファイルとして起動アクションも作成するか、対応するメソッドをボタンとしてドロップする必要があります。

データ・コントロール操作アイコン


操作

親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。データ・コントロール操作は、コレクションまたはメソッド戻りの下の「操作」ノードにあります。特定のコレクションまたはメソッド戻りの子である操作は、それらのオブジェクトにのみ作用します。

1つ以上のパラメータが操作に必要な場合、それらのパラメータは操作の下の「パラメータ」ノードにリストされます。

このアイコンは「データ・コントロール」パネルで使用されますが、DataControls.dcxファイルの概要エディタでは使用されません。

ボタンやリンクなどのコマンド・コンポーネント。

操作からのコマンド・コンポーネントの作成の詳細は、4.4項「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。

パラメータ・アイコン


パラメータ

メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「パラメータ」ノード内に表示されます。

このアイコンは「データ・コントロール」パネルで使用されますが、DataControls.dcxファイルの概要エディタでは使用されません。

ラベル、テキストおよび選択リストの各コンポーネント。

名前付き基準アイコン


名前付き基準

ユーザー検索フォームを作成できる問合せを表します。

「すべての問合せ可能な属性」基準が各アクセッサ・コレクションについて自動的に生成されます。この問合せを使用して、コレクション内の任意の問合せ可能な属性に基づき、ユーザーが問合せを実行できる検索フォームを作成できます。

カスタム・ビュー基準を作成し、「データ・コントロール」パネルに追加できます。3.6項「名前付き基準を使用した結果セットのフィルタリング」を参照してください。

このアイコンは「データ・コントロール」パネルで使用されますが、DataControls.dcxファイルの概要エディタでは使用されません。

検索フォーム。

検索フォームの作成の詳細は、第8章「データバインドされた検索フォームの作成」を参照してください。


2.3.1 「データ・コントロール」パネルの使用方法

JDeveloperは、ドロップするデータ・コントロール項目に対してそれぞれ選択できるUIコンポーネントの事前定義済セットを備えています。

「データ・コントロール」パネルを使用してUIコンポーネントを作成する手順:

  1. 「データ・コントロール」パネルで項目を選択し、ページのビジュアル・エディタにその項目をドラッグします。パネルの各項目の定義は、表2-1を参照してください。

  2. ポップアップ・メニューから、UIコンポーネントを選択します。

    「データ・コントロール」パネルから項目をドラッグしてページにドロップすると、ドロップした項目に使用できるすべてのデフォルトUIコンポーネントのポップアップ・メニューが表示されます。

    図2-6は、アクセッサ戻りコレクションが「データ・コントロール」パネルからページにドロップされる際に表示されるポップアップ・メニューを示しています。

    図2-6 「データ・コントロール」パネルのポップアップ・メニュー

    ページにドロップされるコンポーネントのメニュー

    ポップアップ・メニューから選択したコンポーネントに応じて、そのコンポーネントの外観を定義するためのダイアログがJDeveloperで表示されます。

    図2-7に示すように、結果のUIコンポーネントがJDeveloperのビジュアル・エディタに表示されます。

    図2-7 データバインドされたUIコンポーネント: ADF表

    JSFページのビジュアル・エディタの表コンポーネント

ヒント:

「データ・コントロール」パネルを使用して自動的にバインドされるUIコンポーネントを作成するかわりに、UIをまず作成し、コンポーネントをADFモデル・レイヤーにバインドできます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の最初に単純なUIを開発する方法の使用に関する項を参照してください。


2.3.2 「データ・コントロール」パネルを使用したUIコンポーネントの作成時の処理

「データ・コントロール」パネルを使用してWebアプリケーションを構築すると、JDeveloperによって次の処理が行われます。

  • DataBindings.cpxファイルがプロジェクトのデフォルト・パッケージに作成されます(このファイルが存在しない場合のみ)。また、そのページ用にエントリが追加されます。

    DataBindings.cpxファイルは、アプリケーションのバインディング・コンテキスト(使用可能なデータ・コントロールとデータ・バインディング・オブジェクトのリストを保持するコンテナ・オブジェクト)を定義します。DataBindings.cpxファイルによって、個々のページがページ定義ファイルに含まれるバインディング定義にマップされ、これらのページが使用するデータ・コントロールが登録されます。図2-8は、JDeveloperの概要エディタでのDataBindings.cpxファイルを示しています。

    図2-8 概要エディタでのDataBindings.cpxファイル

    SummitデモのDataBindings.cpx

    例2-3は、対応するXMLファイルのコードを示しています。

    例2-3 DataBindings.cpxファイル

    <?xml version="1.0" encoding="UTF-8" ?>
    <Application xmlns="http://xmlns.oracle.com/adfm/application"
                 version="11.1.2.59.53" id="DataBindings"
                 SeparateXMLFiles="false" Package="view" ClientType="Generic">
      <pageMap>
        <page path="/ViewCustomerOrders.jspx" 
              usageId="view_ViewCustomerOrdersPageDef"/>
        <page path="/editOrderItems.jspx" usageId="view_editOrderItemsPageDef"/>
        <page path="/CreateOrder.jspx" usageId="view_CreateOrderPageDef"/>
        <page path="PageFlow#addOrd" usageId="view_adfc_config___addOrdPageDef"/>
        <page  path="/WEB-INF/create-order-task-flow-definition.xml
                    #create-order-task-flow-definition@Create"
               usageId="view_adfc_config___CreatePageDef"/>
        <page path="/EditOrder.jspx" usageId="view_EditOrderPageDef"/>
        <page path="/login.jspx" usageId="view_loginPageDef"/>
        <page path="/viewCust.jspx" usageId="view_viewCustPageDef"/>
      </pageMap>
      <pageDefinitionUsages>
        <page id="view_ViewCustomerOrdersPageDef"
              path="view.pageDefs.ViewCustomerOrdersPageDef"/>
        <page id="view_editOrderItemsPageDef"
              path="view.pageDefs.editOrderItemsPageDef"/>
        <page id="view_CreateOrderPageDef" path="view.pageDefs.CreateOrderPageDef"/>
        <page id="view_adfc_config___CreatePageDef" 
              path="view.pageDefs.adfc_config___CreatePageDef"/>
        <page id="view_adfc_config___addOrdPageDef" 
              path="view.pageDefs.adfc_config___addOrdPageDef"/>
        <page id="view_EditOrderPageDef" path="view.pageDefs.EditOrderPageDef"/>
        <page id="view_loginPageDef" path="viewcontroller.pageDefs.loginPageDef"/>
        <page id="view_viewCustPageDef"
              path="viewcontroller.pageDefs.viewCustPageDef"/>
      </pageDefinitionUsages>
      <dataControlUsages>
        <dc id="OrdersSessionEJBLocal" path="model.OrdersSessionEJBLocal"/>
      </dataControlUsages>
    </Application>
    

    .cpxファイルの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のDataBindings.cpxファイルの使用に関する項を参照してください。

  • META-INFディレクトリにadfm.xmlファイルが作成されます。このファイルによってDataBindings.cpxファイルのレジストリが作成され、アプリケーション・メタデータ・レイヤーによって使用されて、アプリケーションのカスタマイズとパーソナライズが行われます。例2-4は、adfm.xmlファイルの例を示しています。

    例2-4 adfm.xmlファイル

    <?xml version="1.0" encoding="UTF-8" ?>
    <MetadataDirectory xmlns="http://xmlns.oracle.com/adfm/metainf"
                       version="11.1.1.0.0">
      <DataBindingRegistry path="view/DataBindings.cpx"/>
    </MetadataDirectory>
    
  • Webアプリケーションの場合、web.xmlファイルにADFバインディング・フィルタが登録されます。

    このADFバインディング・フィルタによって、バインディング・コンテキストへのアクセスに必要なHTTPリクエストが事前処理されます。フィルタの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFデータ・バインディング・フィルタの構成に関する項を参照してください。

  • プロジェクトに次のライブラリが追加されます。

    • ADFモデル・ランタイム

    • ADFモデル汎用ランタイム

  • パッケージ定義ファイルがページ定義サブパッケージに追加されます(ページに対してファイルが存在しない場合)。デフォルトのサブパッケージはview.pageDefsです。

    ページ定義ファイル(pageNamePageDef.xml)は、アプリケーションのビュー・レイヤーにある各ページのADFバインディング・コンテナを定義します。このバインディング・コンテナによって、すべてのADFバインディング・オブジェクトへのランタイム・アクセスが可能になります。図2-9は、JDeveloperの概要エディタでのページ定義ファイルを示しています。

    図2-9 ページ定義ファイル

    ページ定義ファイルの概要エディタ
  • ページで参照されるバインディング・オブジェクトの定義の追加も含めて、ページ定義ファイルが構成されます。例2-5は、ページ定義の対応するXMLファイルを示しています。

    例2-5 ページ定義ファイル

    <?xml version="1.0" encoding="UTF-8" ?>
    <pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel" version="11.1.2.59.53" id="CreateOrderPageDef"
                           Package="view.pageDefs">
      <parameters/>
      <executables>
        <variableIterator id="variables"/>
        <iterator Binds="root" RangeSize="25" DataControl="OrdersSessionEJBLocal"
                               id="OrdersSessionEJBLocalIterator"/>
        <accessorIterator MasterBinding="OrdersSessionEJBLocalIterator"
                          Binds="customerFindAll" RangeSize="25"
                          DataControl="OrdersSessionEJBLocal"
                          BeanClass="model.Customer" id="customerFindAllIterator"/>
        <accessorIterator MasterBinding="customerFindAllIterator" 
                          Binds="SOrdList" RangeSize="25"
                          DataControl="OrdersSessionEJBLocal" 
                          BeanClass="model.Ord" id="SOrdListIterator"/>
        <iterator Binds="root" RangeSize="25" DataControl="OrdersSessionEJBLocal"
                  id="OrdersSessionEJBLocalIterator1"/>
        <accessorIterator MasterBinding="OrdersSessionEJBLocalIterator1"
                          Binds="empFindAll" RangeSize="-1"
                          DataControl="OrdersSessionEJBLocal" 
                          BeanClass="model.Emp" id="empFindAllIterator"/>
      </executables>
      <bindings>
        <attributeValues IterBinding="SOrdListIterator" id="id">
          <AttrNames>
            <Item Value="id"/>
          </AttrNames>
        </attributeValues>
        <attributeValues IterBinding="SOrdListIterator" id="dateOrdered">
          <AttrNames>
            <Item Value="dateOrdered"/>
          </AttrNames>
        </attributeValues>
        <attributeValues IterBinding="SOrdListIterator" id="dateShipped">
          <AttrNames>
            <Item Value="dateShipped"/>
          </AttrNames>
        </attributeValues>
        <attributeValues IterBinding="SOrdListIterator" id="total">
          <AttrNames>
            <Item Value="total"/>
          </AttrNames>
        </attributeValues>
        <button IterBinding="SOrdListIterator" id="orderFilled" 
                DTSupportsMRU="false" StaticList="true">
          <AttrNames>
            <Item Value="orderFilled"/>
          </AttrNames>
          <ValueList>
            <Item Value="Y"/>
            <Item Value="N"/>
          </ValueList>
        </button>
        <list IterBinding="SOrdListIterator" id="paymentType" 
              DTSupportsMRU="true" StaticList="true">
          <AttrNames>
            <Item Value="paymentType"/>
          </AttrNames>
          <ValueList>
            <Item Value="CASH"/>
            <Item Value="CREDIT"/>
          </ValueList>
        </list>
        <list IterBinding="SOrdListIterator" id="salesRepId" 
              DTSupportsMRU="true" StaticList="false"
              ListIter="empFindAllIterator">
          <AttrNames>
            <Item Value="salesRepId"/>
          </AttrNames>
          <ListAttrNames>
            <Item Value="id"/>
          </ListAttrNames>
          <ListDisplayAttrNames>
            <Item Value="firstName"/>
            <Item Value="lastName"/>
          </ListDisplayAttrNames>
        </list>
        
        <methodAction IterBinding="customerFindAllIterator" id="addOrd"
                      RequiresUpdateModel="true"
                      Action="invokeMethod" MethodName="addOrd"
                      IsViewObjectMethod="false"
                      DataControl="OrdersSessionEJBLocal"
                      InstanceName="bindings.customerFindAllIterator.
                                    currentRow.dataProvider"
                      IsLocalObjectReference="true"
                      ReturnName="data.OrdersSessionEJBLocal.methodResults.
                                  addOrd_addOrd_addOrd_result">
          <NamedData NDName="order"
                     NDValue="#{bindings.SOrdListIterator.currentRow.dataProvider}"
                     NDType="model.Ord"/>
        </methodAction>   
        <methodAction id="mergeCustomer" RequiresUpdateModel="true"
                      Action="invokeMethod" MethodName="mergeCustomer"
                      IsViewObjectMethod="false"
                      DataControl="OrdersSessionEJBLocal"
                      InstanceName="data.OrdersSessionEJBLocal.dataProvider" 
                      ReturnName="data.OrdersSessionEJBLocal.methodResults.
                                  mergeCustomer_OrdersSessionEJBLocal_
                                  dataProvider_mergeCustomer_result">
          <NamedData NDName="customer"
                     NDValue="#{bindings.customerFindAllIterator.currentRow.
                              dataProvider}"
                     NDType="model.Customer"/>
        </methodAction>
      </bindings>
    </pageDefinition>
    

    ページ定義ファイルの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のページ定義ファイルに関する項を参照してください。

  • 事前作成済のコンポーネントがビュー・ページに追加されます。

    これらの事前作成済のコンポーネントには、ページ定義ファイルのバインディング・オブジェクトを参照するADFデータ・バインディングが含まれます。例2-6は、ADFモデル・データ・バインドを使用してバインドされたコンポーネントのJSFページのコードを示しています。

    例2-6 ADFモデル・データ・バインディングを使用したJSFページのコードの一部

    .
    .
    .
    <af:table value="#{bindings.Ord.collectionModel}" var="row"
              rows="#{bindings.Ord.rangeSize}"
              emptyText="#{bindings.Ord.viewable ? 'No data to display.' : 
                           'Access Denied.'}"
              fetchSize="#{bindings.Ord.rangeSize}" rowBandingInterval="0"
              selectedRowKeys="#{bindings.Ord.collectionModel.selectedRow}"
              selectionListener="#{bindings.Ord.collectionModel.makeCurrent}"
              rowSelection="single" id="t1">
        <af:column sortProperty="#{bindings.Ord.hints.dateOrdered.name}"
                   sortable="false"
                   headerText="#{bindings.Ord.hints.dateOrdered.label}" id="c1">
            <af:outputText value="#{row.dateOrdered}" id="ot1">
                <af:convertDateTime
                     pattern="#{bindings.Ord.hints.dateOrdered.format}"/>
            </af:outputText>
        </af:column>
        <af:column sortProperty="#{bindings.Ord.hints.dateShipped.name}"
                   sortable="false"
                   headerText="#{bindings.Ord.hints.dateShipped.label}" id="c2">
            <af:outputText value="#{row.dateShipped}" id="ot2">
                <af:convertDateTime
                      pattern="#{bindings.Ord.hints.dateShipped.format}"/>
            </af:outputText>
        </af:column>
        <af:column sortProperty="#{bindings.Ord.hints.id.name}" sortable="false"
                   headerText="#{bindings.Ord.hints.id.label}" id="c3">
            <af:outputText value="#{row.id}" id="ot3"/>
        </af:column>
    .
    .
    .
    
  • ADF Facesを使用するアプリケーションの場合、ADF Facesコンポーネントで必要なすべてのファイルと構成可能な要素が追加されます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』を参照してください。

2.3.3 実行時に行われる処理

ページにADF バインディングが含まれている場合、実行時には、クライアントまたはコントローラから起動されたビジネス・サービスとのやり取りが、バインディング・コンテキストを介して、アプリケーションによって管理されます。バインディング・コンテキストは、アプリケーション内のすべてのデータ・コントロールおよびページ定義のランタイム・マップ(名前付きdataでEL式#{data}を使用してアクセス可能)です。

ADFライフサイクルで、図2-10に示すように、DataControls.dcxDataBindings.cpxおよびページ定義ファイルからADFバインディング・コンテキストが作成されます。DataControls.dcxファイルで、デザインタイム時にアプリケーションで使用可能なデータ・コントロールが定義され、DataBindings.cpxファイルで、実行時にアプリケーションで使用可能なデータ・コントロールが定義されます。DataBindings.cpxファイルには、アプリケーションのページで使用されるデータ・コントロールがすべてリストされ、ページ定義ファイルで定義済のバインディング・オブジェクトを含むバインディング・コンテナがWebページのURL、またはJava Swingアプリケーションの場合はJavaクラスにマップされます。ページ定義ファイルは、アプリケーション・ページで使用するバインディング・オブジェクトを定義します。各ページにページ定義ファイルが1つあります。

図2-10 ADFバインディング・ファイルの実行時の使用

dcx、cpx、ページ定義によってバインディング・コンテキストが構成されます

バインディング・コンテキストには、これらのオブジェクトの現在の実際のインスタンスは含まれていません。かわりに、マップには必要に応じてデータ・コントロールまたはバインディング・コンテナ・オブジェクトになる参照がまず含まれます。オブジェクト(ページ定義など)がアプリケーションから解放されると(タスク・フローが終了したり、リクエストの終了時にバインディング・コンテナまたはデータ・コントロールが解放される場合)、データ・コントロールおよびバインディング・コンテナは参照オブジェクトに戻ります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「Fusionページ・ライフサイクルの理解」を参照してください。

2.3.4 イテレータの結果のキャッシュについて

データ・コントロールでコレクションを変更する場合、変更されていることがADFモデル・レイヤーで認識されるよう、データ・コントロールでコレクションの新規インスタンスをインスタンス化する必要があります。つまり、クライアントのアクションによってコレクションが変更されることがありますが、コレクションの新規インスタンスを作成しないかぎり、その変更はUIに反映されないということです。ただし、パフォーマンス上の理由から、アクセッサとメソッド・イテレータでは結果セットがキャッシュされます(デフォルトでは、イテレータのcacheResults属性はtrueに設定されています)。この設定は、ページが初めてレンダリングされるときにイテレータがリフレッシュされ、コレクションの新規インスタンスが作成されることを意味します。部分ページ・レンダリングを使用したページのリフレッシュやページに戻るユーザー・ナビゲーションなどのページの再アクセス時、イテレータはリフレッシュされません。

たとえば、ページで表のソートが可能であるとします。ソート後にページをリフレッシュする必要があるため、部分ページ・レンダリングを使用して表をリフレッシュする、ソート・イベント用のコードをリスナーに追加します(詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』の部分的なページ・コンテンツのレンダリングに関する項を参照してください)。表のコレクションのインスタンスはすでにインスタンス化され、キャッシュされているため、アクセッサ・イテレータは再実行されません。このため、新しいソート順のコレクションの新規インスタンスは作成されず、ページ上のソート順は同じままになります。

この問題に対処するには、結果をキャッシュしないようイテレータを構成するか、ページのリフレッシュ時にイテレータの再実行に使用できるボタンをページに配置します。アクション属性をメソッドにバインドできるボタンがページにない場合、ページのリフレッシュ時に起動されるinvokeAction実行可能ファイルを使用できます。


注意:

ページでナビゲーション操作を使用してコレクション内を移動する場合、CacheResultsをfalseに設定しないでください。ナビゲーションが機能しなくなります。ボタンを使用してイテレータを再実行する必要があります。ナビゲーション操作の詳細は、第4.4項「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。



パフォーマンスに関するヒント:

結果セットをキャッシュしないようイテレータを設定し、結果セットが多数の行を返す可能性のあるコレクションの場合、パフォーマンスにマイナスの影響があります。大規模な結果セットの場合、invokeActionを使用する必要があります。


結果セットをキャッシュしないようイテレータを設定する手順:

  1. ページ定義ファイルを開き、結果をキャッシュしないイテレータを構造ウィンドウで選択します。

  2. プロパティ・インスペクタで、「詳細」セクションを展開し、CacheResultsfalseに設定します。

ボタンを使用してイテレータを再実行する手順:

  1. コンポーネント・パレットの「ADF Faces」ページから、「ボタン」をページにドラッグ・アンド・ドロップします。

  2. 構造ウィンドウで、ボタンを右クリックし、ポップアップ・メニューで「ADFコントロールにバインド」を選択します。

  3. 「ADFコントロールにバインド」ダイアログで、再実行するイテレータに関連付けられているアクセッサを展開し、アクセッサの「操作」ノードを展開して「実行」を選択します。

invokeActionを使用してイテレータを再実行する手順:

  1. ページ定義ファイルを開き、構造ウィンドウで「実行可能ファイル」を右クリックし、「実行可能ファイルの中に挿入」→「invokeAction」を選択します。

  2. 「invokeActionの挿入」ダイアログで、「ID」を一意の名前に設定します。「バインド」ドロップダウン・リストを使用して、再実行するイテレータを選択します。

  3. 新たに作成したinvokeActionが選択された状態で、プロパティ・インスペクタで「リフレッシュ」「prepareModel」に設定します。

    この設定によって、モデルの準備フェーズでアクセッサ・メソッドが起動されます。これによって、バインディング・コンテナがリフレッシュされます。

  4. RefreshConditionを、値が実際に変更された場合にのみリフレッシュが行われるようにするEL式に設定します。この条件が設定されている場合、invokeActionが2回コールされます。

    ページのライフサイクルのフェーズとrefreshおよびrefreshCondition属性の使用の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のJSFとADFのページ・ライフサイクルの概要に関する項を参照してください。

2.3.5 検証の構成について

データ・コントロール・レベルで属性の検証を設定する以外にも、ページ定義ファイル内の属性バインディングに対して検証を設定できます。ユーザーが、検証が定義されている属性のフィールド内のデータを編集または入力してフォームを送信すると、構成されているルールおよび条件に対してバインドされたデータが検証されます。検証に失敗すると、アプリケーションでエラー・メッセージが表示されます。

ほとんどの場合、ページ・レベルで検証を設定するよりも、データ・コントロール・レベルで検証を設定する方が便利です。データ・コントロールで設定したすべての検証ルールは、そのデータ・コントロールから作成されたすべてのUIコンポーネントに適用されます。

データ・コントロールでの検証の設定の詳細および手順は、3.5項「属性への検証ルールの宣言的な定義」を参照してください。

個別のUIコンポーネントでの検証の設定の詳細および手順は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「ADFモデル・レイヤーでの検証の使用」の章を参照してください。

検証を設定する際、表示されるメッセージを定義できます。デフォルトでは、これらのメッセージはクライアントのダイアログに表示されます。これらのメッセージがインラインで表示されるように構成できます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』の検証および変更のヒントおよびエラー・メッセージの表示に関する項を参照してください。

独自のエラー処理クラスを作成して、メッセージの処理方法を変更することもできます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のエラー処理のカスタマイズに関する項を参照してください。

2.3.6 カスタム・セッションBeanのアクセッサ・メソッドについて

デフォルトで、アクセッサ戻りコレクションをセッションBeanデータ・コントロールからページにドラッグすると、ページに分割されたコレクションができます。この場合、組込みセッションBeanのqueryByRange()メソッドがバインディングから参照されます(セッションBeanの対応するgetBeanFindAll()メソッドではなく)。実行時に必ず使用するgetBeanFindAll()getBeanFindAllSize()またはgetBeanFindAll(x,y)メソッドのカスタム・コードがBeanに存在する場合、データ・コントロールのDataControlHandler属性を削除する必要があります。DataControlHandler属性は、DataControls.dcxファイルのソース・エディタで削除できます。ただし、この属性を削除すると、名前付き問合せおよびページ分割の組込みサポートも使用できなくなります。