この章では、データ・コントロール・パレットを使用して、ページにデータを表示するデータ・バインドされたUIコンポーネントを作成する方法について説明します。また、データ・コントロール・パレットを使用して作成されたすべてのオブジェクトを操作する方法についても説明します。
この章の内容は次のとおりです。
この部の残りの章では、データ・バインドされたコンポーネントを使用して特定のタイプのページを作成する方法について説明します。
ADFデータ・コントロール(詳細は3.10項「ADFデータ・コントロールによるサービスの公開」を参照)では、アプリケーションのビジネス・サービスが抽象化され、サービス・データへのADFバインディング・レイヤーのアクセスが提供されます。データ・コントロールは、ビジネス・サービスによって戻されたデータ・モデルを定義します。UIコンポーネントをデータ・コントロールにバインドして、実行時にページにデータ・モデルからのデータを移入できます。
JDeveloperのデータ・コントロール・パレットによって、アプリケーションのデータ・コントロールがIDEで公開されるため、ドラッグ・アンド・ドロップ操作を使用してJSFページに様々なUIコンポーネントを作成できます。データ・コントロール・パレットで作成されたUIコンポーネントでは、宣言的なデータ・バインディングが使用されます。この場合、データ・バインディング式が自動的に構成されるため、通常は追加コードを記述する必要がありません。
JavaServer Facesの標準マネージドBeanのかわりにADFデータ・コントロールにバインドすることの利点は、次のとおりです。
データ・コントロール・パレットからドラッグ・アンド・ドロップ操作で行うことができ、追加のコードが不要、もしくはほとんど必要ない、宣言的データ・バインディング。
複数のUIテクノロジについてUIデータ・バインディングを行うための一貫した(標準準拠の)アプローチ。
この章では次の内容について説明します。
データ・コントロール・パレットを使用した、データ・バインドされたUIコンポーネントの作成方法
データ・コントロール・パレットに表示される項目
データ・コントロール・パレット使用時にJDeveloperによって自動作成されるオブジェクト
ADFデータ・バインディングEL式の構成方法
ページ定義ファイルの内容およびEL式との関係
データ・コントロール・パレットから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データ・バインドされたユーザー・インタフェースを設計できます。データ・コントロール・パレットを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要な、様々なコードおよびオブジェクトがJDeveloperによって自動的に作成されます。
データ・コントロール・パレットを表示するには、ビジュアル・エディタの「設計」ページで「JSF」ページを開き、「表示」→「データ・コントロール・パレット」を選択します。デフォルトでは、コンポーネント・パレットと同じウィンドウに、データ・コントロール・パレットが表示されます。
図5-1は、SRDemoアプリケーションのデータ・コントロール・パレットを示しています。このデータ・コントロール・パレットでは、TopLinkがビジネス・サービスとして使用され、EJBセッション・ファサードから作成されたデータ・コントロールが使用されています。
|
注意: アプリケーションのビジネス・サービスに対してデータ・コントロールが作成されていない場合、データ・コントロール・パレットは空になります。データ・コントロールの作成に関する詳細は、第3章「アプリケーション・サービスの作成と使用」を参照してください。 |
データ・コントロール・パレットでは、アプリケーションのビジネス・サービスに対して作成されたすべてのデータ・コントロールが表示されます。また、UIコンポーネントへのバインドに使用できるデータ・オブジェクト、データ・コレクション、メソッドおよび組込み操作がすべて公開されます。データ・コレクションは、データ・モデルに含まれる、一連のデータ・オブジェクト(別名は行セット)を表します。データ・コレクションの各オブジェクトは、データ・モデルに含まれる、構造化された特定のデータ項目(別名は行)を表します。
データ・コントロール・パレット内の各ルート・ノードは、特定のデータ・コントロールを表します。各データ・コントロールの下には、オブジェクト、コレクション、メソッドおよび操作の階層リストがあります。この階層がデータ・コントロール・パレットでどのように表示されるかは、データ・コントロールで表されるビジネス・サービスのタイプ、およびビジネス・サービスの定義方法によって異なります。
データ・コントロール・パレットでは、各データ・コントロールが特定のアイコンで表されます。表5-1は、各アイコンが表すデータ・コントロール、データ・コントロール・パレットの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。
表5-1 データ・コントロール・パレットのアイコンおよびオブジェクト階層
| アイコン | 名前 | 説明 | 作成できるコンポーネント |
|---|---|---|---|
|
|
データ・コントロール |
データ・コントロールを表します。データ・コントロール自体を使用してUIコンポーネントを作成することはできませんが、その下に表示される子オブジェクトは、いずれも使用できます。ビジネス・サービスの定義方法により、複数のデータ・コントロールが存在することがあります。その場合、各データ・コントロールは、データ関数の1つの論理グループを表します。 |
なし。他のオブジェクトのコンテナとして機能します。 |
|
|
データ・コレクション内のオブジェクトの新しいインスタンスを作成する、組込みメソッドを表します。メソッドの作成アイコンは、アイコンが属するデータ・コレクションの名前が付いたフォルダの中にあります。このデータ・コレクションのフォルダは、そのデータ・コントロールの下にある「コンストラクタ」フォルダの中にあります。メソッドの作成の下に子として表示される「属性」フォルダには、オブジェクトの作成先であるデータ・コレクションのすべての属性が含まれます。コレクション内のオブジェクトに、別のコレクションからの属性(リレーショナル・データベースでは外部キーと呼ばれる)が含まれる場合は、その属性がアクセッサ戻りアイコンによって表されます。この場合は、アクセッサによって単一値が戻されます(子は含まれません)。コンストラクタの使用に関する詳細は、10.7項「新規レコード用入力フォームの作成」を参照してください。 |
作成フォーム。 |
|
|
|
メソッド |
データ・コントロール上のカスタム・メソッドを表します。カスタム・メソッドによって、パラメータの受入れや、アクションまたはビジネス・ロジックの実行を行ったり、単一値またはデータ・コレクションを戻すことができます。 そのメソッドが |
コマンド・コンポーネント。 パラメータを取得するメソッドの場合: コマンド・コンポーネントおよびパラメータ化フォーム。 |
|
|
カスタム・メソッドによって戻されるオブジェクトを表します。戻されるオブジェクトは、単一値またはコレクションです。メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッド戻りの下に子として表示されるオブジェクトは、コレクションの属性、親コレクションに関連するコレクションを表すアクセッサ戻り、親コレクションに関連するアクションを実行するその他のメソッド、親コレクションに実行できる操作などです。 |
コレクションの場合: フォーム、表、ツリーおよびレンジ・ナビゲーションの各コンポーネント。 単一値の場合: テキスト・フィールドおよび選択リスト。 |
|
|
|
ビジネス・サービス上のアクセッサ・メソッドによって戻されたオブジェクトを表します。アクセッサ・メソッドは、戻されたオブジェクトがJavaBeansの場合に使用されます。 アクセッサ戻りは、メソッド戻りまたはその他のアクセッサ戻りの下、もしくは組み込まれているメソッドの作成の下にある「属性」フォルダ内に、子として表示されます。アクセッサ戻りは、親コレクション内の現在のオブジェクトに関連するオブジェクトです。通常、この関係は、両方のオブジェクトに共通する一意の属性に基づきます。たとえば、メソッドによってユーザーのコレクションが戻される場合、そのコレクションの子であるアクセッサ戻りは、特定のユーザーに割り当てられたサービス・リクエストのコレクションである可能性があります。ADFでは、親コレクションと子コレクションの関係を、マスター/ディテール関係と呼びます。アクセッサ戻りとマスター/ディテール・オブジェクトの詳細は、第8章「マスター/ディテール・データの表示」を参照してください。 アクセッサ戻りの下にある子は、オブジェクトの属性、その他のアクセッサ戻り、アクセッサ戻りから値を戻すカスタム・メソッド、およびアクセッサ戻りに対して実行可能な操作などです。 |
コレクションの場合: フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント、およびマスター/ディテール・ウィジェット。 シングル・オブジェクトの場合: フォーム、マスター/ディテール・ウィジェットおよび選択リスト。 コンストラクタの下にあるシングル・オブジェクトの場合: 選択リストのみ。 |
|
|
|
オブジェクト内の個別のデータ要素を表します。属性は、所属先のメソッド戻りまたはアクセッサ戻りの下に、子として表示されます。 |
ラベル、テキスト・フィールドおよび選択リストの各コンポーネント。 |
|
|
|
親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。データ・コントロール操作は、メソッド戻りまたはアクセッサ戻りの下、およびルート・データ・コントロール・ノードの下の「操作」フォルダの中にあります。特定のメソッド戻りまたはアクセッサ戻りの子である操作は、戻りオブジェクトのみに作用します。これに対して、データ・コントロール・ノードの下にある操作は、データ・コントロールによって表されるすべてのオブジェクトに作用します。 操作に1つ以上のパラメータが必要な場合は、操作の下の「パラメータ」フォルダにリストされます。 |
ボタンやリンクなどのUIのアクション。 |
|
|
|
メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「パラメータ」フォルダ内に表示されます。 |
ラベル、テキストおよび選択リストの各コンポーネント。 |
データ・バインドされたUIコンポーネントを作成するには、データ・コントロール・パレットから項目をドラッグし、「JSF」ページにドロップします。
データ・コントロール・パレットから項目をドラッグしてページにドロップすると、ドロップした項目に使用できるすべてのデフォルトUIコンポーネントのポップアップ・メニューが表示されます。ポップアップ・メニューから、作成するコンポーネントを選択します。
|
注意: データ・コントロール・パレットから、組み込まれているメソッドの作成をドラッグ・アンド・ドロップした場合は、ポップアップ・メニューは表示されません。これは、メソッドの作成を使用して作成できるコンポーネントが、作成フォームの1種類のみであるためです。 |
図5-2は、データ・コントロール・パレットのメソッド戻りがページにドロップされると表示されるポップアップ・メニューを示しています。
ポップアップ・メニューから選択したコンポーネントに応じて、そのコンポーネントの外観を定義するためのダイアログが表示されます。たとえば、ポップアップ・メニューから「ADF読取り専用表」を選択すると、「表の列の編集」ダイアログが表示されます。このダイアログを使用して、表の列に表示する属性、列ラベル、各列に使用するテキスト・フィールドのタイプ、および組み込む機能(選択ファセットや列のソートなど)を定義できます。(表の作成の詳細は、第7章「表の追加」を参照してください。)
作成されたUIコンポーネントは、JDeveloperのビジュアル・エディタに表示されます。たとえば、データ・コントロール・パレットからメソッド戻りをドラッグして、ポップアップ・メニューから「ADF読取り専用表」を選択した場合は、図5-3のように、ビジュアル・エディタに読取り専用の表が表示されます。
例で示した表の列ラベルには、バインディング式が含まれています。この式によって、各列ラベルがデータ・コレクション内の1つの属性にバインドされます。デフォルトの表には、イテレータ・バインディングを通じてデータ・コレクションのイテレータとバインドされた、選択ファセットが含まれます。選択ファセットは、表コンポーネントをドロップすると表示される「表の列の編集」ダイアログで「選択を有効にする」オプションを選択することで含められます。(バインディング式の詳細は、5.6項「ADFデータ・バインディングEL式の作成」を参照してください。)
デフォルトでは、データ・コントロール・パレットでADF Facesコンポーネントを使用したときに作成されるUIコンポーネントは、ADFデータ・コントロール内のコレクションおよびコレクション属性にバインドされ、1つ以上の組込み機能が装備されます。これらの機能は次のとおりです。
データ・バインド・ラベル
ツールチップ
書式設定
基本的なナビゲーション・ボタン
検証(検証規則が特定の属性にアタッチされている場合は、第12章「検証と変換の使用」を参照してください。)
デフォルトのコンポーネントは、そのまま使用しても十分機能します。ただし、特定のニーズに合せて変更することができます。コンポーネントおよびその多様な機能の詳細は、この部の後の章で説明します。
|
ヒント: ページで使用するADFデータ・バインド・コンポーネントのタイプを変更する場合は、そのコンポーネントを削除して、データ・コントロール・パレットから新しいコンポーネントをドラッグ・アンド・ドロップする方法が最も簡単です。データ・バインド・コンポーネントをページから削除する場合、それに関連するバインディング・オブジェクトがページ定義ファイル内で他のコンポーネントから参照されていなければ、それらのバインディング・オブジェクトもJDeveloperによって自動的に削除されます。 |
ADF WebアプリケーションはJSFフレームワークを使用して作成されますが、ADFデータ・バインドUIコンポーネントを含むページのレンダリングおよび処理を行うために、いくつかの追加アプリケーション・オブジェクト定義が必要になります。データ・コントロール・パレットを使用しない場合は、これらの様々なファイルを手動で構成する必要があります。一方、データ・コントロール・パレットを使用した場合は、必要なすべての手順がJDeveloperによって行われます。自動的に処理される手順は次のとおりです。
DataBindings.cpxファイルが「アプリケーション・ソース」ディレクトリ内のビュー・パッケージに作成されます(このファイルが存在しない場合のみ)。また、そのページ用にエントリが追加されます。
DataBindings.cpxファイルでは、アプリケーションのバインディング・コンテキストが定義されます。このファイルでは、対応するページ定義ファイルに個々のページがマップされ、各ページで使用されるデータ・コントロールが登録されます。データ・コントロールは、DataControls.dcxファイルに定義されます。詳細は、5.3項「DataBindings.cpxファイルでの作業」を参照してください。
web.xmlファイルにADFバインディング・フィルタが登録されます。
ADFバインディング・フィルタにより、バインディング・コンテキストへのアクセスが必要なHTTPリクエストが、すべて処理されます。バインディング・フィルタの構成に関する詳細は、5.4項「ADFバインディング・フィルタの構成」を参照してください。
例5-1のように、faces-config.xmlファイルにADFフェーズ・リスナーが登録されます。
例5-1 faces-config.xmlファイルへのADFフェーズ・リスナーの入力
<lifecycle> <phase-listener>oracle.adf.controller.faces.lifecycle.ADFPhaseListener </phase-listener> </lifecycle>
ADFフェーズ・リスナーは、ADFページ・ライフサイクルを実行するために使用されます。このフェーズ・リスナーは、モデルの準備、モデル更新の検証、およびレンダリングするページの準備に関係する独自のフェーズをその前後に実行する必要がある、すべてのJSFフェーズをリスニングします。ADFライフサイクルの詳細は、6.2.3項「実行時に行われる処理: JSFおよびADFのライフサイクル」を参照してください。
プロジェクト・プロパティのADFm設定で名前が定義されているページ定義サブパッケージに、ページ定義ファイルが追加されます(ページ用にこのファイルが存在しない場合のみ)。デフォルトのサブパッケージは、「アプリケーション・ソース」ディレクトリにあるview.pageDefsです。
ページ定義ファイル(<pageName>PageDef.xml)は、アプリケーションのビュー・レイヤーにある各ページのADFバインディング・コンテナを定義します。バインディング・コンテナは、すべてのADFバインディング・オブジェクトへの実行時アクセスを提供します。ページ定義ファイルを使用して、特定のUIコンポーネントに対するバインディング・オブジェクト定義を設定および編集する方法は、後の章で説明します。ページ定義ファイルの詳細は、5.5項「ページ定義ファイルでの作業」を参照してください。
ページ定義ファイルが構成されます。この処理では、ページによって参照されるバインディング・オブジェクトの定義も追加されます。
事前作成済のコンポーネントがJSFページに追加されます。
追加された事前作成済コンポーネントには、ページ定義ファイル内のバインディング・オブジェクトを参照するADFデータ・バインディング式言語(EL)の式が含まれます。詳細は、5.6項「ADFデータ・バインディングEL式の作成」を参照してください。
ADF Facesコンポーネントに必要とされるすべてのライブラリ、ファイルおよび構成要素が追加されます(ADF Facesコンポーネントが使用される場合)。詳細は、4.4.2項「ADF Facesコンポーネントの初回挿入時に発生する処理」を参照してください。
ページにADFバインディングが含まれている場合、実行時には、クライアントまたはコントローラから起動されたビジネス・サービスとのやり取りが、Oracle ADFバインディング・コンテキストと呼ばれるシングル・オブジェクトを介して、アプリケーションによって管理されます。ADFバインディング・コンテキストはコンテナ・オブジェクトの1つで、Oracle ADFモデル・レイヤーから導出されたデータ・コントロールおよびデータ・バインディング・オブジェクトのリストを含みます。
図5-4のように、ADFライフサイクルによって、DataControls.dcx、DataBindings.cpxおよびページ定義ファイルからOracle ADFバインディング・コンテキストが作成されます。DataControls.dcxファイルは、アプリケーションで使用できるすべてのデータ・コントロールを定義します。DataBindings.cpxは、アプリケーションのページで現在使用されているデータ・コントロールを参照し、ページ定義ファイルで定義済のバインディング・オブジェクトを含むバインディング・コンテナをWebページのURLにマップします。ページ定義ファイルは、アプリケーション・ページで使用されるバインディング・オブジェクトを定義します。ページごとに1つのページ定義があります。ADFライフサイクルの詳細は、6.2.3項「実行時に行われる処理: JSFおよびADFのライフサイクル」を参照してください。
DataBindings.cpxファイルは、個々のページをページ定義ファイルにマップし、アプリケーションで使用されるDataControls.dcxファイルに定義されたデータ・コントロールを宣言します。(DataControls.dcxファイルの詳細は、3.10.2項「データ・コントロール・ファイルの理解」を参照してください。)DataBindings.cpxファイルは、アプリケーション全体のOracle ADFバインディング・コンテキストを定義し、メタデータを提供します。このメタデータから、実行時にOracle ADFバインディング・オブジェクトが作成されます。
アプリケーションのページにコンポーネントを追加するために初めてデータ・コントロール・パレットを使用する際には、JDeveloperによって、ビュー・プロジェクトの「アプリケーション・ソース」ディレクトリのビュー・パッケージ内に、DataBindings.cpxファイルが自動的に作成されます。DataBindings.cpxファイルが作成されると、最初のページ用のエントリが自動的に追加されます。その後、データ・コントロール・パレットを使用してページにコンポーネントを追加するたびに、そのページ用のエントリが存在しない場合は、エントリがDataBindings.cpxに自動的に追加されます。
例5-2は、SRDemoアプリケーションのDataBindings.cpxファイルを示しています。pageMap要素は、各JSFページを対応するページ定義ファイルにマップします。pageDefintionUsages要素は、アプリケーション内の各ページ定義ファイルを識別します。dataControlUsages要素は、ページ定義ファイル内で定義済のバインディング・オブジェクトによって使用されるデータ・コントロールを識別します。DataBindings.cpxファイルの要素および属性の詳細は、付録A「ADF XMLファイルのリファレンス」を参照してください。
例5-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="SRListPageDef"/>
<page path="/app/SRCreate.jspx" usageId="SRCreatePageDef"/>
<page path="/app/SRCreateConfirm.jspx" usageId="SRCreateConfirmPageDef"/>
...
</pageMap>
<pageDefinitionUsages>
<page id="SRListPageDef"
path="oracle.srdemo.view.pageDefs.app_SRListPageDef"/>
<page id="UserInfoPageDef"
path="oracle.srdemo.view.pageDefs.headless_UserInfoPageDef"/>
<page id="SRCreatePageDef"
path="oracle.srdemo.view.pageDefs.app_SRCreatePageDef"/>
<page id="SRCreateConfirmPageDef"
path="oracle.srdemo.view.pageDefs.app_SRCreateConfirmPageDef"/>
...
</pageDefinitionUsages>
<dataControlUsages>
<dc id="EmailService" path="oracle.srdemo.emailService.EmailService"/>
<dc id="SRDemoFAQ" path="oracle.srdemo.faq.SRDemoFAQ"/>
<dc id="SRAdminFacade" path="oracle.srdemo.model.SRAdminFacade"/>
<dc id="SRPublicFacade"
path="oracle.srdemo.model.SRPublicFacade"/>
</dataControlUsages>
</Application>
ADFバインディング・フィルタはサーブレット・フィルタの1つで、oracle.adf.model.servlet.ADFBindingFilterクラスのインスタンスです。ADF Webアプリケーションは、ADFバインディング・フィルタを使用して、バインディング・コンテキストへのアクセスが必要なすべてのHTTPリクエストを前処理します。
データ・コントロール・パレットを使用して、初めてデータ・バインド・コンポーネントをページに追加する際には、JDeveloperによって、アプリケーションのweb.xmlファイル内にフィルタが自動的に構成されます。
バインディング・フィルタを構成するために、JDeveloperによって、次の要素がweb.xmlファイルに追加されます。
サーブレット・コンテキスト・パラメータ: アプリケーション・バインディング・コンテキストを定義するため、バインディング・フィルタに実行時に読み取られるDataBindings.cpxファイルを指定します。
サーブレット・コンテキスト・パラメータは、例5-3のように、web.xmlファイルで定義されます。param-name要素には値CpxFileName、param-value要素にはアプリケーションのDataBindings.cpxファイルの(.cpx拡張子なしの)完全修飾名がぞれぞれ含まれている必要があります。
ADFバインディング・フィルタ・クラス: javax.servlet.Filterインタフェースを実装するバインディング・フィルタ・オブジェクトの名前を指定します。
ADFバインディング・フィルタは、例5-4のように、web.xmlファイルで定義されます。filter-name要素には値adfBindings、filter-class要素には、バインディング・フィルタ・クラスの完全修飾名oracle.adf.model.servlet.ADFBindingFilterがそれぞれ含まれている必要があります。
フィルタ・マッピング: フィルタをWebアプリケーション内の静的リソースまたはサーブレットにリンクします。
実行時にマップ済リソースが要求されると、フィルタが起動します。フィルタ・マッピングは、web.xmlファイルで例5-5のように定義されます。filter-name要素は、値adfBindingsを含む必要があります。この例には、jspおよびjspxの両方のページ書式に対するフィルタ・マッピングが含まれています。
例5-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によって、必要なバインディング・オブジェクト定義がページ定義ファイルに自動的に追加されます。
デフォルトでは、ページ定義ファイルは、ビュー・プロジェクトの「アプリケーション・ソース」ディレクトリにあるview.PageDefsパッケージに含まれています。ページ定義ファイルの場所は、プロジェクト・プロパティの「ADFm設定」ページを使用して変更できます。
JDeveloperによるページ定義ファイルの命名には、次の規則が使用されます。
<pageName>PageDef.xml
上の<pageName>は、JSFページの名前を表します。つまり、JSFページの名前がSRList.jspの場合は、デフォルトのページ定義ファイル名はSRListPageDef.xmlになります。ページをサブディレクトリに編成している場合、次の規則に従って、ページ定義ファイル名の前にディレクトリ名が追加されます。
<directoryName>_<pageName>PageDef.xml
たとえば、SRDemoアプリケーションの場合、SRMainページは「Webコンテンツ」フォルダのappサブディレクトリに含まれるため、そのページ定義ファイルの名前はapp_SRMainPageDef.xmlになります。
ページ定義ファイルを開くには、ビジュアル・エディタまたはアプリケーション・ナビゲータでそのページを右クリックし、「ページ定義に移動」を選択します。
例5-6は、SRDemoアプリケーションでSRListページに対して作成されたページ定義ファイルを示しています。この例では、ページ定義ファイルによって、次のラッパー要素の下にあるバインディング・オブジェクト定義がグループ化されています。
parameters(詳細は、5.5.2.1項「parameters要素で定義されたバインディング・オブジェクト」を参照)
executables(詳細は、5.5.2.2項「executables要素で定義されたバインディング・オブジェクト」を参照)
bindings(詳細は、5.5.2.3項「bindings要素で定義されたバインディング・オブジェクト」を参照)
各ラッパー要素には、特定のタイプのバインディング・オブジェクト定義が含まれます。各バインディング・オブジェクト定義のid属性は、バインディング・オブジェクトの名前を指定します。各バインディング・オブジェクトの名前は、ページ定義ファイル内で一意であることが必要です。デフォルトでは、バインディング・オブジェクトの名前は、その作成に使用されたデータ・コントロール・オブジェクトに基づいて設定されます。データ・コントロール・オブジェクトがページで2回以上使用される場合、一意性を維持するために、JDeveloperによりデフォルトのバインディング・オブジェクト名に番号が追加されます。5.6項「ADFデータ・バインディングEL式の作成」では、ADFデータ・バインディングEL式によるバインディング・オブジェクト名の参照方法について説明しています。
例5-6 ページ定義ファイル
<?xml version="1.0" encoding="UTF-8" ?>
<pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
version="10.1.3.35.65" id="SRListPageDef"
Package="oracle.srdemo.view.pageDefs">
<parameters/>
<executables>
<methodIterator id="findServiceRequestsIter"
Binds="findServiceRequests.result"
DataControl="SRPublicFacade" RangeSize="10"
BeanClass="oracle.srdemo.model.entities.ServiceRequest"/>
<invokeAction Binds="findServiceRequests" id="tableRefresh"
Refresh="ifNeeded"
RefreshCondition="${(userState.refresh) and
(!adfFacesContext.postback)}"/>
<variableIterator id="variables">
<variable Type="java.lang.String" Name="setCurrentRowWithKey_rowKey"
IsQueriable="false"/>
</variableIterator>
</executables>
<bindings>
<methodAction id="findServiceRequests"
InstanceName="SRPublicFacade.dataProvider"
DataControl="SRPublicFacade"
MethodName="findServiceRequests" RequiresUpdateModel="true"
Action="999"
ReturnName="SRPublicFacade.methodResults.
SRPublicFacade_dataProvider_findServiceRequests_result">
<NamedData NDName="userIdParam" NDValue="#{userInfo.userId}"
NDType="java.lang.Integer"/>
<NamedData NDName="statusParam" NDValue="#{userState.listMode}"
NDType="java.lang.String"/>
</methodAction>
<table id="findServiceRequests1" IterBinding="findServiceRequestsIter">
<AttrNames>
<Item Value="assignedDate"/>
<Item Value="problemDescription"/>
<Item Value="requestDate"/>
<Item Value="status"/>
<Item Value="svrId"/>
</AttrNames>
</table>
<action id="setCurrentRowWithKey" IterBinding="findServiceRequestsIter"
InstanceName="SRPublicFacade.dataProvider"
DataControl="SRPublicFacade" RequiresUpdateModel="false"
Action="96">
<NamedData NDName="rowKey" NDValue="${row.rowKeyStr}"
NDType="java.lang.String"/>
</action>
</bindings>
</pageDefinition>
ページ定義ファイルを使用して、特定のUIコンポーネントに対するバインディングを定義および編集する方法は、後の章で説明します。ページ定義ファイルで使用できるすべての要素および属性の説明は、A.7項「<pageName>PageDef.xml」を参照してください。
ページ定義ファイルのparameters要素は、ページのパラメータを定義します。パラメータ・バインディング・オブジェクトは、次によって使用される属性値です。
メソッド・アクション・バインディング。バインドされたメソッドの起動時に使用されます。メソッド・アクション・バインディングの詳細は、5.5.2.3項「bindings要素で定義されたバインディング・オブジェクト」を参照してください。
イテレータ・バインディング。データセットのフェッチに使用されます。イテレータ・バインディングの詳細は、5.5.2.2項「executables要素で定義されたバインディング・オブジェクト」を参照してください。
パラメータ・バインディング・オブジェクトは、(ADFライフサイクルのモデルの準備フェーズでの)リクエスト開始時にページによって評価されるパラメータを宣言します。Webアプリケーションでは、ページ・パラメータは、モデルの準備フェーズで1回評価されます。(ADFライフサイクルの詳細は、6.2.3項「実行時に行われる処理: JSFおよびADFのライフサイクル」を参照してください。)静的値、バインディング式または静的値を割り当てるEL式を使用して、ページ定義ファイルでパラメータの値を定義できます。
SRDemoアプリケーションでは、パラメータ・バインディングを使用していません。しかし、ページ定義ファイルでのパラメータ・バインディング・オブジェクトの定義方法を例5-7に示します。
例5-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構文の標準であるハッシュ記号(#)の接頭辞も使用できます。 |
メソッドへパラメータを渡す方法の詳細は、第10章「より複雑なページの作成」を参照してください。
ページ定義ファイルのexecutables要素は、次のタイプの実行可能バインディング・オブジェクトを定義します。
methodIterator: データ・コントロールでカスタム・メソッドによって戻される、コレクション全体で反復処理するイテレータにバインドします。
メソッド・イテレータ・バインディングは、常にbindings要素で定義されたmethodActionバインディングに関連します。methodActionバインディングは、メソッドの起動方法およびメソッドが取得する予定のパラメータ(該当する場合)に関する詳細をカプセル化します。methodActionバインディングの詳細は、5.5.2.3項「bindings要素で定義されたバインディング・オブジェクト」を参照してください。
accessorIterator: データ・コントロールのアクセッサにより戻されるディテール・オブジェクトを反復処理するイテレータにバインドします。アクセッサ戻りまたはアクセッサ戻りの属性をページにドロップすると、accessorIteratorがexecutables要素に追加されます。
アクセッサ・イテレータは、常にマスター・オブジェクトを反復処理するメソッド・イテレータに関連します。アクセッサ・イテレータ・バインディングのMasterBinding属性は、アクセッサ・イテレータの関連するメソッド・イテレータを定義します。マスター/ディテール・オブジェクトとイテレータの詳細は、第8章「マスター/ディテール・データの表示」を参照してください。
variableIterator: バインディング・コンテナ内のすべての変数を他のバインディングに公開するイテレータにバインドします。
ページ変数は、バインディング・コンテナに対してローカルで、バインディング・コンテナ・オブジェクトが存在する間のみ存在します。ページから収集したパラメータが要求されるデータ・コントロール・メソッドまたはデータ・コントロール操作を使用する際には、JDeveloperによって、ページ定義ファイル内のパラメータの変数が自動的に定義されます。属性バインディングは、ページ変数を参照できます。
invokeAction: ページ・ライフサイクルの任意のフェーズ中に、actionバインディングまたはmethodActionバインディングで定義された操作またはメソッドを起動するメソッドにバインドします。
アクションおよびメソッド・アクション・バインディングは、bindings要素で定義されます。methodActionオブジェクトの詳細は、5.5.2.3項「bindings要素で定義されたバインディング・オブジェクト」を参照してください。
イテレータ・バインディング・オブジェクトは、基礎となるADF RowSetIteratorオブジェクトにバインドされます。このオブジェクトは、現在のオブジェクトと現在のレンジ情報を管理します。イテレータ・バインディングにより、現在のオブジェクトとレンジ状態が、ページで使用される他のバインディング・オブジェクトに公開されます。イテレータ・レンジは、ページ上に表示される現在のオブジェクトのセットを表します。現在のレンジにおけるオブジェクトの最大数は、イテレータのrangeSize属性で定義されます。たとえば、データ・コントロールのコレクションにサービス・リクエストが格納されており、イテレータのレンジ・サイズが10の場合、コレクションに含まれる最初の10個のサービス・リクエストがページに表示されます。ユーザーが下にスクロールすると、次の10個のサービス・リクエストのセットが表示され、その後も同様に続きます。ユーザーが上にスクロールすると、前の10個のセットが表示されます。
イテレータ・バインディングはページで使用されるコレクションごとに1つ存在しますが、variablesIteratorバインディングはページで使用されるすべての変数に対して1つのみ存在します。(変数イテレータは、バインディング・コンテナ変数である属性を持つオブジェクトのみを含むコレクションを指し示すイテレータに類似しています。)実行時にコンポーネント値にデータを移入するため、ページ上のすべての値バインディングはイテレータ・バインディングを参照する必要があります。(値バインディングの詳細は、5.5.2.3項「bindings要素で定義されたバインディング・オブジェクト」を参照してください。)
実行時には、executables要素内のバインディングが、ページ定義ファイルでの表示順にリフレッシュされます。イテレータ・バインディングのリフレッシュにより、基礎となるRowSetIteratorオブジェクトにバインディングが再接続されます。invokeActionバインディングのリフレッシュでは、アクションが起動されます。ただし、どのバインディングのリフレッシュ前にも、イテレータとinvokeAction要素で指定されたRefreshおよびRefreshCondition属性がADFランタイムにより評価されます。Refresh属性では、実行可能項目を起動するADFライフサイクル・フェーズを指定します。RefreshCondition属性では、実行可能項目を起動する際の条件を指定します。RefreshConditionの値は、ブールEL式を使用して指定できます。RefreshCondition属性を空白のままにすると、trueに評価されます。
|
ヒント: 構造ウィンドウを使用して、executables要素のバインディングをドラッグ・アンド・ドロップで並び替えます。 |
例5-8は、2つのタイプのイテレータ(メソッド・イテレータと変数イテレータ)およびinvokeActionオブジェクトを定義するexecutables要素の例を示しています。
例5-8 ページ定義ファイルのexecutables要素
<executables>
<methodIterator id="findServiceRequestsIter"
Binds="findServiceRequests.result"
DataControl="SRPublicFacade" RangeSize="10"
BeanClass="oracle.srdemo.model.entities.ServiceRequest"/>
<invokeAction Binds="findServiceRequests" id="tableRefresh"
Refresh="ifNeeded"
RefreshCondition="${(userState.refresh) and
(!adfFacesContext.postback)}"/>
<variableIterator id="variables">
<variable Type="java.lang.String" Name="setCurrentRowWithKey_rowKey"
IsQueriable="false"/>
</variableIterator>
</executables>
<bindings>
<methodAction id="findServiceRequests"
InstanceName="SRPublicFacade.dataProvider"
DataControl="SRPublicFacade"
MethodName="findServiceRequests" RequiresUpdateModel="true"
Action="999"
ReturnName="SRPublicFacade.methodResults.
SRPublicFacade_dataProvider_findServiceRequests_result">
<NamedData NDName="userIdParam" NDValue="#{userInfo.userId}"
NDType="java.lang.Integer"/>
<NamedData NDName="statusParam" NDValue="#{userState.listMode}"
NDType="java.lang.String"/>
</methodAction>
<table id="findServiceRequests1" IterBinding="findServiceRequestsIter">
...
</bindings>
findServiceRequestIterメソッド・イテレータ・バインディングは、データ・コントロール・パレットからページへfindServiceRequestメソッド戻りをドラッグして作成されています。このイテレータは、findServiceRequestメソッドによって戻されたコレクションを反復処理します。このメソッドは、Binds属性内で定義されます。RangeSize属性は、一度にフェッチされるオブジェクト数を定義します。RangeSizeの値が-1の場合は、イテレータ・バインディングによってコレクションのすべてのオブジェクトが表示されます。bindingsラッパー要素では、表バインディング・オブジェクトのIterBinding属性が、表にデータを移入するfindServiceRequestsIterイテレータ・バインディングを参照します。
上の例では、メソッド・イテレータ・バインディングは、bindings要素に定義されているfindServiceRequestsメソッド・アクション・バインディングに関連します。NamedData要素は、メソッドに渡されるパラメータを定義します。bindings要素のtableバインディングは、IterBinding属性のfindServiceRequestIterイテレータ・バインディングを参照して表にデータを移入します。
invokeActionオブジェクトは、メソッド・アクションに定義されているfindServiceRequestsメソッドを起動します。Refresh属性は、ADFライフサイクルのどの時点でメソッドを実行するかを決定します。一方、RefreshCondition属性は、アクションを起動する条件を指定します。(Refresh属性およびRefreshCondition属性の詳細は、A.7項「<pageName>PageDef.xml」を参照してください。Refresh属性およびRefreshCondition属性の使用例は、10.8項「検索ページの作成」を参照してください。)
変数イテレータは、setCurrentRowWithKey_rowKeyという変数を反復処理します。これは、setCurrentRowWithKey操作で必要とされるパラメータです。
ページ定義ファイルのbindings要素は、次のタイプのバインディング・オブジェクトを定義します。
値: イテレータ・バインディングを参照してUIコンポーネントにデータを表示します。データ・コントロールのデータを表示するページ内の個々のUIコンポーネントは、それぞれ1つの値バインディング・オブジェクトにバインドされます。値バインディング・オブジェクトは、次のとおりです。
methodAction: ボタンやリンクなどのコマンド・コンポーネントをデータ・コントロール上のカスタム・メソッドにバインドします。methodActionバインディング・オブジェクトは、メソッドの起動方法およびメソッドが取得するパラメータ(該当する場合)の詳細をカプセル化します。
メソッド・イテレータ・バインディングは、methodActionバインディング・オブジェクトにバインドされます。ページで使用される各メソッド・イテレータ・バインディングに対して、1つのメソッド・アクション・バインディングが存在します。
action: ボタンやリンクなどのコマンド・コンポーネントを、組込みデータ・コントロール操作(CommitやRollbackなど)に、または組込みコレクションレベル操作(Create、Delete、Next、PreviousやSaveなど)にバインドします。
bindings要素に定義されたバインディング・オブジェクトは、まとめてコントロール・バインディングと呼ばれます。これは、ページの各データ・バインド・コントロールはこれらのオブジェクトの1つにバインドされており、さらに各オブジェクトはexecutables要素に定義されたオブジェクトにバインドされているためです。
例5-9は、bindings要素の例を示しています。この要素では、findServiceRequestという1つのmethodActionバインディング、findServiceRequest1という表の1つの値バインディング、およびsetCurrentRowWithKeyという1つのアクション・バインディングを定義しています。
例5-9 ページ定義ファイルのbindings要素
<bindings>
<methodAction id="findServiceRequests"
InstanceName="SRPublicFacade.dataProvider"
DataControl="SRPublicFacade"
MethodName="findServiceRequests" RequiresUpdateModel="true"
Action="999"
ReturnName="SRPublicFacade.methodResults.
SRPublicFacade_dataProvider_findServiceRequests_
result">
<NamedData NDName="userIdParam" NDValue="#{userInfo.userId}"
NDType="java.lang.Integer"/>
<NamedData NDName="statusParam" NDValue="#{userState.listMode}"
NDType="java.lang.String"/>
</methodAction>
<table id="findServiceRequests1" IterBinding="findServiceRequestsIter">
<AttrNames>
<Item Value="assignedDate"/>
<Item Value="problemDescription"/>
<Item Value="requestDate"/>
<Item Value="status"/>
<Item Value="svrId"/>
</AttrNames>
</table>
<action id="setCurrentRowWithKey" IterBinding="findServiceRequestsIter"
InstanceName="SRPublicFacade.dataProvider"
DataControl="SRPublicFacade" RequiresUpdateModel="false"
Action="96">
<NamedData NDName="rowKey" NDValue="${row.rowKeyStr}"
NDType="java.lang.String"/>
</action>
</bindings>
例のfindServiceRequestsメソッドはパラメータを受け入れるため、メソッド・アクション・バインディングには、このメソッドによって取得されるパラメータを定義するNamedData要素が含まれます。メソッドへパラメータを渡す方法の詳細は、第10章「より複雑なページの作成」を参照してください。
表バインディング・オブジェクト内では、IterBinding属性が、コンポーネントにデータを表示する適切なイテレータ・バインディングを参照しています。表の処理を行うのは、表に表示されるすべての属性に対してイテレータ・バインディングを1回参照する、単一のバインディング・オブジェクトです。これは、この表で表示できるのが、単一のデータ・コレクションから取得したデータのみであることを意味します。ただし、フォームなどのコンテナ・コンポーネントの場合は、個々の属性に対して、イテレータ・バインディングを参照するバインディング・オブジェクトが設定されます。表とは異なり、フォームには、複数のデータ・コレクションから取得した属性を含めることができます。AttrNames要素は、コレクションのすべての属性値を定義します。
アクション・バインディングは、ユーザーがリンクをクリックしたときに特定のサービス・リクエストを戻す、コマンド・リンクにバインドされます。また、findServiceRequestsIterイテレータ・バインディングを参照して、namedData要素で定義される現在行キーを、パラメータとして渡します。
実行時に、ADFページ・ライフサイクルは、DataBindings.cpxファイルの情報を使用して、ページ定義ファイルのURLと一致するADFバインディング・コンテキストに、ページURLを渡します。次に、バインディング・コンテキストは、バインディング・コンテナをインスタンス化します(コンテナが現在のセッションに存在しない場合)。バインディング・コンテナは、ページ定義ファイルで定義されたすべてのバインディング・オブジェクトを含むランタイム・インスタンス・オブジェクトです。ページのUIコンポーネントによって表示されるすべてのデータは、バインディング・コンテナ内のバインディング・オブジェクトによって提供されます。ページのコンポーネントにより使用されるADFデータ・バインディング式は、実行時に評価され、ページのレンダリング時にバインディング・オブジェクトによって提供される値に置き換えられます。
デフォルトでは、バインディング・コンテナおよびそれに含まれるバインディング・オブジェクトは、セッション・スコープで定義されます。一方、値バインディングとイテレータ・バインディングによって参照される値は、リクエスト間で定義されません。スケーラビリティを確保するため、セッション・スコープでは維持されません。したがって、バインディング・オブジェクトが参照する値は、そのバインディング・コンテナがADFライフサイクルによって準備されたリクエストの間のみ有効です。セッション・スコープで維持されるのは、バインディング・コンテナとバインディング・オブジェクトそれ自体のみです。
リクエストごとに、イテレータ・バインディングは、基礎となるRowSetIteratorオブジェクトにリバインドするためにリフレッシュされます。デフォルトでは、行セット・イテレータの状態およびデータ・キャッシュは、リクエスト間で維持されます。
前の項では、実行時にバインディング・コンテナで作成されるバインディング・オブジェクトを定義する際に、ページ定義がどのように使用されるかについて説明しました。データ・モデルのデータを表示するため、WebページのUIコンポーネントは、JSF式言語(EL)の式を使用して、バインディング・オブジェクトにバインドされます。EL式は、バインディング・コンテナ内の特定のバインディング・オブジェクトを参照します。実行時にJSFランタイムによってEL式が評価され、ページを表示する際にバインディング・オブジェクトから値が取得されてコンポーネントにデータが移入されます。ユーザーがUIコンポーネントのデータを更新すると、JSFランタイムにより、同じEL式に基づいて適切なバインディング・オブジェクトに値が戻されます。
データ・コントロール・パレットを使用してコンポーネントを作成すると、ADFデータ・バインディング式が自動的に作成されます。作成された式は、バインディング・オブジェクトのデータを表示するコンポーネント属性、またはバインディング・オブジェクトのプロパティを参照するコンポーネント属性のすべてに追加されます。事前作成済のそれぞれの式は、ページ定義ファイルで定義された、適切なバインディング・オブジェクトを参照します。
これらのバインディング式は編集可能ですが、ADFバインディング式の基本構文に従っていれば、独自に作成することもできます。ADFデータ・バインディング式は、バインディング・オブジェクトからのデータを移入する任意のコンポーネント属性に追加できます。
JSFページの一般的なADFデータ・バインディングEL式は、次の構文を使用して、バインディング・コンテナ内のタイプの異なるバインディング・オブジェクトを参照します。
#{bindingVariable.BindingObject.propertyName}
説明:
bindingVariableは、式によって参照されるバインディング・オブジェクトの検索場所を識別する変数です。bindings変数は、ADFバインディング式で使用される、最も一般的な変数です。また、現在のページのバインディング・コンテナを参照します。デフォルトでは、データ・コントロール・パレットから作成されるすべてのコンポーネントにより、バインディング式でbindings変数が使用されます。
BindingObjectは、ページ定義ファイルで定義される、バインディング・オブジェクトの名前です。このバインディング・オブジェクト名は、ページ定義のバインディング・オブジェクト定義のid属性内に出現し、そのページ定義内では一意です。EL式は、パラメータ・バインディング、実行可能バインディングまたは値バインディングなど、ページ定義ファイル内のどのバインディング・オブジェクトでも参照できます。データ・コントロール・パレットを使用してコンポーネントを作成すると、データ・コントロール内の項目の名前に基づいて、自動的にバインディング・オブジェクトに名前が割り当てられます。
propertyNameは、各データ・バインドUIコンポーネントのデフォルトの表示方法を決定し、実行時のバインディング・オブジェクトのプロパティを設定する変数です。各タイプのバインディング・オブジェクトに対して、異なるバインディング・プロパティがあります。バインディング・プロパティの詳細は、5.6.4項「ADFバインディング・プロパティに関して必要な知識」を参照してください。
たとえば、次の式について検討してみます。
#{bindings.SvrId.inputValue}
bindings変数は、現在のページのバインディング・コンテナに含まれるバインド値を参照します。参照されているバインディング・オブジェクトは、属性バインディング・オブジェクトであるSvrIdです。バインディング・プロパティはinputValueで、最初のSvrId属性の値を戻します。
|
ヒント: ページ定義ファイルのバインディング式ではドル記号($)またはハッシュ記号(#)の接頭辞を使用できますが、JSFページのEL式で使用できるのは、ハッシュ記号(#)の接頭辞のみです。 |
様々なタイプのADFデータ・バインディング式の例は、5.6.3項「ADFデータ・バインディング式の作成時に行われる処理」を参照してください。
ADFデータ・バインディングEL式の作成または編集手順:
JDeveloperでは、次のいずれかの方法で、式の作成または編集を行えます。
構造ウィンドウでUIコンポーネントをダブルクリックし、表示されたエディタで値フィールドを編集します。(「バインド」ボタンをクリックして「式ビルダー」に移動すると、使用可能なバインディング・オブジェクトおよびプロパティから選択できます。詳細は、5.6.2項「式ビルダーの使用方法」を参照してください。)
ビジュアル・エディタのソース・ビューを使用してWebページを表示し、ソース内で直接式を編集します。JDeveloperにより、ソース・エディタ内に、EL式のコード・インサイトが提供されます。コード・インサイトは、プロパティ・インスペクタおよびタグ・エディタでも使用できます。コード・インサイトを起動するには、EL式の先行文字(たとえば#{)を入力します。コード・インサイトにより、式のセグメントごとに有効な項目のリストが表示されるため、そこから適切な項目を選択できます。
ビジュアル・エディタまたは構造ウィンドウでUIコンポーネントを選択し、プロパティ・インスペクタを開きます(「表示」→「プロパティ・インスペクタ」)。プロパティ・インスペクタで直接式を編集するか、式の横にある省略記号をクリックして、式ビルダーを開きます。
JDeveloperの式ビルダーは、EL式を作成するためのダイアログです。このダイアログでは、ページ定義ファイルに定義されたバインディング・オブジェクトのリストと、マネージドBeanおよびバインディング・プロパティのリストが提供されます。また、ADFバインディング・オブジェクトの階層リスト、および式に使用するために選択できる、それらのオブジェクトの最多使用プロパティが提供されるため、ADFデータ・バインド式の作成や編集に特に便利です。バインディング・プロパティの詳細は、5.6.4項「ADFバインディング・プロパティに関して必要な知識」を参照してください。
式ビルダーは、構造ウィンドウまたはプロパティ・インスペクタから開くことができます。
構造ウィンドウから式ビルダーを開く手順:
構造ウィンドウでADFデータ・バインドUIコンポーネントの1つをダブルクリックします。
次に表示されるダイアログで、コンポーネント・プロパティの横にある「バインド」ボタンをクリックし、式ビルダーを表示します。
プロパティ・インスペクタから式ビルダーを開く手順:
構造ウィンドウまたはビジュアル・エディタでUIコンポーネントを選択し、プロパティ・インスペクタを開きます。
プロパティ・インスペクタで、次のいずれかのアクションを実行することで式ビルダーを表示します。
既存のバインディング式の横にある省略記号をクリックします。
または
バインディングを追加するプロパティを選択し、図5-5のように「データにバインド」ボタンをクリックします。
(選択されたプロパティへのバインディング式の追加が有効な場合のみ、「データにバインド」ボタンがアクティブになります。)
式ビルダーの使用手順:
式ビルダーで「ADFバインディング」→bindingsノードの順に開き、図5-6のように現在のページに対応するADFバインディング・オブジェクトを表示します。
「ADFバインディング」→dataノードの使用方法は、5.6.5項「他のページの値へのバインディングに関して必要な知識」を参照してください。
式ビルダーの次の機能を使用して、ADFバインディング式を編集または作成します。
「変数」ツリーを使用して、バインディング式に含める項目を選択します。ツリーには、バインディング・オブジェクトの階層表現が含まれます。ツリー内の各アイコンは、式で使用できる様々なタイプのバインディング・オブジェクトを表します(各アイコンの詳細は、表5-2を参照)。ツリー内の項目を選択し、シャトル・ボタンをクリックして「式」ボックスに移動します。
新しい式を作成する場合は、「式」ボックスに式を入力します。JDeveloperでは、式ビルダーでコード・インサイトを使用できます。コード・インサイトを起動するには、EL式の先行文字(たとえば#{)またはピリオド・セパレータを入力します。コード・インサイトにより、式のセグメントごとに有効な項目のリストが表示されるため、そこから適切な項目を選択できます。
式の下にある演算子ボタンを使用して、式に論理演算子または数値演算子を追加します。
表5-2 式ビルダーの「ADFバインディング」ノードの下にあるアイコン
| アイコン | 説明 |
|---|---|
|
|
現在のページのバインディング・コンテナを参照する、 |
|
|
バインディング・コンテキスト全体を参照する、 このノードの下にあるオブジェクトを使用する前に、5.6.5項「他のページの値へのバインディングに関して必要な知識」に含まれる詳細および注意事項を参照してください。 |
|
|
バインディング・コンテナを表します。それぞれのバインディング・コンテナ・ノードには、ノードを定義するページ定義ファイルの名前が付きます。これらのノードが表示されるのは、dataノードの下のみです。バインディング・コンテナ・ノードを開くと、そのページに対して定義されたバインディング・オブジェクトが公開されます。 このノードの下にあるオブジェクトを使用する前に、5.6.5項「他のページの値へのバインディングに関して必要な知識」に含まれる詳細および注意事項を参照してください。 |
|
|
アクション・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なアクション・バインディング・プロパティのリストが公開されます。 |
|
|
イテレータ・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なイテレータ・バインディング・プロパティのリストが公開されます。 |
|
|
属性バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効な属性バインディング・プロパティのリストが公開されます。 |
|
|
リスト・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なリスト・バインディング・プロパティのリストが公開されます。 |
|
|
表バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効な表バインディング・プロパティのリストが公開されます。 |
|
|
ツリー・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なツリー・バインディング・プロパティのリストが公開されます。 |
|
|
ADFバインディング・オブジェクト・プロパティを表します。ADFプロパティの詳細は、5.6.4項「ADFバインディング・プロパティに関して必要な知識」を参照してください。 |
|
|
パラメータ・バインディング・オブジェクトを表します。 |
前述のように、データ・コントロール・パレットを使用してコンポーネントを作成すると、ADFデータ・バインディング式が自動的に追加されます。それぞれの式は、参照するバインディング・オブジェクトのタイプによって、若干異なります。
例5-10は、データ・コレクションをADF読取り専用フォームとしてページ上にドロップしたときに作成されたテキスト・フィールドを示しています。この例のテキスト・フィールドを含め、フォーム内の各UIコンポーネントには、データ・コレクションに含まれる特定の属性の属性バインディング・オブジェクトを参照するEL式が含まれます。
例5-10 属性バインディング・オブジェクトを参照するEL式
<af:inputText value="#{bindings.SvrId.inputValue}"
label="#{bindings.SvrId.label}"/>
この例では、UIコンポーネントは、データ・コレクション内の特定の属性であるSvrIdバインディング・オブジェクトにバインドされています。inputValueバインディング・プロパティによって、バインディングが関連付けられている最初の属性の値が戻されます。この例の場合はSvrIdです。label属性内で、EL式は、データ属性に現在割り当てられているラベルを戻すlabelバインディング・プロパティを参照します。
EL式によって参照される値バインディング・オブジェクトSvrIdは、例5-11のように、ページ定義ファイルで定義されます。EL式によって参照されるバインディング・オブジェクトの名前は、バインディング・オブジェクト定義のid属性内で定義されます。
例5-11 ページ定義ファイルで定義された属性バインディング・オブジェクト
<attributeValues id="SvrId" IterBinding="FindAllServiceRequestsIter"
isDynamic="true">
<AttrNames>
<Item Value="SvrId"/>
</AttrNames>
</attributeValues>
|
ヒント: アクセッサ戻りの属性をデータ・コントロール・パレットからドラッグして作成した値バインディングでは、JDeveloperによって、属性名の前にアクセッサ・メソッド名が追加されます。たとえば、式#{bindings.ServiceRequestsvrId.label}では、バインディング・オブジェクト名は、アクセッサ・メソッド名ServiceRequestと属性名svrIdの組合せになります。 |
データ・コントロール・パレットからデータ・コレクションをドラッグして、ADF読取り専用表としてJSFページにドロップした場合、作成された表のタグには、通常、例5-12のように、表を表の値バインディング・オブジェクトにバインドする一連のEL式が含まれます。
例5-12 表バインディング・オブジェクトを参照するEL式
<af:table value="#{bindings.findAllStaff1.collectionModel}" var="row"
rows="#{bindings.findAllStaff1.rangeSize}"
first="#{bindings.findAllStaff1.rangeStart}"
emptyText="#{bindings.findAllStaff1.viewable ?
\'No rows yet.\' : \'Access Denied.\'}"
tableタグの各属性には、表バインディング・オブジェクトを参照するバインディング式およびそのタグ属性に適したバインディング・プロパティが含まれます。rows属性内のバインディング式は、イテレータ・バインディングのrangeSizeプロパティ(イテレータの各ページの行数を定義するプロパティ)を参照します。これにより、表内にレンダリングされる行数が、イテレータ・バインディングによって定義されたページごとの行数に一致します。
表は、findAllStaff1表バインディング・オブジェクトにバインドされます。これは、ページ定義ファイルで例5-13のように定義されます。
例5-13 ページ定義ファイルで定義された表バインディング・オブジェクト
<table id="findAllStaff1" IterBinding="findAllStaffIter">
<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属性は、表にデータを表示するイテレータ・バインディングを参照しています。
例5-14は、データ・コントロール・パレットから組込み操作をドラッグし、ページ上にドロップして作成されたコマンド・ボタンを示しています。このボタンには、組込み操作FirstにバインドするEL式が含まれます。この操作は、操作が属するデータ・コレクション内の最初のデータ・オブジェクトを表示します。
例5-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に評価されるため、ボタンは有効化されます。
例5-15は、コマンド・ボタン用にページ定義で定義されたアクション・バインディング・オブジェクトを示しています。
例5-15 操作用にページ定義ファイルで定義されたアクション・バインディング・オブジェクト
<executables>
<methodIterator id="findAllStaffIter" Binds="findAllStaff.result"
DataControl="SRPublicFacade" RangeSize="10"
BeanClass="oracle.srdemo.model.entities.User"/>
</executables>
<bindings>
<methodAction id="findAllStaff" InstanceName="SRPublicFacade.dataProvider"
DataControl="SRPublicFacade" MethodName="findAllStaff"
RequiresUpdateModel="true" Action="999"
ReturnName="SRPublicFacade.methodResults.
SRPublicFacade_dataProvider_findAllStaff_result"/>
<action id="First" IterBinding="findAllStaffIter"
InstanceName="SRPublicFacade.dataProvider"
DataControl="SRPublicFacade" RequiresUpdateModel="true"
Action="12"/>
</bindings>
action要素Firstは、コマンド・ボタンでEL式が直接参照するアクション・バインディングを定義します。アクション・バインディングのIterBinding属性は、アクションにより操作されるデータ・コレクションを反復処理するメソッド・イテレータ・バインディングfindAllStaffIterを参照します。findAllStaffIterは、findAllStaffメソッドの起動に必要な情報をカプセル化するmethodAction、findAllStaffにバインドされます。
|
ヒント: action要素のAction属性の数値は、oracle.adf.model.metaパッケージのOperationDefinitionインタフェースの数値定数を参照します。 |
例5-16は、データ・コントロール・パレットからメソッドをドラッグし、JSFページ上にドロップして作成された、コマンド・ボタンを示しています。この例のコマンド・ボタンは、データ・コレクションからオブジェクトを削除するremoveServiceHistoryメソッドにバインドされています。メソッドの起動時にメソッドに渡されるパラメータによって、削除するオブジェクトが識別されます。ユーザーがボタンをクリックすると、actionListener属性内のEL式のexecuteバインディング・プロパティによって、メソッドが起動されます。
例5-16 メソッドのアクション・バインディング・オブジェクトを参照するEL式
<af:commandButton actionListener="#{bindings.removeServiceHistory.execute}"
text="removeServiceHistory"
disabled="#{!bindings.removeServiceHistory.enabled}"/
例5-17は、コマンド・ボタン用にページ定義ファイルで作成されたバインディング・オブジェクトを示しています。コマンド・コンポーネントがメソッドにバインドされている場合、ページ定義ファイルで作成されるバインディング・オブジェクトは1つ(methodAction)のみです。methodActionバインディングは、NamedData要素で定義されるパラメータなど、メソッドの起動に必要な情報を定義します。
例5-17 ページ定義ファイルで定義されたメソッド・アクション・バインディング
<bindings>
<methodAction id="removeServiceHistory"
InstanceName="SRPublicFacade.dataProvider"
DataControl="SRPublicFacade" MethodName="removeServiceHistory"
RequiresUpdateModel="true" Action="999">
<NamedData NDName="serviceRequest"
NDType="oracle.srdemo.model.entities.ServiceRequest"/>
<NamedData NDName="serviceHistory"
NDType="oracle.srdemo.model.entities.ServiceHistory"/>
</methodAction>
</bindings>
データ・コントロール・パレットを使用してデータ・バインドされたコンポーネントを作成すると、EL式によって、特定のADFバインディング・プロパティが参照されます。実行時には、これらのバインディング・プロパティによって、データ・バインドUIコンポーネントのデフォルトの表示方法や、イテレータ・バインディング固有のパラメータなどが定義されます。ADFバインディング・プロパティは、Oracle APIによって定義されます。各バインディング・タイプで使用できるプロパティの完全なリストは、付録B「ADFバインディング・プロパティのリファレンス」を参照してください。
特定のプロパティに割り当てられる値は、ページ定義ファイルで定義されます。たとえば、イテレータは、イテレータが一度に表示する行数を指定する、RangeSizeというプロパティを参照できます。例5-18のように、RangeSizeに割り当てられる値は、ページ定義ファイルで指定されます。
例5-18 RangeSizeプロパティを使用したイテレータ・バインディング・オブジェクト
<accessorIterator id="serviceHistoryCollectionIterator" RangeSize="10"
Binds="serviceHistoryCollection"
DataControl="SRDemoSessionDataControl"
BeanClass="oracle.srdemo.model.ServiceHistory"
MasterBinding="findAllServiceRequestIter"/>
JDeveloperの式ビルダーを使用すると、各バインディング・オブジェクトの有効なバインディング・プロパティのリストを表示できます。式ビルダーの使用方法の詳細は、5.6.2項「式ビルダーの使用方法」を参照してください。
オラクル社では推奨していませんが、EL式のdataバインディング変数を使用して、現在のページから別のページのバインディング・コンテナにあるバインド値にアクセスできます。dataバインディング変数は、使用できるすべてのバインディング・コンテナへのアクセスを提供する、バインディング・コンテキスト自体を参照します。この変数は、別のページのバインディング・コンテナにあるオブジェクトにバインドする場合に使用します。data変数の直後には、参照されるバインディング・コンテナを定義するページ定義ファイルの名前を記述する必要があります。たとえば、次のように入力します。
#{data.mypagePageDef.BindingObject.propertyName}
実行時には、現在の新しいページ(新しいページとレンダリングされたページが異なる場合はレンダリングされたページ)のバインディング・コンテナが、フレームワークによって、現在のリクエストの間に自動的に準備されます。そのため、現在のページから別のページのバインド値に正常にアクセスするには、現在のリクエストでページのバインディング・コンテナを(たとえば、バッキングBeanを使用して)プログラム的に準備しておく必要があります。これを行わなかった場合は、このページに含まれるバインド値が、現在のリクエストで使用不可または無効になる可能性があります。
ときには、data変数を使用して、バインディング・コンテナ間で値をバインドする必要が出てきます。このような場合は、かわりにバッキングBeanを使用してページの値を格納し、他のページで使用できるようにすることをお薦めします。バッキングBeanに値を格納する方法は、10.2項「マネージドBeanを使用した情報の格納」を参照してください。
|
注意: 5.5.4項「バインディング・コンテナ・スコープに関して必要な知識」で説明したように、バインディング・コンテナとそれに含まれるバインディング・オブジェクトは、セッション・スコープで定義されますが、バインディング・オブジェクトによって参照される値は定義されません。デフォルトでは、RowSetIteratorの状態およびデータ・キャッシュがリクエスト間で管理されるため、バインディング・オブジェクトによって参照されるバインド値をページ間で使用できます。
ただし、複数のページのバインディング・オブジェクトを参照する場合は、セッション・スコープでバインド値を使用できません。バインド値のライフサイクルは、データ・コントロールによって管理されます。指定したリクエストの中でバインド値を使用できるかどうかは、データ・コントロール自体が使用可能かどうか、また、参照されるバインディング・コンテナがライフサイクルの中で準備済かどうかによります。そのため、別のページからの1つのバインディング・コンテナでバインド値を参照する前に、参照されるバインディング・コンテナが指定したリクエストの間に準備されることを確認してください。 また、アプリケーションでは、プログラム的に、もしくはイテレータ・バインディングの |