この章では、データ・コントロール・パレットを使用して既存のUIコンポーネントにADFバインディングを追加する方法について説明します。データ・コントロール・パレットを使用してアプリケーション・ページを設計するかわりに、先にコントロール・パレットなどの他のツールを使用してUIを設計し、後からADFバインディングを追加できます。
この章の内容は次のとおりです。
データ・コントロール・パレットを使用すると、バインドされたコンポーネントを1回のドラッグ・アンド・ドロップ・アクションで設計および作成できますが、基本的なUIコンポーネントを先に作成して後からバインディングを追加した方がよい場合があります。たとえば、開発チームにUI設計者がいる場合は、その設計者がコントロール・パレットなどのJDeveloperツールを使用して基本ページを作成し、開発者がページ機能(ADFバインディングなど)を後から追加することができます。
この章では次の内容について説明します。
ADFバインディングを簡単に挿入するためのページの設計方法
ADFバインディングを追加できるUIコンポーネント
データ・コントロール・パレットを使用して既存のページ・コンポーネントにADFバインディングを追加する方法
ADFバインディングの追加時にコンポーネントに発生する処理
後からADFバインディングを追加するWebページを設計および作成する場合、JDeveloperのウィザード、ビジュアル・エディタおよび設計ツール(コンポーネント・パレットなど)を使用します。
ページは必要なタグを使用して設計できますが、ADFバインディングを特定のコンポーネントに追加する場合は、ADFバインディングと連携して機能するタグを使用してそれらのコンポーネントを設計します。タグを使用しない場合は、後でバインディングを追加するときにコンポーネント全体を置換する必要があります。
ADFバインディングを既存のコンポーネントに追加する場合、ADFでは、元のコンポーネントのプロパティが可能なかぎり保持されます。ただし、ラベル、列ヘッダー、レンジ・ナビゲーションなどは、バインディングにより上書きされる場合があります。
ラベル値に静的テキスト文字列が含まれる場合、ADFバインディングにより、データ・コントロールの属性名にバインドされるEL式で値が上書きされます。ビジネス・サービスのエンティティ・オブジェクトまたはビュー・オブジェクト属性に対するコントロール・ヒントを使用すると、ADFバインディングに表示されるラベルを一元的に定義できます。ただし、リソース・バンドルに対する標準バインディングなど、マネージドBeanを参照するEL式を使用してUIラベルを定義する場合、ADFバインディングをこのコンポーネントに追加するときにこのラベルが保持されます。多くの場合、特にページをローカライズする場合などは、リソース・バンドルにバンドルされたラベルを使用して基本的なUIコンポーネントを設計するようにしてください。リソース・バンドルの詳細は、22.4項「アプリケーションの国際化」を参照してください。
レンジ・ナビゲーションは、バインディングによって参照されるイテレータが現在行セットを管理するため、ADFバインディングによって上書きされる別のプロパティです。この章の後半の各項で、特定のUIコンポーネントにADFバインディングを追加する方法と、それらの特定のコンポーネントがADFバインディングによってどのように影響を受けるかについて説明します。
JSF JSPの作成ウィザードを使用してADFバインディングを追加するページを作成する場合、次の操作を実行すると、将来のバインディング処理が簡単になります。
「マネージドBeanでUIコンポーネントを自動公開しない」オプションを選択します。
このオプションにより、偶発的なプログラム操作に応じてページ内のすべてのUIコンポーネントを対応するバッキングBeanのプロパティに自動的に関連付ける、JDeveloperの自動バインディング機能が無効になります。ADFバインディングをページに追加する場合、自動バインディング機能を使用しないことをお薦めします。自動バインディング機能を使用すると、後で、ADFバインディングを追加した後にマネージドBeanのバインディングを削除する必要があります。マネージドBeanのUIコンポーネント・プロパティのバインディングがADFバインディングに影響を及ぼすことはありませんが、JSFコードに存在するとわかりにくくなります。マネージドBeanの詳細は、11.5項「Webページ用のバッキングBeanの作成および使用」を参照してください。
ADF Facesのタグ・ライブラリを追加します。
ADFバインディングをJSFコンポーネントに追加できますが、ADF Facesコンポーネントの方が、特にADFバインディングと組み合せる場合には優れた機能を発揮します。
必要なページレベルの物理的な属性(背景色、スタイルシート、スキンなど)を追加します。
ADFバインディングは、ページレベルの属性には影響を及ぼしません。ADF Facesスキンの使用方法は、22.3項「スキンの使用によるルック・アンド・フィールの変更」を参照してください。
Webページの設計時に、ADFバインディングは特定のADF Facesタグまたはそれに相当するJSF HTMLタグにしか追加できないことに留意してください。表21-1に、後からADFバインディングを追加できるADF FacesおよびJSFのタグを示します。コンポーネント・パレットでは、ADF FacesタグはADF Faces Coreページ上で、JSFタグはJSF HTMLページ上で使用できます。
ヒント: JSFの参照実装UIコンポーネント・タグをADFバインディングとともに使用できるようにするには、プロジェクト・プロパティの「ADFビュー設定」で「JSFデータ・バインディングにJSF HTMLウィジェットを含む」オプションを選択する必要があります。しかし、ADF Facesタグを特にADFバインディングとともに使用すると、JSFの参照実装タグを使用するときより優れた機能を発揮します。 |
表21-1 ADFバインディングに使用できるタグ
ADFバインディングで使用されるADF Facesタグ | 相当するJSF HTMLタグ |
---|---|
テキスト・フィールド |
|
|
|
|
|
|
|
表 |
|
|
|
アクション |
|
|
|
|
|
選択リスト |
|
|
|
|
|
|
|
|
|
ツリー |
|
|
該当なし |
|
該当なし |
JDeveloperのウィザードやエディタを使用して、後からADFバインディングを追加するページを設計する場合、次のいずれかの方法を使用できます。
後からバインドできるオプションを選択し、静的なラベルおよび値を入力します。この方法により、後でADFバインディングによって戻される値およびラベルで置換されるプレースホルダのラベルおよび値を使用して、UIを設計できるようになります。
または
ラベルに表示される実際のテキストを含むリソース・バンドルにラベルをバインドします。後でADFバインディングをコンポーネントに追加すると、ADFにより、リソース・バンドル(またはマネージドBean)に対する既存のラベル・バインディングが保持されます。リソース・バンドルの使用方法の詳細は、22.4項「アプリケーションの国際化」を参照してください。
JSFおよびADF Facesのコンポーネントの作成の詳細は、11.4.1項「JSFページにUIコンポーネントを追加する方法」を参照してください。
テキスト・フィールド・ラベルの場合、静的なプレースホルダ値を入力するか、リソース・バンドルにバインドできます。ラベルをリソース・バンドルにバインドしない場合、プロパティ・インスペクタまたはソース・エディタを使用して、テキスト・フィールドのプレースホルダのラベルおよび値を追加または変更します。後からバインディングを追加する開発者がフィールドの目的をより簡単に特定できるようにするプレースホルダのラベルおよび値を使用します。静的プレースホルダ値は、ADFバインディングによって置換されます。ただし、前に説明したとおり、リソース・バンドルに対するバインディングは保持されます。
たとえば、ユーザー情報を表示するフォームを作成する場合は、User First Name
、User Last Name
およびUser Address
をプレースホルダ・テキスト・フィールド・ラベルとして使用します。その後、ADFバインディングを追加する開発者が、プレースホルダ・ラベルをデータ・コントロール上のデータ・ソースの実際の属性と一致させます。
コンポーネント・パレットから表コンポーネントをドラッグしてページにドロップすると、表の定義を支援する表ウィザードが表示されます。ADF Faces Tableウィザードで「後でバインド」オプション(JSF表の場合は、データ表の作成ウィザードで「列数」オプション)を選択します。このオプションを使用すると、データ・ソースにバインドするかわりに表で必要な列数を指定できます。必要な列の合計数が不明な場合は、推定値を入力します。列数は、後でバインディングを追加する際に簡単に調整できます。
テキスト・フィールドと同様に、列ヘッダーでプレースホルダ・ラベルまたはリソース・バンドル・バインディングを使用します。ADFのTableコンポーネントを使用する場合、ADF Faces Tableウィザードの「列の詳細」ページの「ヘッダー・テキスト」フィールドに列ヘッダーを指定できます。JSF表の場合は、ビジュアル・エディタに表示される表に列ヘッダーを直接入力できます。
ボタンまたはリンク・ラベルの場合は、プロパティ・インスペクタまたはソース・エディタを使用して静的なプレースホルダまたはリソース・バンドルに対するバインディングを追加します。ボタンまたはリンクがページ・ナビゲーションを実行する場合、結果値をaction
属性に指定し、最初のページでのページ・ナビゲーションを有効にできます。ただし、ADFバインディングを追加すると、action
属性が上書きされるため、アクションを再入力する必要があります。
コンポーネント・パレットから選択リストをドラッグしてページにドロップすると、リストの定義を支援する「挿入」ダイアログが表示されます。「挿入」ダイアログの「リストの作成」オプションを使用して、リストを定義します。静的リストを最終的に作成する場合は、アイテムのラベルまたは値のみ入力します。データ・コレクションのバインディングからリストに移入する場合は、アイテムのラベルおよび値を空白のままにします。リスト・ラベルの場合は、プロパティ・インスペクタを使用して静的なプレースホルダまたはリソース・バンドルに対するバインディングを追加します。たとえば、製品のドロップダウン・リストを作成する場合、リストのラベルとしてProducts
と入力します。静的なプレースホルダ・ラベルは、後でバインディングを追加するとADFバインディング式で置換されます。
既存のコンポーネントをADFデータ・コントロールにバインドするには、ADFバインディング式をコンポーネント・タグに追加する必要があります。ADFバインディング式は既存のタグに手動で追加できますが、データ・コントロール・パレットを使用する方が簡単です。データ・コントロール・パレットを使用すると、必要なバインディング・オブジェクトおよび参照がすべて自動的に作成されます。(詳細は、21.3.2項「データ・コントロール・パレットを使用したADFバインディングの追加時に発生する処理」を参照してください。)
次の手順では、データ・コントロール・パレットと構造ウィンドウを使用して既存のコンポーネントにADFバインディングを追加する方法の概要について説明します。この章の後半の各項で、特定のタイプのコンポーネントにADFバインディングを追加する方法について説明します。
データ・コントロール・パレットおよび構造ウィンドウを使用してADFバインディングを追加する方法:
ビジュアル・エディタの「設計」ページにページを表示して、構造ウィンドウを開きます。
ヒント: データ・コントロール・オブジェクトは、ビジュアル・エディタの「設計」ページに表示されるコンポーネントにドロップできますが、構造ウィンドウを使用すると精度が向上します。たとえば、ビジュアル・エディタでデータ・コントロール・オブジェクトをコンポーネントにドロップしようとして、ポップアップ・メニューに「既存のバインド」→「<component name>」オプションが表示されない場合、ビジュアル・エディタでデータ・コントロールを正しいタグにドロップしなかったことを意味します。この場合、各タグを明確に図で表す構造ウィンドウを使用して試みてください。 |
ビジュアル・エディタの「設計」ページで、ADFバインディングを追加するUIコンポーネントを選択します。
コンポーネントは、表21-1に示すタグのいずれかである必要があります。コンポーネントをビジュアル・エディタで選択すると、図21-1に示すように、構造ウィンドウのそのコンポーネント・タグが同時に選択されます。構造ウィンドウを使用して、正しいコンポーネントを選択していることを確認します。誤ったコンポーネントが選択されている場合は、構造ウィンドウで調整します。
適切なデータ・コントロール・オブジェクトをデータ・コントロール・パレットから構造ウィンドウにドラッグし、選択したUIコンポーネントにドロップします。(データ・コントロール・パレット上のノードの詳細は、12.2.1項「データ・コントロール・パレットの各項目の理解」を参照してください。)
ヒント: 構造ウィンドウでデータ・コントロール・オブジェクトをUIコンポーネント上に置くと、図21-2に示すように、上向きまたは下向きの矢先がある横線がコンポーネントの上方または下方に表示されます。これらの線のいずれかが表示されるときは常に、データ・コントロール・オブジェクトをドロップできます。この場合、矢先が指す向きは問題ではありません。 |
データ・コントロール・パレットのポップアップ・メニューから、「既存のバインド」→「<component name>」オプションを選択します。<component name>は、図21-3に示すように、コンポーネント(テキスト・フィールド、表など)の名前です。
ヒント: ポップアップ・メニューに「既存のバインド」→「<component name>」オプションが表示されない場合は、構造ウィンドウでデータ・コントロール・オブジェクトを正しいタグにドロップしていません。バインディングは、表21-1に示すタグにのみ追加できます。 |
データ・コントロール・パレットを使用する場合、必要なADFオブジェクトはすべて自動的に作成されます。
DataBindings.cpx
ファイルが作成され、ページに対応するエントリが追加されます。
ADFバインディング・フィルタがweb.xml
ファイルに登録されます。
ADFフェーズ・リスナーがfaces-config.xml
ファイルに登録されます。
ページ定義ファイルが、ページ上のコンポーネント用のバインディング・オブジェクト定義を使用して作成および構成されます。
これらのすべてのオブジェクトは、ADFバインディングを指定されたコンポーネントをページに正しくレンダリングするのに必要です。データ・コントロール・パレットを使用しない場合は、これらのものを手動で作成する必要があります。これらのオブジェクトの詳細は、第12章「ページでのデータの表示」を参照してください。
コンポーネントを構成する個々のテキスト・フィールドをバインドして、フォームまたはその他のコンテナ・コンポーネントをバインドします。同時にフォーム全体をバインドすることはできません。テキスト・フィールドは、コレクションの属性にバインドします。
ADFバインディングをテキスト・フィールドに追加するには、データ・コントロール・パレットから属性をドラッグして、構造ウィンドウに表示されるテキスト・フィールド・コンポーネントにドロップします。データ・コントロール・パレットから構造ウィンドウへのアイテムのドロップに関する一般的なヒントは、21.3.1項「データ・コントロール・パレットを使用してADFバインディングを追加する方法」を参照してください。
ビジュアル・エディタの「設計」ページにページを表示して、構造ウィンドウを開きます。
ビジュアル・エディタの「設計」ページで、テキスト・フィールドを選択します。
これにより、構造ウィンドウのタグが同時に選択されます。テキスト・フィールド・タグは、先の表21-1に示したタグのいずれかである必要があります。誤ったタグが選択されている場合は、構造ウィンドウで調整します。
データ・コントロール・パレットから構造ウィンドウに属性をドラッグし、選択したテキスト・フィールドにドロップします。
データ・コントロール・パレットのポップアップ・メニューで、「既存のバインド」→「入力テキスト」を選択します。
バインディングがテキスト・フィールドに追加されます。
例21-1に、ADFバインディングが追加される前の入力テキスト・フィールド・コンポーネントを示します。この例は、静的ラベル値がFirst Name
である単純なinputText
タグです。
例21-2に、SRDemoデータ・コントロールからStaffList
コレクションのFirstName
属性がドロップされた後の同じテキスト・フィールドを示します。元のタグでは静的文字列であったラベルがバインディング式で置換されていることに注意してください。ADFバインディングによって表示されるラベルを変更するために、コントロール・ヒントを使用できます。その他のタグの属性が、FirstName
属性の各種プロパティのバインディングとともに追加されています。各バインディング・プロパティの詳細は、付録B「ADFバインディング・プロパティのリファレンス」を参照してください。
例21-2 ADFバインディングが追加された後のテキスト・フィールド・コンポーネント
<af:inputText label="#{bindings.StaffListFirstName.label}" value="#{bindings.StaffListFirstName.inputValue}" required="#{bindings.StaffListFirstName.mandatory}" columns="#{bindings.StaffListFirstName.displayWidth}"> <af:validator binding="#{bindings.StaffListFirstName.validator}"/> </af:inputText>
テキスト・フィールドにバインディングを追加する他に、データ・バインドされたテキスト・フィールドのエントリがページ定義ファイルに自動的に追加されます。ページ定義エントリには、executables
要素に定義されたイテレータ・バインディング・オブジェクトと、bindings
要素に定義された値バインディングが含まれます。データ・バインドされたテキスト・フィールドおよびフォームの詳細は、第13章「基本的なページの作成」を参照してください。
ADFバインディングは、一度に表全体に追加できます。つまり、表を構成する個々のコンポーネントではなく、表全体をバインドすることをお薦めします。表にバインディングを追加する際、コレクション全体をデータ・コントロール・パレットから表にドラッグできます。個々の列はバインドできますが、表がすでにイテレータにバインドされている場合にかぎります。
ADFバインディングを表に追加するには、データ・コントロール・パレットからデータ・コレクションをドラッグして、構造ウィンドウに表示される表タグにドロップします。データ・コントロール・パレットから構造ウィンドウへのアイテムのドロップに関する一般的なヒントは、21.3.1項「データ・コントロール・パレットを使用してADFバインディングを追加する方法」を参照してください。
ADFバインディングを表に追加する手順:
ビジュアル・エディタの「設計」ページにページを表示して、構造ウィンドウを開きます。
ビジュアル・エディタの「設計」ページで、表を選択します。
構造ウィンドウで選択したタグは、先の表21-1に示したタグのいずれかである必要があります。これにより、構造ウィンドウの対応するタグが同時に選択されます。誤ったタグが選択されている場合は、構造ウィンドウで調整します。たとえば、列タグが選択されている場合は、かわりに表タグを選択します。
データ・コントロール・パレットから構造ウィンドウにコレクションをドラッグし、選択した表タグにドロップします。
データ・コントロール・パレットのポップアップ・メニューで、「既存のバインド」→「ADF表」または「既存のバインド」→「ADF読取り専用表」を選択します。図21-4に示す「表の列の編集」ダイアログが表示されます。
ダイアログの「ラベルの表示」列には、表の作成時に入力されたプレースホルダの列ヘッダーが表示されます。この例では、プレースホルダの列ヘッダーは、First Name、Last Name、EmailおよびUser IDです。「値バインディング」列には、データ・コレクションの属性が表示されます。「使用するコンポーネント」列には、表の各列に含まれるコンポーネントのタイプが表示されます。
「表の列の編集」ダイアログで、「値バインディング」フィールドのドロップダウンを使用し、図21-5に示すように、表の各列にバインドされるデータ・コレクションの属性を選択します。表の作成時にプレースホルダの列ヘッダーが入力されている場合、属性を適切な列ヘッダーと一致させます。たとえば、列ヘッダーがFirst Nameの場合、その列ヘッダーの横の「値バインディング」ドロップダウンからfirstName
属性を選択します。
ヒント: さらに列を表に追加する必要がある場合は、「新規」をクリックします。 |
表の詳細は、第14章「表の追加」を参照してください。
例21-3に、ADFバインディングが追加される前の表を示します。この表は4つの列を定義し、静的プレースホルダ値(First Name
、Last Name
、Email
およびUser ID
)を列ヘッダーとして使用しています。また、15行のレンジ・ナビゲーション、表のバンディングおよびselectionファセットも定義しています。
例21-3 ADFバインディングが追加される前のADF Faces表
<af:table emptyText="No items were found" rows="15" banding="none" bandingInterval="1"> <f:facet name="selection"> <af:tableSelectOne/> </f:facet> <af:column sortable="false" headerText="First Name"> <af:outputText value="#{row.col1}"/> </af:column> <af:column sortable="false" headerText="Last Name"> <af:outputText value="#{row.col2}"/> </af:column> </af:table>
例21-4に、SRDemoデータ・コントロールからStaffList
データ・コレクションがドロップされた後の同じ表を示します。プレースホルダの列ヘッダーは静的な値であるため、StaffList
バインディング・オブジェクトのバインディングで置換されています。ただし、元の表からの選択ファセットおよびバンディングはそのまま残存しています。selectionState
およびselectionListener
属性がStaffList
バインディング・オブジェクトのバインディングとともに追加されています。
レンジ・ナビゲーションの値は、現在行を管理するイテレータのバインディングで置換されています。行数を定義するrangeSize
バインディング・プロパティは、ページ定義ファイルに設定できます。各バインディング・プロパティの詳細は、付録B「ADFバインディング・プロパティのリファレンス」を参照してください。
例21-4 ADFバインディングが追加された後のADF Faces表
<af:table emptyText="#{bindings.StaffList.viewable ? \'No rows yet.\' : \'Access Denied.\'}" value="#{bindings.StaffList.collectionModel}" var="row" bandingInterval="1" rows="#{bindings.StaffList.rangeSize}" first="#{bindings.StaffList.rangeStart}"> selectionState="#{bindings.StaffList.collectionModel. selectedRow}" selectionListener="#{bindings.StaffList.collectionModel. makeCurrent}"> <af:column sortable="false" headerText="#{bindings.StaffList.labels.UserId}" sortProperty="UserId"> <af:outputText value="#{row.UserId}"> <f:convertNumber groupingUsed="false" pattern="#{bindings.StaffList.formats.UserId}"/> </af:outputText> </af:column> <af:column sortable="false" headerText="#{bindings.StaffList.labels.UserRole}" sortProperty="UserRole"> <af:outputText value="#{row.UserRole}"/> </af:column> </af:table>
表にバインディングを追加する他に、データ・バインドされた表のエントリがページ定義ファイルに自動的に追加されます。ページ定義エントリには、executables
要素に定義されたイテレータ・バインディング・オブジェクトと、bindings
要素の表の値バインディングが含まれます。デフォルトでは、イテレータ・バインディングのRangeSize
プロパティは10に設定されます。この時点で、この値は表のレンジ・ナビゲーションにバインドされており、バインディングが追加される前の表に設定されていた元のレンジ・ナビゲーション値に優先します。この例では、元の表のレンジ・ナビゲーション値は15に設定されていました。必要に応じて、表に定義された元の値と一致するようにページ定義のRangeSize
値を変更できます。
データ・バインドされた表の詳細は、第14章「表の追加」を参照してください。
ADFバインディングは、ボタンまたはリンクに追加できます。バインディングをボタンまたはリンクに追加する場合、データ・コントロールのメソッドまたは操作を使用します。ユーザーがボタンまたはリンクをクリックすると、メソッドまたは操作が起動されます。
ボタンまたはリンクでページ・ナビゲーションを実行する場合、ADFバインディングの追加後に、ナビゲーションを処理するバッキングBeanにコンポーネント・タグのaction
属性をバインドする必要があります。バッキングBeanは、ADFバインディング・コンテナをインジェクトして、結果値を戻す必要があります。ナビゲーション・ルールの作成およびバッキングBeanへのナビゲーション・コンポーネントのバインドの詳細は、第16章「ページ・ナビゲーションの追加」を参照してください。
ADFバインディングをボタンまたはリンクに追加するには、データ・コントロール・パレットからメソッドまたは操作をドラッグして、構造ウィンドウに表示されるボタンまたはリンクのタグにドロップします。データ・コントロール・パレットから構造ウィンドウへのアイテムのドロップに関する一般的なヒントは、21.3.1項「データ・コントロール・パレットを使用してADFバインディングを追加する方法」を参照してください。
ADFバインディングをボタンまたはリンクに追加する手順:
ビジュアル・エディタの「設計」ページにページを表示して、構造ウィンドウを開きます。
ビジュアル・エディタの「設計」ページで、ボタンまたはリンクを選択します。
構造ウィンドウで選択したタグは、先の表21-1に示したタグのいずれかである必要があります。これにより、構造ウィンドウの対応するタグが同時に選択されます。誤ったタグが選択されている場合は、構造ウィンドウで調整します。
データ・コントロール・パレットから構造ウィンドウにメソッドまたは操作をドラッグし、選択したボタンまたはリンクのタグにドロップします。
データ・コントロール・パレットのポップアップ・メニューで、「既存のバインド」→「CommandButton」または「既存のバインド」→「CommandLink」を選択します。
メソッドにパラメータが必要な場合は、アクション・バインディング・エディタが表示され、メソッドに渡すパラメータ値を定義します。(パラメータをメソッドへ渡す方法の詳細は、第17章「より複雑なページの作成」を参照してください。)
例21-5に、ADFバインディングが追加される前のコマンド・ボタンを示します。
例21-6に、SRDemoデータ・コントロールからCreate
操作がドロップされた後の同じボタンを示します。元のラベルは静的値であるため、バインディングによりメソッド名で置き換えられています。ボタン・ラベルはプロパティ・インスペクタを使用して変更できます。actionListener
属性がCreate
操作のバインディングとともに追加されています。actionListener
は、ユーザーがボタンをクリックしたタイミングを検知し、その結果として操作を実行します。ボタンによって別のページにナビゲートさせる場合は、バッキングBeanにバインドするか、action
値を追加できます。詳細は、第16章「ページ・ナビゲーションの追加」を参照してください。
例21-6 ADFバインディングが追加された後のADF Facesコマンド・ボタン
<af:commandButton text="Create" actionListener="#{bindings.Create.execute}" disabled="#{!bindings.Create.enabled}"/>
ボタンにバインディングを追加する他に、イテレータおよびアクション・バインディング・オブジェクトがページ定義ファイルに自動的に追加されます。
データ・バインドされたボタンおよびリンクの詳細は、第13章「基本的なページの作成」を参照してください。
ADFバインディングは、先の表21-1に示した選択リストのいずれかに追加できます。データ・バインドされた選択リストは、データ・コントロール・コレクションまたは静的リストの値を表示し、ユーザーの選択に基づいて別のコレクションの属性またはメソッド・パラメータを更新します。リストにバインディングを追加する場合は、リストで選択された値が移入されるデータ・コントロールの属性を使用します。
ADFバインディングを選択リストに追加するには、データ・コントロール・パレットから属性をドラッグして、構造ウィンドウに表示される選択リスト・タグにドロップします。データ・コントロール・パレットから構造ウィンドウへのアイテムのドロップに関する一般的なヒントは、21.3.1項「データ・コントロール・パレットを使用してADFバインディングを追加する方法」を参照してください。
ADFバインディングを選択リスト・コンポーネントに追加する手順:
ビジュアル・エディタの「設計」ページにページを表示して、構造ウィンドウを開きます。
ビジュアル・エディタの「設計」ページで、選択リスト・コンポーネントを選択します。
構造ウィンドウで選択したタグは、先の表21-1に示したタグのいずれかである必要があります。これにより、構造ウィンドウの対応するタグが同時に選択されます。誤ったタグが選択されている場合は、構造ウィンドウで調整します。
データ・コントロール・パレットから構造ウィンドウに属性をドラッグし、選択した選択リスト・タグにドロップします。ユーザーがリストからアイテムを選択したときに値が移入されるデータ・コレクションの属性を使用します。
データ・コントロール・パレットのポップアップ・メニューで、「既存のバインド」→「<component name>」を選択します。
リスト・バインディング・エディタで、リストによって更新されるデータ・コレクション(ベース・データソース)、リストに移入されるデータ・コレクション(リスト・データソース)およびリストに表示される属性を定義します。リスト・バインディング・エディタを使用したリストの定義の詳細は、19.7項「選択リストの作成」を参照してください。
例21-7に、ADFバインディングが追加される前の単一選択ドロップダウン・リストを示します。このコンポーネントはリストのラベルを定義し、静的リスト・アイテムのラベルおよび値を定義していません。アイテムのラベルおよび値は、バインディングによって移入されます。
例21-8に、SRDemoデータ・コントロールからServiceRequests
コレクションのProdID
属性がドロップされた後の同じリストを表示します。元のリスト・ラベルは静的な値であったため、バインディングにより、ServiceRequestsProdId
属性のバインディングで置換されています。この属性は、データ・コントロール・パレットからドラッグされドロップダウン・リスト・コンポーネントにドロップされた属性です。ラベルは、コントロール・ヒントを使用して変更できます。リストの値も、同じ属性にバインドされています。表示値または表示ラベルが、バインディングによってこのコンポーネントに定義されていないことに注意してください。かわりに、表示値はページ定義ファイルに定義されます。
ヒント: 元の選択リストに定義された静的アイテムのラベルおよび値は、ADFバインディングによって置換されません。静的アイテムのラベルおよび値を元の選択リストに追加した後、データ・コレクションのバインディングとともに動的リストを追加すると、そのリストには、バインディングによって移入される値とコンポーネント自体に定義された静的値の両方が表示されます。ほとんどの場合、このような表示は必要ありません。そのため、静的アイテムのラベルおよび値を使用せずに初期コンポーネントを設計するか、バインディングの追加後にそれらを削除します。 |
例21-8 ADFバインディングが追加された後のADF Faces単一選択ドロップダウン
<af:selectOneChoice value="#{bindings.ServiceRequestsProdId.inputValue}" label="#{bindings.ServiceRequestsProdId.label}"> <f:selectItems value="#{bindings.ServiceRequestsProdId.items}"/> </af:selectOneChoice>
リストにバインディングを追加する他に、リストの複数のバインディング・オブジェクトがページ定義ファイルに自動的に追加されます。executables
要素は、リストにデータを移入するコレクションのイテレータ・バインディングと、ターゲット・コレクションのイテレータ・バインディングを定義します。
bindings
要素には、リスト・バインディング・オブジェクト定義が含まれます。ListDisplayAttrNames
要素は、ユーザーに表示される値をリストに移入するデータ・コレクション属性を定義するものであり、リストが動的リストの場合のみ追加されます。動的リストでは、リスト項目はデータ・コレクションのバインディングによって移入されます。リストが静的リストの場合は、かわりにValueList
要素がリストに表示される静的値とともに追加されます。
データ・バインドされたリストの詳細は、19.7項「選択リストの作成」を参照してください。
ADFバインディングは、ADF Facesのツリー・コンポーネントおよびツリー表コンポーネントに追加できます。ADF Facesツリー・コンポーネントは、マスター/ディテール関係のデータ・コレクションの階層をツリー形式で表示します。データ・バインドされたADF Facesツリーには、マスター・データ・コレクションのバインディングによって移入される複数のルート・ノードが表示されます。ツリーの各ノードには多くのブランチがあり、ブランチはディテール・データ・コレクションのバインディングによって移入されます。ツリー内の各ノードは、階層でのノードのレベルを示します。ADFツリー・コンポーネントには、ツリーを開いたり閉じたりするメカニズムが含まれています。デフォルトでは、ツリーの各ノードのアイコンはフォルダですが、独自のアイコンを階層内の各レベルのノードに使用できます。ADF Facesツリー表コンポーネントは、マスター/ディテール・コレクションの階層を表で表示します。マスター/ディテール関係およびツリーの詳細は、第15章「マスター/ディテール・データの表示」を参照してください。
ADFバインディングをツリーまたはツリー表に追加するには、データ・コントロール・パレットからマスター・データ・コレクションをドラッグして、構造ウィンドウに表示されるツリー・タグにドロップします。データ・コントロール・パレットから構造ウィンドウへのアイテムのドロップに関する一般的なヒントは、21.3.1項「データ・コントロール・パレットを使用してADFバインディングを追加する方法」を参照してください。
ADFバインディングをツリー・コンポーネントに追加する手順:
ビジュアル・エディタの「設計」ページにページを表示して、構造ウィンドウを開きます。
ビジュアル・エディタの「設計」ページで、tree
タグを選択します。
これにより、構造ウィンドウの対応するタグが同時に選択されます。誤ったタグが選択されている場合は、構造ウィンドウで調整します。
データ・コントロール・パレットから構造ウィンドウにデータ・コレクションをドラッグし、選択したツリー・タグにドロップします。選択したデータ・コレクションは、ツリーのルート・ノードに移入されるマスター・コレクションである必要があります。
ツリー・バインディング・エディタを使用して、ツリーのルート・ノードおよびブランチ・ノードを定義します。詳細は、15.4項「ツリーを使用したマスター/ディテール・オブジェクトの表示」を参照してください。
例21-9に、ADFバインディングが追加される前のツリーを示します。value
属性はルート・ノードをusers
と指定し、var
属性は最初のブランチをservice requests
と指定しています。
例21-9 ADFバインディングが追加される前のADF Facesツリー
<af:tree value="users" var="service requests"> <f:facet name="nodeStamp"> <h:outputText/> </f:facet> </af:tree>
例21-10に、SRDemoデータ・コントロールからLoggedInUser
データ・コレクションがドロップされた後の同じツリーを示します。LoggedInUser
データ・コレクションはルート・ノードに移入し、ServiceRequestsByStatus
コレクションはルート・ノードのブランチとして定義されていました。バインディングにより、value
属性はLoggedInUser
バインディング・オブジェクトのバインディングで置換されています。この時点で、var
属性には値node
が含まれ、現在ノードにアクセスできます。ノード自体は、ページ定義ファイルに定義されます。
例21-10 ADFバインディングが追加された後のADF Facesツリー
<af:tree value="#{bindings.LoggedInUser.treeModel}" var="node"> <f:facet name="nodeStamp"> <af:outputText value="#{node}"/> </f:facet> </af:tree>
ツリーにバインディングを追加する他に、ツリーの複数のバインディング・オブジェクトがページ定義ファイルに自動的に追加されます。executables
要素は、ルート・ノードにデータを移入するコレクションのイテレータ・バインディングを定義します。
bindings
要素には、ツリー・バインディング・オブジェクト定義が含まれます。AttrNames
要素は、コレクションで使用可能なすべての属性をリストしますが、ツリーに表示されるのはnodeDefinition
要素の属性のみです。Accesssors
要素は、ノードのブランチに移入するデータの取得に使用されるビュー・リンク・アクセッサ・メソッドを定義します。
ツリーおよびツリー表の詳細は、第15章「マスター/ディテール・データの表示」を参照してください。