この章では、データ・コントロール・パレットを使用した、ページ上にデータを表示する、データ・バインドされたUIコンポーネントの作成方法について説明します。また、データ・コントロール・パレットの使用時に作成されるすべてのオブジェクトを処理する方法についても説明します。
この章の内容は次のとおりです。
この部の残りの章では、データ・バインドされたコンポーネントを使用して特定のタイプのページを作成する方法について説明します。
ADFデータ・コントロールでは、アプリケーションのビジネス・サービスが抽象化され、サービス・データへのADFバインディング・レイヤーのアクセスが提供されます。アプリケーション・モジュール・データ・コントロールは、特定のアプリケーション・モジュールを表し、そのアプリケーション・モジュールのビュー・オブジェクトのインスタンスを公開します。各アプリケーション・モジュールは、データ・コントロールとして自動的に使用可能になります。UIコンポーネントをアプリケーション・モジュール・データ・コントロールにバインドして、実行時にデータを含むページをアクティブ・データ・モデルから移入できます。アプリケーション・モジュール・データ・コントロールの詳細は、第10章「アプリケーション・モジュール・データ・バインディングの概要」を参照してください。
JDeveloperのデータ・コントロール・パレットによって、アプリケーションのデータ・コントロールがIDEで公開されるため、JSFページ上の様々なUIコンポーネントをドラッグ・アンド・ドロップ操作で作成できます。データ・コントロール・パレットによって作成されたUIコンポーネントは、宣言的データ・バインディングを使用します。つまり、データ・バインディング式が自動的に構成され、ほとんどの場合に追加コードを何も書く必要がないということです。
この章では次の内容について説明します。
データ・コントロール・パレットを使用した、データ・バインドされたUIコンポーネントの作成方法
データ・コントロール・パレットに表示される項目
データ・コントロール・パレット使用時にJDeveloperによって自動作成されるオブジェクト
ADFデータ・バインディングEL式の構成方法
ページ定義ファイルの内容およびEL式との関係
データ・コントロール・パレットから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データ・バインドされたユーザー・インタフェースを設計できます。データ・コントロール・パレットを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要な、様々なコードおよびオブジェクトがJDeveloperによって自動的に作成されます。
データ・コントロール・パレットを表示するには、ビジュアル・エディタの「設計」ページで「JSF」ページを開き、「表示」→「データ・コントロール・パレット」を選択します。デフォルトでは、コンポーネント・パレットと同じウィンドウに、データ・コントロール・パレットが表示されます。
図12-1は、SRDemoアプリケーションのデータ・コントロール・パレットを示しています。これは、ビジネス・サービスとしてADF Business Componentsを使用します。
|
注意: データ・コントロール・パレットが空の場合、アクセス対象のデータのビュー・オブジェクトを作成してあることと、それらのビュー・オブジェクトをアプリケーション・モジュールに追加してあることを確認してください。ビュー・オブジェクトおよびアプリケーション・モジュールの作成の詳細は、第5章「ビュー・オブジェクトを使用したデータの問合せ」を参照してください。 |
データ・コントロール・パレットでは、アプリケーションのビジネス・サービスに対して作成されたすべてのデータ・コントロールがリストされます。また、UIコンポーネントへのバインドに使用できるコレクション、メソッドおよび組込み操作がすべて公開されます。データ・コレクションは、データ・モデルに含まれる、一連のデータ・オブジェクト(別名は行セット)を表します。データ・コレクションの各オブジェクトは、データ・モデルに含まれる、構造化された特定のデータ項目(別名は行)を表します。このガイド全体を通して、データ・コレクションおよびコレクションという用語は、区別なく使用されます。
データ・コントロール・パレット内の各ルート・ノードは、特定のデータ・コントロールを表します。各データ・コントロールの下には、オブジェクト、コレクション、メソッドおよび操作の階層リストがあります。この階層がデータ・コントロール・パレットでどのように表示されるかは、データ・コントロールで表されるビジネス・サービスのタイプ、およびビジネス・サービスの定義方法によって異なります。
たとえば、ビジネス・サービスを定義するためにADF Business Componentsを使用するアプリケーションでは、データ・コントロール・パレット上の各データ・コントロールは特定のアプリケーション・モジュールを表し、そのアプリケーションのデータ・モデルでビュー・オブジェクト・インスタンスを公開します。データ・コントロール内のオブジェクトの階層は、アプリケーション・モジュール・データ・モデル用に追加されているビュー・オブジェクト間のビュー・リンクによって定義されます。ビュー・オブジェクトおよびビュー・リンクの作成の詳細は、第5章「ビュー・オブジェクトを使用したデータの問合せ」を参照してください。データ・モデルへのビュー・リンクの追加の詳細は、5.10.4.3項「データ・モデルでアクティブなマスター/ディテール調整を有効化する方法」を参照してください。
データ・コントロール・パレットでは、各データ・コントロール・オブジェクトが特定のアイコンで表されます。表12-1は、各アイコンが表すデータ・コントロール・オブジェクト、データ・コントロール・パレットの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。
表12-1 データ・コントロール・パレットのアイコンおよびオブジェクト階層
| アイコン | 名前 | 説明 | 作成できるコンポーネント |
|---|---|---|---|
|
|
データ・コントロール |
データ・コントロールを表します。データ・コントロール自体を使用してUIコンポーネントを作成することはできませんが、その下に表示される子オブジェクトは、いずれも使用できます。ビジネス・サービスの定義方法によっては、複数のデータ・コントロールが存在することがあります。 通常、各アプリケーション・モジュールに対するデータ・コントロールは1つです。ただし、他のタイプのビジネス・サービス(CSVファイルまたはWebサービスなど)に対して作成された追加のデータ・コントロールがある場合があります。CSVファイルのデータ・コントロールの作成の詳細は、第31章「データ・コントロール・アダプタの作成」を参照してください。Webサービスのデータ・コントロールの作成の詳細は、第33章「Webサービスの使用」を参照してください。 |
なし。他のオブジェクトのコンテナとして機能します。 |
|
|
メソッド |
データ・コントロールのカスタム・メソッドを表します。カスタム・メソッドによって、パラメータの受入れや、アクションまたはビジネス・ロジックの実行を行ったり、単一の値またはデータ・コレクションを戻すことができます。 アプリケーション・モジュール・データ・コントロールでは、カスタム・メソッドがアプリケーション・モジュール自体の中で定義され、通常は、何も戻さないか、単一のスカラー値を戻します。カスタム・メソッドの詳細は、第8章「アプリケーション・モジュールによるビジネス・サービスの実装」を参照してください。 パラメータを受け入れるメソッドの使用方法の詳細は、17.3.2.1項「メソッドでのパラメータの使用方法」を参照してください。 |
コマンド・コンポーネント。 パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。 |
|
|
カスタム・メソッドによって戻されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。 アプリケーション・モジュールで定義されたカスタム・メソッドから戻されるのは通常、単一のスカラー値です。データへの最新の変更の表示がアクティブ・データ・モデルのビュー・オブジェクトによって処理されるため、アプリケーション・モジュール・メソッドではビュー・レイヤーにデータのセットを戻す必要はありません(詳細は、4.5項「アクティブ・データ・モデルの理解」を参照してください)。ただし、非アプリケーション・モジュール・データ・コントロールのカスタム・メソッド(CSVファイルのデータ・コントロールなど)は、ビュー・レイヤーにコレクションを戻すことができます。 メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッド戻りの下に子として表示されるオブジェクトは、コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、および親コレクションで実行できる操作などです。 |
単一値の場合: テキスト・フィールドおよび選択リスト。 コレクションの場合: フォーム、表、ツリーおよびレンジ・ナビゲーションの各コンポーネント。 |
|
|
|
名前付きデータ・コレクションを表します。これは、ビュー・オブジェクト・インスタンスに含まれているデフォルトの行セットです。コレクションの名前は、ビュー・オブジェクト・インスタンス名と一致します。 データ・コレクションは、データ・モデルに含まれる、一連のデータ・オブジェクト(別名は行セット)を表します。データ・コレクションの各オブジェクトは、データ・モデルに含まれる、構造化された特定のデータ項目(別名は行)を表します。このガイド全体を通して、データ・コレクションおよびコレクションという用語は、区別なく使用されます。 ビュー・リンクによって、2つのビュー・オブジェクト間にマスター/ディテール関係が作成されます。アプリケーション・モジュール・データ・モデルにディテール・ビュー・オブジェクト(ビュー・リンクからの結果)のインスタンスを明示的に追加する場合、そのディテール・ビュー・オブジェクトに含まれるコレクションは、マスター・ビュー・オブジェクトに含まれるコレクションの子として表示されます。データ・モデルへのディテール・ビュー・オブジェクトの追加の詳細は、5.10.4.3項「データ・モデルでアクティブなマスター/ディテール調整を有効化する方法」を参照してください。UIコンポーネントを作成するためのマスター/ディテール関係の使用の詳細は、第15章「マスター/ディテール・データの表示」を参照してください。 コレクションの下の子は、コレクションの属性、ビュー・リンクによって関連付けられる他のコレクション、コレクションから値を戻すカスタム・メソッド、およびコレクションに対して実行できる組込み操作などです。 |
フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント、およびマスター/ディテール・コンポーネント。 |
|
|
|
オブジェクト内の個別のデータ要素(ビュー行の属性など)を表します。属性は、自分の属するコレクションまたはメソッド戻りの下に、子として表示されます。 ビュー・オブジェクトに含まれていた属性のみが、コレクションの下に示されます。ビュー・オブジェクトが1つ以上のエンティティ・オブジェクトを結合する場合、ビュー・オブジェクトのコレクションには、すべての基礎となるエンティティ・オブジェクトから選択された属性が含まれます。 |
ラベル、テキスト・フィールドおよび選択リストの各コンポーネント。 |
|
|
|
親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。データ・コントロール操作は、コレクションまたはメソッド戻りの下、およびルート・データ・コントロール・ノードの下の「Operations」フォルダの中にあります。特定のコレクションまたはメソッド戻りの子である操作は、これらのオブジェクトのみに作用します。これに対して、データ・コントロール・ノードの下にある操作は、データ・コントロール内のすべてのオブジェクトに作用します。 1つ以上のパラメータが操作に必要な場合、それらのパラメータは操作の下の「Parameters」フォルダにリストされます。 |
ボタンやリンクなどのUIのアクション。 |
|
|
|
メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「Parameters」フォルダ内に表示されます。 |
ラベル、テキストおよび選択リストの各コンポーネント。 |
データ・バインドされたUIコンポーネントを作成するには、データ・コントロール・パレットから項目をドラッグし、「JSF」ページにドロップします。
データ・コントロール・パレットから項目をドラッグしてページにドロップすると、ドロップした項目に使用できるすべてのデフォルトUIコンポーネントのポップアップ・メニューが表示されます。ポップアップ・メニューから、作成するコンポーネントを選択します。
図12-2は、データ・コントロール・パレットからのコレクションがページにドロップされる際に表示されるポップアップ・メニューを示します。
ポップアップ・メニューから選択したコンポーネントに応じて、そのコンポーネントの外観を定義するためのダイアログが自動的に表示されます。たとえば、ポップアップ・メニューから「ADF読取り専用表」を選択すると、「表の列の編集」ダイアログが表示されます。このダイアログを使用して、表の列に表示する属性、列ラベル、各列に使用するテキスト・フィールドのタイプ、および組み込む機能(選択ファセットや列のソートなど)を定義できます。(表の作成の詳細は、第14章「表の追加」を参照してください。)
作成されたUIコンポーネントは、JDeveloperビジュアル・エディタに表示されます。たとえば、データ・コントロール・パレットからコレクションをドラッグして、ポップアップ・メニューから「ADF読取り専用表」を選択した場合は、図12-3のように、ビジュアル・エディタに読取り専用の表が表示されます。
例で示した表の列ラベルには、バインディング式が含まれています。この式によって、各列ラベルがデータ・コレクション内の1つの属性にバインドされます。デフォルトの表には、イテレータ・バインディングによってデータ・コレクションのイテレータとバインドされた、選択ファセットが含まれます。選択ファセットは、表コンポーネントをドロップすると表示される「表の列の編集」ダイアログで「選択を有効にする」オプションを選択することで含められます。(バインディング式の詳細は、12.6項「ADFデータ・バインディングEL式の作成」を参照してください。)
デフォルトでは、データ・コントロール・パレットでADF Facesコンポーネントを使用したときに作成されるUIコンポーネントは、ADFデータ・コントロール内のコレクションおよびコレクション属性にバインドされ、1つ以上の組込み機能が装備されます。これらの機能は次のとおりです。
データ・バインド・ラベル
ツールチップ
書式設定
基本的なナビゲーション・ボタン
検証(検証規則が特定の属性にアタッチされている場合は、第20章「検証と変換の使用」を参照してください。)
デフォルトのコンポーネントは、そのまま使用しても十分機能します。ただし、特定のニーズに合せて変更することができます。コンポーネントおよびその多様な機能の詳細は、この部の後の章で説明します。
|
ヒント: ページで使用するADFデータ・バインド・コンポーネントのタイプを変更する場合は、そのコンポーネントを削除して、データ・コントロール・パレットから新しいコンポーネントをドラッグ・アンド・ドロップする方法が最も簡単です。データ・バインド・コンポーネントをページから削除する場合、それに関連するバインディング・オブジェクトがページ定義ファイル内で他のコンポーネントから参照されていなければ、それらのバインディング・オブジェクトもJDeveloperによって自動的に削除されます。 |
ADF WebアプリケーションはJSFフレームワークを使用して作成されますが、ADFデータ・バインドUIコンポーネントを含むページのレンダリングおよび処理を行うために、いくつかの追加アプリケーション・オブジェクト定義が必要になります。データ・コントロール・パレットを使用しない場合、これらの様々なファイルを手動で構成する必要があります。一方、データ・コントロール・パレットを使用した場合は、必要なすべての手順がJDeveloperによって行われます。自動的に処理される手順は次のとおりです。
DataBindings.cpxファイルがApplication Sourcesディレクトリ内のビュー・パッケージに作成されます(このファイルが存在しない場合のみ)。また、そのページ用にエントリが追加されます。
DataBindings.cpxファイルでは、アプリケーションのバインディング・コンテキストを定義します。このファイルによって、個々のページがページ定義ファイルに含まれるバインディング定義にマップされ、これらのページが使用するデータ・コントロールが登録されます。詳細は、12.3項「DataBindings.cpxファイルでの作業」を参照してください。
web.xmlファイルにADFバインディング・フィルタが登録されます。
ADFバインディング・フィルタにより、バインディング・コンテキストへのアクセスが必要なHTTPリクエストが、すべて処理されます。バインディング・フィルタの構成の詳細は、12.4項「ADFバインディング・フィルタの構成」を参照してください。
例12-1のように、faces-config.xmlファイルにADFフェーズ・リスナーが登録されます。
例12-1 faces-config.xmlファイルへのADFフェーズ・リスナーの入力
<lifecycle> <phase-listener>oracle.adf.controller.faces.lifecycle.ADFPhaseListener </phase-listener> </lifecycle>
ADFフェーズ・リスナーは、ADFページ・ライフサイクルを実行するために使用されます。このフェーズ・リスナーは、モデルの準備、モデル更新の検証、およびレンダリングするページの準備に関係する独自のフェーズをその前後に実行する必要がある、すべてのJSFフェーズをリスニングします。ADFライフサイクルの詳細は、13.2.3項「実行時に行われる処理: JSFおよびADFのライフサイクル」を参照してください。
プロジェクト・プロパティのADFm設定で名前が定義されているページ定義サブパッケージに、ページ定義ファイルが追加されます(ページ用にこのファイルが存在しない場合のみ)。デフォルトのサブパッケージは、Application Sourcesディレクトリにあるview.pageDefsです。
ページ定義ファイル(<pageName>PageDef.xml)は、アプリケーションのビュー・レイヤーにある各ページのADFバインディング・コンテナを定義します。バインディング・コンテナでは、すべてのADFバインディング・オブジェクトへのランタイム・アクセスが行われます。ページ定義ファイルを使用して、特定のUIコンポーネントに対するバインディング・オブジェクト定義を定義および編集する方法は、後の章で説明します。ページ定義ファイルの詳細は、12.5項「ページ定義ファイルでの作業」を参照してください。
ページ定義ファイルが構成されます。この処理では、ページによって参照されるバインディング・オブジェクトの定義も追加されます。
事前作成済のコンポーネントがJSFページに追加されます。
これらの事前作成済のコンポーネントには、ページ定義ファイルのバインディング・オブジェクトを参照するADFデータ・バインディング式言語(EL)式が含まれます。詳細は、12.6項「ADFデータ・バインディングEL式の作成」を参照してください。
ADF Facesコンポーネントに必要とされるすべてのライブラリ、ファイルおよび構成要素が追加されます(ADF Facesコンポーネントが使用される場合)。詳細は、11.4.2項「ADF Facesコンポーネントの初回挿入時に発生する処理」を参照してください。
ページにADFバインディングが含まれている場合、実行時には、クライアントまたはコントローラから起動されたビジネス・サービスとのやり取りが、Oracle ADFバインディング・コンテキストと呼ばれるシングル・オブジェクトを介して、アプリケーションによって管理されます。ADFバインディング・コンテキストはコンテナ・オブジェクトの1つで、Oracle ADFモデル・レイヤーから導出されたデータ・コントロールおよびデータ・バインディング・オブジェクトのリストを含みます。
図12-4に示されるように、ADFライフサイクルによって、DataBindings.cpxファイルおよびページ定義ファイルからOracle ADFバインディング・コンテキストが作成されます。アプリケーション・モジュールでは、設計時にアプリケーションに使用できるデータ・コントロールを定義します。しかし、DataBindings.cpx ファイルでは、実行時にアプリケーションに使用できるデータ・コントロールを定義します。DataBindings.cpxファイルには、アプリケーションのページで使用中のデータ・コントロールがすべてリストされ、ページ定義ファイルで定義済のバインディング・オブジェクトを含むバインディング・コンテナがWebページのURLにマップされます。
ページ定義ファイルは、アプリケーション・ページで使用されるバインディング・オブジェクトを定義します。各ページにページ定義ファイルが1つあります。ADFライフサイクルの詳細は、13.2.3項「実行時に行われる処理: JSFおよびADFのライフサイクル」を参照してください。
DataBindings.cpxファイルは、アプリケーション全体のOracle ADFバインディング・コンテキストを定義し、メタデータを提供します。このメタデータから、実行時にOracle ADFバインディング・オブジェクトが作成されます。このファイルは、個々のページをページ定義ファイルにマップし、どのデータ・コントロールがアプリケーションによって使用されるかを宣言します。実行時には、DataBindings.cpxファイルにリストされたデータ・コントロールのみが現在のアプリケーションで使用できます。
初めてデータ・コントロール・パレットを使用してアプリケーションのページにコンポーネントを追加する際には、JDeveloperによって、ビュー・プロジェクトのApplication Sourcesディレクトリのビュー・パッケージ内に、DataBindings.cpxファイルが自動的に作成されます。DataBindings.cpxファイルが作成されると、最初のページ用のエントリが自動的に追加されます。その後、データ・コントロール・パレットを使用してページにコンポーネントを追加するたびに、そのページ用のエントリが存在しない場合は、エントリがDataBindings.cpxに自動的に追加されます。
例12-2は、SRDemoアプリケーションのDataBindings.cpxファイルの例を示しています。pageMap要素は、各JSFページを対応するページ定義ファイルにマップします。pageDefintionUsages要素は、アプリケーション内の各ページ定義ファイルを識別します。dataControlUsages要素は、ページ定義ファイル内で定義済のバインディング・オブジェクトによって使用されるデータ・コントロールを識別します。dataControlUsages要素内のBC4JDataControl要素は、アプリケーションで使用中のデータ・コントロール(アプリケーション・モジュール)を識別します。dc要素は、アプリケーションで使用中の任意のデータ・コントロール・アダプタ(CSVファイルのデータ・コントロールなど)を識別します。DataBindings.cpxファイルの要素および属性の詳細は、付録A「ADF XMLファイルのリファレンス」を参照してください。
例12-2 DataBindings.cpxファイル
<?xml version="1.0" encoding="UTF-8" ?>
<Application xmlns="http://xmlns.oracle.com/adfm/application"
version="10.1.3.35.65" id="DataBindings" SeparateXMLFiles="false"
Package="oracle.srdemo.view" ClientType="Generic">
<pageMap>
<page path="/app/SRList.jspx" usageId="app_SRListPageDef"/>
<page path="/app/SRCreate.jspx" usageId="app_SRCreatePageDef"/>
<page path="/app/SRCreateConfirm.jspx" usageId="app_SRCreateConfirmPageDef"/>
...
</pageMap>
<pageDefinitionUsages>
<page id="app_SRListPageDef"
path="oracle.srdemo.view.pageDefs.app_SRListPageDef"/>
<page id="app_SRCreatePageDef"
path="oracle.srdemo.view.pageDefs.app_SRCreatePageDef"/>
<page id="app_SRCreateConfirmPageDef"
path="oracle.srdemo.view.pageDefs.app_SRCreateConfirmPageDef"/>
...
</pageDefinitionUsages>
<dataControlUsages>
<dc id="SRDemoFAQ" path="oracle.srdemo.faq.SRDemoFAQ"/>
<BC4JDataControl id="SRService" Package="oracle.srdemo.model"
FactoryClass="oracle.adf.model.bc4j.DataControlFactoryImpl"
SupportsTransactions="true" SupportsFindMode="true"
SupportsRangesize="true" SupportsResetState="true"
SupportsSortCollection="true"
Configuration="SRServiceLocal" syncMode="Immediate"
xmlns="http://xmlns.oracle.com/adfm/datacontrol"/>
</dataControlUsages>
</Application>
ADFバインディング・フィルタはサーブレット・フィルタの1つで、oracle.adf.model.servlet.ADFBindingFilterクラスのインスタンスです。ADF Webアプリケーションは、ADFバインディング・フィルタを使用して、バインディング・コンテキストへのアクセスが必要なすべてのHTTPリクエストを前処理します。
データ・コントロール・パレットを使用して、初めてデータ・バインド・コンポーネントをページに追加する際には、JDeveloperによって、アプリケーションのweb.xmlファイル内にフィルタが自動的に構成されます。
バインディング・フィルタを構成するために、JDeveloperによって、次の要素がweb.xmlファイルに追加されます。
サーブレット・コンテキスト・パラメータ: アプリケーション・バインディング・コンテキストを定義するため、バインディング・フィルタに実行時に読み取られるDataBindings.cpxファイルを指定します。
例12-3に示すように、サーブレット・コンテキスト・パラメータは、web.xmlファイルで定義されます。param-name要素には値CpxFileName、param-value要素にはアプリケーションのDataBindings.cpxファイルの完全修飾名が拡張子.cpxなしで、それぞれ含まれている必要があります。
ADFバインディング・フィルタ・クラス: javax.servlet.Filterインタフェースを実装するバインディング・フィルタ・オブジェクトの名前を指定します。
例12-4に示すように、ADFバインディング・フィルタはweb.xmlファイルで定義されます。filter-name要素には値adfBindings、filter-class要素には、バインディング・フィルタ・クラスの完全修飾名oracle.adf.model.servlet.ADFBindingFilterがそれぞれ含まれている必要があります。
フィルタ・マッピング: フィルタをWebアプリケーション内の静的リソースまたはサーブレットにリンクします。
実行時にマップ済リソースが要求されると、フィルタが起動します。フィルタ・マッピングは、web.xmlファイルで例12-5のように定義されます。filter-name要素は、値adfBindingsを含む必要があります。この例には、jspおよびjspxの両方のページ書式に対するフィルタ・マッピングが含まれています。
例12-5 web.xmlファイルで定義されたフィルタ・マッピング
<filter-mapping>
<filter-name>adfBindings</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>adfBindings</filter-name>
<url-pattern>*.jspx</url-pattern>
</filter-mapping>
|
ヒント: web.xmlファイルで複数のフィルタが定義されている場合は、それらのフィルタを必ず実行順に記載してください。実行時には、web.xmlファイルでの表示順にフィルタが実行されます。 |
実行時に、ADFバインディング・フィルタは次の機能を実行します。
フィルタを初期化する際に、web.xmlファイルでフィルタ・パラメータとして指定されている名前で、文字コードをオーバーライドします。フィルタinit-param要素のパラメータ名は、encodingです。
ADFContextオブジェクトをインスタンス化します。このオブジェクトは、ADFアプリケーションの実行コンテキストであり、ADFのコンテキスト情報が含まれます。これらの情報には、セキュリティ・コンテキスト、およびリクエストとレスポンスのオブジェクトを含む環境クラスが含まれます。
同じブラウザ(フレームセットなど)から送信されるHTTPリクエストをシリアライズし、マルチスレッドの問題を回避します。
リクエストが送信されることをデータ・コントロール・インスタンスに通知し、リクエストごとに必要な設定が行われるようにします。
レスポンスがクライアントに送信された後でデータ・コントロール・インスタンスに通知し、リクエストごとに必要なクリーンアップが行われるようにします。
ページ定義ファイルは、実行時にUIコンポーネントにデータを移入するバインディング・オブジェクトを定義します。ADFバインディングが設定されているすべてのページには、使用するバインディング・オブジェクトを定義する、対応するページ定義ファイルが必要です。ページ定義ファイルによって、すべてのADFバインディングに設計時アクセスが提供されます。実行時には、ページ定義ファイルによって定義されたバインディング・オブジェクトが、ページ定義ファイルの実行時インスタンスであるバインディング・コンテナ内でインスタンス化されます。
データ・コントロール・パレットを初めて使用する際には、JDeveloperによって、そのページのページ定義ファイルが自動的に作成され、コンポーネントが参照する各バインディング・オブジェクトの定義が自動的に追加されます。それ以降、ページにデータ・バインド・コンポーネントを追加するたびに、JDeveloperによって、必要なバインディング・オブジェクト定義がページ定義ファイルに自動的に追加されます。
デフォルトでは、ページ定義ファイルは、ビュー・プロジェクトのApplication Sourcesディレクトリにあるview.PageDefsパッケージに含まれています。ページ定義ファイルの場所は、プロジェクト・プロパティの「ADFm設定」ページを使用して変更できます。
JDeveloperによるページ定義ファイルの命名には、次の規則が使用されます。
<pageName>PageDef.xml
上の<pageName>は、JSFページの名前を表します。つまり、JSFページの名前がSRList.jspの場合は、デフォルトのページ定義ファイル名はSRListPageDef.xmlになります。ページをサブディレクトリに編成している場合、次の規則に従って、ページ定義ファイル名の前にディレクトリ名が追加されます。
<directoryName>_<pageName>PageDef.xml
たとえば、SRDemoアプリケーションでは、SRMainページのページ定義ファイルの名前(Web Contentフォルダのappサブディレクトリ内に存在)は、app_SRMainPageDef.xmlです。
ページ定義ファイルを開くには、ビジュアル・エディタまたはApplication Navigatorのページ上で右クリックし、「ページ定義に移動」を選択します。
例12-6は、SRDemoアプリケーションでSRCreateページに対して作成されたページ定義ファイルの例を示しています。この例では、ページ定義ファイルによって、次のラッパー要素の下にあるバインディング・オブジェクト定義がグループ化されています。
parameters(詳細は、12.5.2.1項「parameters要素で定義されるバインディング・オブジェクト」を参照)
executables(詳細は、12.5.2.2項「executables要素で定義されるバインディング・オブジェクト」を参照)
bindings(詳細は、12.5.2.3項「bindings要素で定義されるバインディング・オブジェクト」を参照)
各ラッパー要素には、特定のタイプのバインディング・オブジェクト定義が含まれます。各バインディング・オブジェクト定義のid属性は、バインディング・オブジェクトの名前を指定します。各バインディング・オブジェクトの名前は、ページ定義ファイル内で一意であることが必要です。デフォルトでは、バインディング・オブジェクトの名前は、その作成に使用されたデータ・コントロール・オブジェクトに基づいて設定されます。データ・コントロール・オブジェクトがページで2回以上使用される場合、一意性を維持するために、JDeveloperによりデフォルトのバインディング・オブジェクト名に番号が追加されます。12.6項「ADFデータ・バインディングEL式の作成」では、ADFデータ・バインディングEL式によるバインディング・オブジェクト名の参照方法について説明しています。
例12-6 ページ定義ファイル
<?xml version="1.0" encoding="UTF-8" ?>
<pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
version="10.1.3.35.65" id="app_SRCreatePageDef"
Package="oracle.srdemo.view.pageDefs">
<parameters/>
<executables>
<invokeAction Binds="cancelNewServiceRequest"
id="clearServiceRequestFieldsIfNotInTrain"
Refresh="prepareModel"
RefreshCondition="${adfFacesContext.postback == false and empty
requestScope.processChoice}"/>
<iterator id="ProductListIterator" Binds="ProductList" RangeSize="-1"
DataControl="SRService"/>
<iterator id="GlobalsIterator" RangeSize="10" Binds="Globals"
DataControl="SRService"/>
</executables>
<bindings>
<attributeValues IterBinding="GlobalsIterator" id="ProblemDescription">
<AttrNames>
<Item Value="ProblemDescription"/>
</AttrNames>
</attributeValues>
<list StaticList="false" ListOperMode="0" IterBinding="GlobalsIterator"
ListIter="ProductListIterator" id="ProductList">
<AttrNames>
<Item Value="ProductId"/>
<Item Value="ProductName"/>
</AttrNames>
<ListAttrNames>
<Item Value="ProdId"/>
<Item Value="Name"/>
</ListAttrNames>
<ListDisplayAttrNames>
<Item Value="Name"/>
</ListDisplayAttrNames>
</list>
<attributeValues IterBinding="GlobalsIterator" id="ProductId">
<AttrNames>
<Item Value="ProductId"/>
</AttrNames>
</attributeValues>
<attributeValues IterBinding="GlobalsIterator" id="ProductName">
<AttrNames>
<Item Value="ProductName"/>
</AttrNames>
<methodAction id="cancelNewServiceRequest"
</attributeValues>
InstanceName="SRService.dataProvider"
DataControl="SRService"
MethodName="cancelNewServiceRequest"
RequiresUpdateModel="true" Action="999"/>
</bindings>
</pageDefinition>
ページ定義ファイルを使用して、特定のUIコンポーネントに対するバインディングを定義および編集する方法は、後の章で説明します。ページ定義ファイルで使用できるすべての要素および属性の説明は、付録A「<pageName>PageDef.xml」を参照してください。
ページ定義ファイルのparameters要素は、ページのパラメータを定義します。
パラメータ・バインディング・オブジェクトは、(ADFライフサイクルのモデルの準備フェーズでの)リクエスト開始時にページによって評価されるパラメータを宣言します。Webアプリケーションでは、ページ・パラメータは、モデルの準備フェーズで1回評価されます。(ADFライフサイクルの詳細は13.2.3項「実行時に行われる処理: JSFおよびADFのライフサイクル」を参照してください。)静的値、バインディング式または静的値を割り当てるEL式を使用して、ページ定義ファイルでパラメータの値を定義できます。
SRDemoアプリケーションでは、パラメータ・バインディングを使用しません。ただし、例12-7は、ページ定義ファイルでのパラメータ・バインディング・オブジェクトの定義方法を示しています。
例12-7 ページ定義ファイルのparameters要素
<parameters>
<parameter id="filedBy"
value="${bindings.userId}"/>
<parameter id="status"
value="${param.status != null ? param.status : 'Open'}"/>
</parameters>
filedByパラメータの値は、userIDデータ属性(後でbindingsラッパー要素内で定義される属性バインディング)のバインディングによって定義されます。statusパラメータの値は、静的値を割り当てるEL式によって定義されます。
|
ヒント: デフォルトでは、ページ定義ファイルに表示されるEL式の接頭辞として、ドル記号($)が使用されます。これは、JSP EL構文の標準です。ただし、ハッシュ記号(#)の接頭辞も使用できます。これもJSF EL構文の標準です。 |
パラメータをメソッドへ渡す方法の詳細は、第17章「より複雑なページの作成」を参照してください。
ページ定義ファイルのexecutables要素は、次のタイプの実行可能バインディング・オブジェクトを定義します。
iterator: ビュー・オブジェクト・コレクション全体で反復処理するイテレータにバインドします。
コレクションまたはコレクションの属性をページ上にドロップする際、イテレータ・バインディングが自動的にexecutables要素に追加されます。
methodIterator: データ・コントロールでカスタム・メソッドによって戻される、コレクション全体で反復処理するイテレータにバインドします。
メソッド・イテレータ・バインディングは、常にbindings要素で定義されたmethodActionバインディングに関連します。methodActionバインディングは、メソッドの起動方法およびメソッドが取得するパラメータ(該当する場合)の詳細をカプセル化します。methodActionバインディングの詳細は、12.5.2.3項「bindings要素で定義されるバインディング・オブジェクト」を参照してください。
非アプリケーション・モジュール・データ・コントロールから、メソッド戻りコレクションまたはメソッド戻りコレクションの属性をページ上にドロップする場合のみ、executables要素にmethodIteratorバインディングが表示されます。アプリケーション・モジュール・データ・コントロールのみを使用する場合、iteratorバインディングのみ表示されます。
variableIterator: バインディング・コンテナ内のすべての変数を他のバインディングに公開するイテレータにバインドします。
ページの変数は、バインディング・コンテナに対してローカルであり、バインディング・コンテナ・オブジェクトが存在する間のみ存在します。ページから収集したパラメータが要求されるデータ・コントロール・メソッドまたはデータ・コントロール操作を使用する際には、JDeveloperによって、ページ定義ファイル内のパラメータの変数が自動的に定義されます。属性バインディングは、ページ変数を参照できます。
variableIterator要素には、2つの変数定義タイプ(variableおよびvariableUsage)のうち1つを含むことができます。variableタイプ変数は単純な値ホルダーですが、variableUsageタイプ変数は、ビュー・オブジェクトの名前付きバインド・パラメータに関連する値ホルダーです。変数をvariableUsageタイプとして定義すると、バインドされるビュー・オブジェクトの名前付きバインド変数からデフォルト値やUIコントロール・ヒントを継承できるようになります。
invokeAction: ページ・ライフサイクルの任意のフェーズ中に、actionバインディングまたはmethodActionバインディングで定義された操作またはメソッドを起動するメソッドにバインドします。
アクションおよびメソッド・アクション・バインディングは、bindings要素で定義されます。methodActionオブジェクトの詳細は、12.5.2.3項「bindings要素で定義されるバインディング・オブジェクト」を参照してください。
イテレータ・バインディング・オブジェクトは、基礎となるADF RowSetIteratorオブジェクトにバインドされます。このオブジェクトは、現在のオブジェクトと現在のレンジ情報を管理します。イテレータ・バインディングは、ページで使用される他のバインディング・オブジェクトに、現在のオブジェクトおよびレンジ状態を公開します。イテレータ・レンジは、ページ上に表示される現在のオブジェクトのセットを表します。現在のレンジにおけるオブジェクトの最大数は、イテレータのrangeSize属性で定義されます。たとえば、データ・コントロールのコレクションがサービス・リクエストを含み、イテレータ・レンジ・サイズが10である場合、コレクション内の最初の10個のサービス・リクエストがページ上に表示されます。ユーザーが下にスクロールすると、次の10個のサービス・リクエストが表示され、同様に続いていきます。ユーザーが上にスクロールすると、前の10個のセットが表示されます。
イテレータ・バインディングは、ページ上で使用される各コレクションに1つずつありますが、variablesIteratorバインディングはページ上で使用されるすべての変数に対して1つのみです。(変数イテレータは、バインディング・コンテナ変数である属性を持つオブジェクトのみを含むコレクションを指し示すイテレータに類似しています。)実行時にコンポーネント値にデータを移入するため、ページ上のすべての値バインディングはイテレータ・バインディングを参照する必要があります。(値バインディングの詳細は、12.5.2.3項「bindings要素で定義されるバインディング・オブジェクト」を参照してください。)
実行時には、executables要素内のバインディングが、ページ定義ファイルでの表示順にリフレッシュされます。イテレータ・バインディングをリフレッシュすると、そのバインディングの基礎となるRowSetIteratorオブジェクトにバインディングを再接続します。invokeActionバインディングをリフレッシュすると、アクションが起動されます。ただし、任意のバインディングをリフレッシュする前に、ADFランタイムによって、イテレータおよびinvokeAction要素で指定された任意のRefreshおよびRefreshCondition属性が評価されます。Refresh属性は、実行可能ファイルが起動されるADFライフサイクル・フェーズを指定します。RefreshCondition属性は、実行可能ファイルが起動される条件を指定します。ブールEL式を使用して、RefreshCondition値を指定できます。RefreshCondition属性を空白のままにする場合は、trueと評価されます。
バインディングのリフレッシュ方法とRefresh属性およびRefreshCondition属性の設定方法の詳細は、10.5.5項「InvokeActionおよびイテレータ・バインディングにRefreshを適切に使用する方法」を参照してください。
|
ヒント: 構造ウィンドウを使用して、executables要素のバインディングをドラッグ・アンド・ドロップで並び替えます。 |
例12-8は、executables要素の例を示します。これはinvokeActionバインディング・オブジェクトと2つのイテレータ・オブジェクトを定義します。
例12-8 ページ定義ファイルのexecutables要素
<executables>
<invokeAction Binds="cancelNewServiceRequest"
id="clearServiceRequestFieldsIfNotInTrain"
Refresh="prepareModel"
RefreshCondition="${adfFacesContext.postback == false and empty
requestScope.processChoice}"/>
<iterator id="ProductListIterator" Binds="ProductList" RangeSize="-1"
DataControl="SRService"/>
<iterator id="GlobalsIterator" RangeSize="10" Binds="Globals"
DataControl="SRService"/>
</executables>
<bindings>
<attributeValues IterBinding="GlobalsIterator" id="ProblemDescription">
<AttrNames>
<Item Value="ProblemDescription"/>
</AttrNames>
</attributeValues>
...
<methodAction id="cancelNewServiceRequest"
InstanceName="SRService.dataProvider"
DataControl="SRService"
MethodName="cancelNewServiceRequest"
RequiresUpdateModel="true" Action="999"/>
</bindings>
invokeActionオブジェクトは、cancelNewServiceRequestメソッドを起動します。これはBinds属性で指定されます。bindingsラッパー要素では、methodActionバインディング・オブジェクトがメソッドの起動方法の詳細をカプセル化します。(methodActionオブジェクトの詳細は、12.5.2.3項「bindings要素で定義されるバインディング・オブジェクト」を参照してください。)Refresh属性は、ADFライフサイクルのどの時点でメソッドを実行するかを指定します。一方、RefreshCondition属性は、アクションを起動する条件を提供します。(Refresh属性およびRefreshCondition属性の詳細は、A.6項「<pageName>PageDef.xml」を参照してください。
ページ上にGlobalsコレクションのProductId属性をドロップすることにより、ProductListIteratorという名前のイテレータ・バインディングがリスト・ボックスとして作成されました。「リスト・バインディング・エディタ」で「追加」ボタンを使用して、データ・モデルのProductListビュー・オブジェクト・インスタンスからのリストに選択肢として表示する項目に対して、イテレータ・バインディングを新規作成しました。(詳細は、19.7項「選択リストの作成」を参照してください。)
iterator要素のBinds属性によって、イテレータが反復処理するコレクションが定義されます。この場合、これはProductListコレクションです。RangeSize属性は、イテレータが一度にページ上で表示するオブジェクトの数を定義します。RangeSizeの値が-1の場合は、イテレータによってコレクションのすべてのオブジェクトが表示されます。
|
ヒント: 通常、イテレータ・バインディングのデフォルト・レンジ・サイズは10です。ただし、イテレータ・バインディングがリスト・バインディング・エディタから作成される場合、そのレンジ・サイズは-1にデフォルト設定されるため、最初の10個のみでなく、すべての選択肢がリストに表示されます。 |
最初に、Globalsコレクションから属性の1つがページ上にドロップされた際に、GlobalsIteratorという名前のイテレータ・バインディングが作成されています。この場合、RangeSize属性は10に設定されます。つまり、イテレータ・バインディングは、一度に最大10個のオブジェクトをコレクションから表示します。bindingsラッパー要素では、attributeValues要素のIterBinding属性がGlobalsIteratorイテレータ・バインディングを参照します。これによって、データを伴うProblemDescriptionテキスト・フィールドが移入されます。
ページ定義ファイルのbindings要素は、次のタイプのバインディング・オブジェクトを定義します。
値: イテレータ・バインディングを参照してUIコンポーネントにデータを表示します。データ・コントロールのデータを表示するページ内の個々のUIコンポーネントは、それぞれ1つの値バインディング・オブジェクトにバインドされます。値バインディング・オブジェクトは、次のとおりです。
methodAction: ボタンやリンクなどのコマンド・コンポーネントをデータ・コントロール上のカスタム・メソッドにバインドします。methodActionバインディング・オブジェクトは、メソッドの起動方法およびメソッドが取得するパラメータ(該当する場合)の詳細をカプセル化します。
action: ボタンやリンクなどのコマンド・コンポーネントを、組込みデータ・コントロール操作(CommitやRollbackなど)に、または組込みコレクションレベル操作(Create、Delete、Next、PreviousやSaveなど)にバインドします。
bindings要素に定義されたバインディング・オブジェクトは、まとめてコントロール・バインディングと呼ばれます。これは、ページの各データ・バインド・コントロールはこれらのオブジェクトの1つにバインドされており、さらに各オブジェクトはexecutables要素に定義されたオブジェクトにバインドされているためです。
例12-9は、bindings要素の例を示します。これは、ProblemDescriptionと呼ばれるテキスト・フィールドに対して1つの属性バインディングを定義し、cancelNewServiceRequestと呼ばれる1つのmethodActionバインディングを定義します。
例12-9 ページ定義ファイルのbindings要素
<bindings>
<attributeValues IterBinding="GlobalsIterator" id="ProblemDescription">
<AttrNames>
<Item Value="ProblemDescription"/>
</AttrNames>
</attributeValues>
...
<methodAction id="cancelNewServiceRequest"
InstanceName="SRService.dataProvider"
DataControl="SRService"
MethodName="cancelNewServiceRequest"
RequiresUpdateModel="true" Action="999"/>
</bindings>
methodAction要素で定義されるバインディング・オブジェクトは、cancelNewServiceRequestメソッドを起動するために必要な情報をカプセル化します。これは、MethodName属性内で識別されます。RequiresUpdateModel属性のtrueの値は、メソッドを実行する前にモデル・レイヤーを更新する必要があることを指定します。
cancelnewServiceRequestメソッドは、パラメータを受け入れません。受け入れた場合、methodActionバインディング・オブジェクト定義には、メソッドで想定されるパラメータを定義するNamedData要素が1つ以上含まれます。パラメータをメソッドへ渡す方法の詳細は、第17章「より複雑なページの作成」を参照してください。
attributeValues要素は、ページ上のテキスト・フィールドに対して値バインディングを定義します。例では、ページ上にAttrNames要素内で定義される属性(ProblemDescription)が1つのみ表示されます。IterBinding属性は、テキスト・フィールドのデータを表示するイテレータ・バインディングを参照します。
実行時に、ADFページ・ライフサイクルは、DataBindings.cpxファイルの情報を使用して、ページ定義ファイルのURLと一致するADFバインディング・コンテキストに、ページURLを渡します。次に、現在のセッションにバインディング・コンテナが存在しない場合、バインディング・コンテキストがバインディング・コンテナをインスタンス化します。バインディング・コンテナは、ページ定義ファイルで定義されるすべてのバインディング・オブジェクトを含む、ランタイム・インスタンス・オブジェクトです。ページのUIコンポーネントによって表示されるすべてのデータは、バインディング・コンテナ内のバインディング・オブジェクトによって提供されます。ページ上のコンポーネントによって使用されるADFデータ・バインディング式は、実行時に評価され、ページのレンダリング時にバインディング・オブジェクトによって提供される値に置き換えられます。
デフォルトでは、バインディング・コンテナおよびそれに含まれるバインディング・オブジェクトは、セッション・スコープで定義されます。ただし、値バインディングおよびイテレータ・バインディングによって参照される値は、リクエスト間で定義されず、スケーラビリティ上の理由により、セッション・スコープに残りません。このため、バインディング・オブジェクトが参照する値は、そのバインディング・コンテナがADFライフサイクルによって準備されているリクエストの間のみ有効です。セッション・スコープには、バインディング・コンテナおよびバインディング・オブジェクト自体のみ残されます。
リクエストごとに、イテレータ・バインディングは、基礎となるRowSetIteratorオブジェクトにリバインドするためにリフレッシュされます。イテレータ・バインディングのリフレッシュの詳細は、10.5.5項「InvokeActionおよびイテレータ・バインディングにRefreshを適切に使用する方法」を参照してください。第28章「アプリケーション・モジュールの状態管理」で説明されているADF Business Components状態管理機能を使用して、行セット・イテレータ状態およびトランザクションでの任意の保留中の変更が必ずリクエスト間で管理されるようにします。
前の項では、実行時にバインディング・コンテナで作成されるバインディング・オブジェクトを定義する際に、ページ定義がどのように使用されるかについて説明しました。データ・モデルからのデータを表示するため、WebページのUIコンポーネントは、JSF式言語(EL)式を使用してバインディング・オブジェクトにバインドされます。EL式は、バインディング・コンテナ内の特定のバインディング・オブジェクトを参照します。実行時にJSFランタイムによってEL式が評価され、ページを表示する際にバインディング・オブジェクトから値が取得されてコンポーネントにデータが移入されます。ユーザーがUIコンポーネントでデータを更新する場合、JSFランタイムは同じEL式に基づいて、対応するバインディング・オブジェクトに値を戻します。
データ・コントロール・パレットを使用してコンポーネントを作成すると、ADFデータ・バインディング式が自動的に作成されます。式は、データを表示またはバインディング・オブジェクトのプロパティを参照する、すべてのコンポーネント属性に追加されます。事前作成済のそれぞれの式は、ページ定義ファイルで定義された、適切なバインディング・オブジェクトを参照します。これらのバインディング式は編集可能ですが、ADFバインディング式の基本構文に従っていれば、独自に作成することもできます。ADFデータ・バインディング式は、バインディング・オブジェクトからのデータを移入する任意のコンポーネント属性に追加できます。
JSFページの一般的なADFデータ・バインディングEL式は、次の構文を使用して、バインディング・コンテナ内のタイプの異なるバインディング・オブジェクトを参照します。
#{bindings.BindingObject.propertyName}
説明:
bindingsは、式によって参照されているバインディング・オブジェクトが現在のページのバインディング・コンテナにあることを識別する変数です。すべてのADFデータ・バインディングEL式は、bindings変数で始まる必要があります。
BindingObjectは、ページ定義ファイルで定義される、バインディング・オブジェクトの名前です。バインディング・オブジェクト名は、ページ定義のバインディング・オブジェクト定義のid属性に表示され、ページ定義に対して一意です。EL式は、パラメータ・バインディング、実行可能バインディングまたは値バインディングなど、ページ定義ファイル内のどのバインディング・オブジェクトでも参照できます。データ・コントロール・パレットを使用してコンポーネントを作成すると、データ・コントロール内の項目の名前に基づいて、自動的にバインディング・オブジェクトに名前が割り当てられます。
propertyNameは、各データ・バインドUIコンポーネントのデフォルトの表示方法を決定し、実行時のバインディング・オブジェクトのプロパティを設定する変数です。各タイプのバインディング・オブジェクトに対して、異なるバインディング・プロパティがあります。バインディング・プロパティの詳細は、12.6.4項「ADFバインディング・プロパティについて」を参照してください。
たとえば、次の式を例にしてみます。
#{bindings.SvrId.inputValue}
bindings変数は、現在のページのバインディング・コンテナに含まれるバインド値を参照します。参照されるバインディング・オブジェクトはSvrIdであり、これは属性バインディング・オブジェクトです。バインディング・プロパティはinputValueで、最初のSvrId属性の値を戻します。
|
ヒント: ページ定義ファイルのバインディング式ではドル記号($)またはハッシュ記号(#)の接頭辞を使用できますが、JSFページのEL式で使用できるのは、ハッシュ記号(#)の接頭辞のみです。 |
様々なタイプのADFデータ・バインディング式の例は、12.6.3項「ADFデータ・バインディング式の作成時に行われる処理」を参照してください。
ADFデータ・バインディングEL式を作成または編集する方法
JDeveloperでは、次のいずれかの方法で、式の作成または編集を行えます。
構造ウィンドウでUIコンポーネントをダブルクリックし、表示されたエディタで値フィールドを編集します。(「バインド」ボタンをクリックして「式ビルダー」に移動すると、使用可能なバインディング・オブジェクトおよびプロパティから選択できます。詳細は、12.6.2項「式ビルダーの使用方法」を参照してください。)
ビジュアル・エディタのソース・ビューを使用してWebページを表示し、ソース内で直接式を編集します。JDeveloperにより、ソース・エディタ内に、EL式のコード・インサイトが提供されます。コード・インサイトは、プロパティ・インスペクタおよびタグ・エディタでも使用できます。コード・インサイトを起動するには、EL式の先行文字(#{など)を入力します。コード・インサイトにより、式のセグメントごとに有効な項目のリストが表示されるため、そこから適切な項目を選択できます。
ビジュアル・エディタまたは構造ウィンドウでUIコンポーネントを選択し、プロパティ・インスペクタを開きます(「表示」→「プロパティ・インスペクタ」)。プロパティ・インスペクタで直接式を編集するか、式の横にある省略記号をクリックして、式ビルダーを開きます。
JDeveloper式ビルダーは、マネージドBeanやバインディング・プロパティのリストに加え、ページ定義ファイルに定義されたバインディング・オブジェクトのリストを提供することにより、EL式の構築を支援するダイアログです。また、式に使用する場合に選択できるように、ADFバインディング・オブジェクトの階層リストやADFバインディング・オブジェクトの最も一般的に使用されるプロパティが提供されるため、ADFデータ・バインド式の作成や編集に特に便利です。バインディング・プロパティの詳細は、12.6.4項「ADFバインディング・プロパティについて」を参照してください。
構造ウィンドウまたはプロパティ・インスペクタから、式ビルダーを開くことができます。
構造ウィンドウから式ビルダーを開く手順:
構造ウィンドウでADFデータ・バインドUIコンポーネントの1つをダブルクリックします。
次に表示されるダイアログで、コンポーネント・プロパティの横にある「バインド」ボタンをクリックし、式ビルダーを表示します。
プロパティ・インスペクタから式ビルダーを開く手順:
構造ウィンドウまたはビジュアル・エディタでUIコンポーネントを選択し、プロパティ・インスペクタを開きます。
プロパティ・インスペクタで、次のアクションのいずれかを行って式ビルダーを表示します。
既存のバインディング式の横にある省略記号をクリックします。
または
図12-5のように、バインディングに追加するプロパティを選択して、「データにバインド」ボタンをクリックします。
(選択されたプロパティへのバインディング式の追加が有効な場合のみ、「データにバインド」ボタンがアクティブになります。)
式ビルダーの使用手順:
「式ビルダー」でADF Bindings→bindingsノードを開き、図12-6のように、現在のページのADFバインディング・オブジェクトを表示します。
式ビルダーの次の機能を使用して、ADFバインディング式を編集または作成します。
変数ツリーを使用して、バインディング式に含める項目を選択します。ツリーには、バインディング・オブジェクトの階層表現が含まれます。ツリーの各アイコンは、式で使用できる様々なタイプのバインディング・オブジェクトを表します(各アイコンの説明は、表12-2を参照してください)。ツリー内の項目を選択し、シャトル・ボタンをクリックして「式」ボックスに移動します。
式を新規作成する場合は、「式」ボックスに式を入力します。JDeveloperでは、式ビルダー内でコード・インサイトが提供されます。コード・インサイトを起動するには、EL式の先行文字(#{など)またはピリオドのセパレータを入力します。コード・インサイトにより、式のセグメントごとに有効な項目のリストが表示されるため、そこから適切な項目を選択できます。
式の下にある演算子ボタンを使用して、論理演算子または数値演算子を式に追加します。
表12-2 式ビルダーの「ADFバインディング」ノードの下にあるアイコン
| アイコン | 説明 |
|---|---|
|
|
|
|
|
このノードは、他のページに対して定義されたバインディング・オブジェクトを表示する場合のみに使用します。現在のページの式を作成する場合は、このノードを使用しないでください。別のページで定義されたオブジェクトを現在のページに含む場合、データ・コントロール・パレットを使用して、現在のページでそのオブジェクトへのバインディングを追加します。 |
|
|
バインディング・コンテナを表します。それぞれのバインディング・コンテナ・ノードには、ノードを定義するページ定義ファイルの名前が付きます。これらのノードが表示されるのは、dataノードの下のみです。バインディング・コンテナ・ノードを開くと、そのページに対して定義されたバインディング・オブジェクトが公開されます。 このノードは、他のページに対して定義されたバインディング・オブジェクトを表示する場合のみに使用します。現在のページの式を作成する場合は、このノードを使用しないでください。別のページで定義されたオブジェクトを現在のページに含む場合、データ・コントロール・パレットを使用して、現在のページでそのオブジェクトへのバインディングを追加します。 |
|
|
アクション・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なアクション・バインディング・プロパティのリストが公開されます。 |
|
|
イテレータ・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なイテレータ・バインディング・プロパティのリストが公開されます。 |
|
|
属性バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効な属性バインディング・プロパティのリストが公開されます。 |
|
|
リスト・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なリスト・バインディング・プロパティのリストが公開されます。 |
|
|
表バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効な表バインディング・プロパティのリストが公開されます。 |
|
|
ツリー・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なツリー・バインディング・プロパティのリストが公開されます。 |
|
|
ADFバインディング・オブジェクト・プロパティを表します。ADFプロパティの詳細は、12.6.4項「ADFバインディング・プロパティについて」を参照してください。 |
|
|
パラメータ・バインディング・オブジェクトを表します。 |
前述のように、データ・コントロール・パレットを使用してコンポーネントを作成すると、ADFデータ・バインディング式が自動的に追加されます。それぞれの式は、参照するバインディング・オブジェクトのタイプによって、若干異なります。
例12-10は、データ・コレクションをADF読取り専用フォームとしてページ上にドロップしたときに作成されたテキスト・フィールドを示しています。この例のテキスト・フィールドを含め、フォーム内の各UIコンポーネントには、データ・コレクションに含まれる特定の属性の属性バインディング・オブジェクトを参照するEL式が含まれます。
例12-10 属性バインディング・オブジェクトを参照するEL式
<af:inputText value="#{bindings.SvrId.inputValue}"
label="#{bindings.SvrId.label}"/>
この例では、UIコンポーネントは、データ・コレクション内の特定の属性であるSvrIdバインディング・オブジェクトにバインドされています。inputValueバインディング・プロパティによって、バインディングが関連付けられている最初の属性の値が戻されます。この例の場合はSvrIdです。label属性内で、EL式は、データ属性に現在割り当てられているラベルを戻すlabelバインディング・プロパティを参照します。
EL式によって参照される属性バインディング・オブジェクトSvrIdは、例12-11のように、ページ定義ファイルで定義されます。EL式によって参照されるバインディング・オブジェクトの名前は、バインディング・オブジェクト定義のid属性内で定義されます。
データ・コントロール・パレットからデータ・コレクションをドラッグして、ADF読取り専用表としてJSFページにドロップした場合、作成された表のタグには、通常、例12-12のように、表を表の値バインディング・オブジェクトにバインドする一連のEL式が含まれます。
例12-12 表バインディング・オブジェクトを参照するEL式
<af:table value="#{bindings.ServiceRequests.collectionModel}" var="row"
rows="#{bindings.ServiceRequests.rangeSize}"
first="#{bindings.ServiceRequests.rangeStart}"
emptyText="#{bindings.ServiceRequests.viewable ?
\'No rows yet.\' : \'Access Denied.\'}"
tableタグの各属性には、表バインディング・オブジェクトを参照するバインディング式およびそのタグ属性に適したバインディング・プロパティが含まれます。rows属性内のバインディング式は、イテレータの各ページで行数を定義する、イテレータ・バインディングrangeSizeプロパティを参照するため、表でレンダリングされる行数は、イテレータ・バインディングによって定義されるページごとの行数と一致します。
表は、ServiceRequests表バインディング・オブジェクトにバインドされます。これは、ページ定義ファイルで例12-13のように定義されます。
例12-13 ページ定義ファイルで定義された表バインディング・オブジェクト
<table id="ServiceRequests" IterBinding="ServiceRequestsIterator">
<AttrNames>
<Item Value="City"/>
<Item Value="CountryId"/>
<Item Value="Email"/>
<Item Value="FirstName"/>
<Item Value="LastName"/>
<Item Value="PostalCode"/>
<Item Value="StateProvince"/>
<Item Value="StreetAddress"/>
<Item Value="UserId"/>
<Item Value="UserRole"/>
</AttrNames>
</table>
表バインディング・オブジェクトのIterBinding属性によって、表のデータを表示するイテレータ・バインディングが参照されます。
例12-14は、データ・コントロール・パレットから組込み操作をドラッグし、ページ上にドロップして作成されたコマンド・ボタンを示しています。このボタンには、組込み操作FirstにバインドするEL式が含まれます。この操作は、操作が属するデータ・コレクション内の最初のデータ・オブジェクトを表示します。
例12-14 操作のアクション・バインディング・オブジェクトを参照するEL式
<af:commandButton actionListener="#{bindings.First.execute}"
text="First"
disabled="#{!bindings.First.enabled}"/>
ボタンのアクション・リスナーは、バインディング・コンテナのFirstという名前のアクション・バインディング上でexecute()メソッドにバインドされます。ユーザーがボタンをクリックすると、アクション・リスナーのメカニズムによりバインディング式が解決され、操作を実行するexecute()メソッドが起動されます。デフォルトでは、ボタンのラベルには、コールされる操作の名前が含まれます。ラベルは、必要に応じて変更できます。disabled属性は、ページ上でそのボタンを無効にするかどうかを決定します。式の最初に否定演算子(!)があるため、disabled属性はアクション・バインディングのenabledプロパティの値の否定であると評価されます。
つまり、enabledプロパティがfalseに評価される場合、disabled属性はtrueに評価されます。たとえば、First操作にバインドされるアクション・バインディングでは、現在のデータ・オブジェクトが最初のオブジェクトの場合、enabledプロパティはfalseに評価されます。このためdisabled属性がtrueに評価され、このためボタンが無効になります。ただし、現在のデータ・オブジェクトが最初のオブジェクトではない場合、enabledプロパティはtrueに評価されます。このためdisabled属性がfalseに評価され、ボタンが有効になります。
例12-15は、コマンド・ボタン用にページ定義で定義されたアクション・バインディング・オブジェクトを示しています。
例12-15 操作用にページ定義ファイルで定義されたアクション・バインディング・オブジェクト
<bindings>
<action id="First" IterBinding="ServiceRequestsIterator"
InstanceName="SRService.ServiceRequests" DataControl="SRService"
RequiresUpdateModel="true" Action="12"/>
</bindings>
action要素Firstは、コマンド・ボタンでEL式が直接参照するアクション・バインディング・オブジェクトを定義します。actionバインディングのIterBinding属性によって、アクションによって操作されているデータ・コレクションのイテレータ・バインディングが参照されます。
|
ヒント: action要素のAction属性の数値によって、oracle.adf.model.metaパッケージ内のOperationDefinitionインタフェースの数値定数が参照されます。 |
例12-16は、データ・コントロール・パレットからメソッドをドラッグし、JSFページ上にドロップして作成された、コマンド・ボタンを示しています。この例では、コマンド・ボタンがdeleteServiceHistoryNotesメソッドにバインドされています。ユーザーがボタンをクリックすると、actionListener属性内のEL式のexecuteバインディング・プロパティによって、メソッドが起動されます。
例12-16 メソッドのアクション・バインディング・オブジェクトを参照するEL式
<af:commandButton actionListener="#{bindings.deleteServiceHistoryNotes.execute}"
text="deleteServiceHistoryNotes"
disabled="#{!bindings.deleteServiceHistoryNotes.enabled}"/
例12-17は、コマンド・ボタン用にページ定義ファイルで作成されたバインディング・オブジェクトを示しています。コマンド・コンポーネントがメソッドにバインドされている場合、ページ定義ファイルで作成されるバインディング・オブジェクトは1つ(methodAction)のみです。methodActionバインディングは、NamedData要素で定義されるパラメータなど、メソッドの起動に必要な情報を定義します。
例12-17 ページ定義ファイルで定義されたメソッド・アクション・バインディング
<bindings>
<methodAction id="deleteServiceHistoryNotes"
InstanceName="SRService.dataProvider" DataControl="SRService"
MethodName="deleteServiceHistoryNotes"
RequiresUpdateModel="true" Action="999">
<NamedData NDName="keySet" NDType="java.util.Set"/>
</methodAction>
</bindings>
データ・コントロール・パレットを使用してデータ・バインドされたコンポーネントを作成すると、EL式によって、特定のADFバインディング・プロパティが参照されます。実行時には、これらのバインディング・プロパティによって、データ・バインドUIコンポーネントのデフォルトの表示方法や、イテレータ・バインディング固有のパラメータなどが定義されます。ADFバインディング・プロパティは、Oracle APIによって定義されます。各バインディング・タイプで使用できるプロパティの完全なリストは、付録B「ADFバインディング・プロパティのリファレンス」を参照してください。
特定のプロパティに割り当てられる値は、ページ定義ファイルで定義されます。たとえば、イテレータ・バインディングには、イテレータが一度に表示する行数を指定する、RangeSizeというプロパティがあります。例12-18のように、RangeSizeに割り当てられる値は、ページ定義ファイルで指定されます。
例12-18 RangeSizeプロパティを使用したイテレータ・バインディング・オブジェクト
<iterator id="ServiceRequestsIterator" RangeSize="10"
Binds="ServiceRequests" DataControl="SRService"/>
JDeveloperの式ビルダーを使用すると、各バインディング・オブジェクトの有効なバインディング・プロパティのリストを表示できます。式ビルダーの使用方法の詳細は、12.6.2項「式ビルダーの使用方法」を参照してください。