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