Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.2.1.3.0) E90376-03 |
|
前 |
次 |
この章の内容は次のとおりです。
ADF Facesは、ユーザーが1つまたは複数の値を選択できるオブジェクトのリストを表示できる選択リストおよびシャトル・コンポーネントを提供します。値リスト(LOV)コンポーネント、ナビゲーション・リスト・バインディングまたはselectManyShuttle
コンポーネントを使用して、複数のアイテムがあるリストを作成します。
選択リスト・コンポーネントにより、入力値として使用される選択項目のリストが表示されます。この選択リストは、モデルドリブンのリスト、固定リストから取得されるリスト、または実行時に動的に作成されるリストのいずれかです。選択リストのコンポーネントは、リスト、ラジオ・ボタン、チェック・ボックスおよびリスト・ボックスとしてレンダリングできます。一部の選択タイプは、単一選択(1つ選択)または複数選択(2つ以上選択)のどちらにも設定できます。
選択リストおよびシャトルは、標準的なJSFリスト・コンポーネントと同様に機能します。ただし、ADF Facesのリスト・コンポーネントには追加の機能(ラベルとメッセージの表示、自動フォーム送信、部分ページ・レンダリングのサポートなど)が備わっています。リストを提示することにより、ユーザーには使用可能な選択項目が容易にわかるため、すぐに選択を実行できます。また、リストから選択することにより、起こり得る入力エラーを防ぐこともできます。
値リスト(LOV)コンポーネントはUIコンポーネントで、これによりユーザーは問合せにより生成されたリストから値を選択して入力できます。LOVは、通常、検索機能を備えたモーダル・ポップアップ・ダイアログ内に表示されます。たとえば、af:inputListOfValues
、af:inputComboboxListOfValues
およびaf:inputSearch
コンポーネントは、LOVモーダル・ダイアログ内の検索フィールドや複数の表の列に基づいた問合せなど、選択リストでは使用できない追加機能を提供します。「ポップアップ値リストの作成方法」および『Oracle ADF FacesによるWebユーザー・インタフェースの開発』を参照してください。
値リスト・コンポーネントでは、問合せコンポーネントを使用してポップアップ検索パネルと結果表を作成することにより、より複雑な検索および入力機能を実現しています。この問合せコンポーネントには、追加機能として、自動提案、スマート・リスト・フィルタリングおよびカスタム・ファセットなどの機能も備わっています。
ユーザーがナビゲーション・リストから項目を選択すると、リストにバインドされた対応するコンポーネントでも、選択に応じて値が変更されます。たとえば、ユーザーがショッピング・リストから商品を選択すると、商品リストにバインドされている表が更新され、選択した商品の詳細が表示されます。
ユーザーはシャトルを使用して、利用可能なリストにある利用可能なアイテムと、選択されたリストにある選択されたアイテムを簡単に確認し、これらのアイテムを2つのリスト間ですばやくやりとりすることができます。
シャトルは、利用可能なリストからアイテムを選択すると同時に、選択したアイテムを確認する視覚的な方法を提供します。ADF Facesに用意されているselectManyShuttle
コンポーネントとselectOrderShuttle
コンポーネントを使用すると、選択したリストの並替えを実行できます。どちらのコンポーネントも、マネージドBeanにコードを追加してリストに移入することによって実装できます。
リストが比較的小さく、単一値選択を入力に使用する状況では、selectOneChoice
などの選択リスト・コンポーネントを使用できます。たとえば、製品の色をリストから選択したり、使用するクレジット・カードの種類を選択する場合にselectOneChoice
を使用できます。
より大きなリストと、さらに複雑なフィルタリング機能を使用する場合は、af:inputListOfValues
またはaf:inputComboboxListOfValues
コンポーネントを使用します。これらのコンポーネントでは、問合せコンポーネントを使用してトランザクション検索を実行することにより、リストに移入します。たとえば、af:inputComboboxListOfValues
を使用して、アドレス入力ページの国名リストから選択できます。
ユーザーがアイテム・リストをアセンブルし、アイテムの選択および選択解除をできるようにするには、selectShuttleコンポーネントを使用します。アイテム数が多いものの表示できないほどではない場合に、シャトル・コンポーネントを使用します。ユーザーは、選択内容を確認したり、最終選択に落ち着くまでアイテムの選択と解除を繰り返すことができます。たとえば、特定の自動車に選択できるオプションについての使用可能リストがあると、ユーザーは希望するオプションを選択済リストに移動できるようになります。
ADFモデル・レイヤーを構成または使用する前に、他のADF機能を理解しておくと役立つ場合があります。また、モデル・レイヤーの構成によって可能になることについても、確認しておくことをお薦めします。次に、関連する他の機能へのリンクを示します。
検索フォームとaf:query
コンポーネントとともにLOVコンポーネントを使用する方法の詳細は、「値リスト(LOV)入力フィールド」を参照してください。
LOVは、独立したデータ・コントロールを使用するタスク・フローで使用できます。共有のデータ・コントロールおよび独立したデータ・コントロールの詳細は、「タスク・フロー間のデータ・コントロールの共有」を参照してください。
LOVは、名前付きビュー基準に関連付けられています。ビュー基準の設定の詳細は、「名前付きビュー基準を宣言的に作成する方法」を参照してください。
LOVコンポーネントはaf:query
コンポーネントを使用して選択リストに移入します。af:query
コンポーネントの詳細は、「ADFによるデータバインドされた検索フォームの作成」を参照してください。
ADF Facesは、ユーザーが値を選択でき、オプションで必要なアイテムを検索できるオブジェクトのモデルドリブン・リストを表示できる値リスト(LOV)コンポーネントを提供します。af:inputListOfValues
、af:inputSearch
またはaf:inputComboboxListOfValues
コンポーネントを使用して、LOVを作成します。
LOVコンポーネントは、問合せにより生成されたリストからユーザーが値を選択して入力できる、入力コンポーネントです。ADF Facesには、af:inputListOfValues
およびaf:inputComboboxListOfValues
コンポーネントが用意されています。フル機能のLOVコンポーネントを作成する場合は、「ビュー・オブジェクト属性の値リスト(LOV)での作業」で説明するように、ビュー・オブジェクトにLOVを定義する必要があります。
検索フォームの一部に依存LOVを使用する場合は、必ず、af:query
コンポーネントとともに使用してください。検索フォームでのLOVコンポーネントの使用の詳細は、「値リスト(LOV)入力フィールド」を参照してください。
図35-1に示すように、af:inputListOfValues
コンポーネントには、検索基準フィールドの横に検索アイコンがあります。
図35-1 inputListOfValuesとして定義された検索基準入力フィールド
図35-2のState
属性で示すように、af:inputComboboxListOfValues
コンポーネントではフィールドの横にドロップダウン・アイコンが表示されます。
図35-2 inputComboboxListOfValuesとして定義された検索基準入力フィールド
af:inputComboboxListOfValues
の場合、ドロップダウン・アイコンをクリックすると、図35-3に示すように、LOVドロップダウン・リストと「詳細」または「検索」リンクが表示されます。「検索」リンクは、LOV検索および選択ポップアップ・ダイアログに検索を絞込むための検索パネルが含まれている場合に表示されます。「詳細」リンクは、ポップアップ・ダイアログに値リストの表のみが含まれている場合、またはスマート・リストが使用されている場合に表示されます。
図35-3 inputComboboxListOfValuesの「検索」リンクがあるLOVドロップダウン・リスト
ユーザーは、ドロップダウン・リスト内の任意の項目を選択し、入力フィールドに移入できます。このドロップダウン・リストには、フィルタされた値リスト、および必要に応じて、最後に使用されたアイテムのリストが含まれます。このドロップダウン・リストに含まれる各属性の幅は、ビュー・オブジェクト定義で、その属性に対するDisplayWidth UIヒントを使用して設定します。ドロップダウン・リストの幅は、このリストに含まれる属性すべての幅の合計になります。
ユーザーは、フィールドに値を入力することもできます。ユーザーが入力したデータのデータ型とnputComboboxListOfValues
に定義されているデータ型が異なる場合は、変換エラーがスローされます。たとえば、NUMBER
データ型のinputComboboxListOfValues
に、ユーザーが英数文字列を入力すると、変換エラーが発生します。
「検索および選択」ダイアログでは、searchContent
ファセットを使用して、レンダリングされるカスタム・コンテンツを作成できます。入力テキスト、tables
およびtrees
などのコンポーネントを追加して、カスタム・コンテンツを表示できます。returnPopupDataValue
属性を定義し、returnPopupListener
を実装する必要があります。カスタム・ポップアップにオートコンプリート機能を追加する場合は、launchPopupEvent.setLaunchPopup(false)
をLaunchPopupListener()
コードに追加してポップアップを無効にできます。ただし、「検索」リンクをクリックすると、それでもなお「検索および選択」ダイアログが起動します。カスタム・コンテンツの追加の詳細は、「値リスト・コンポーネントの使用方法」を参照してください。
resultsTable
ファセットは、「検索および選択」ダイアログの結果表が空のときに、カスタム・メッセージを表示するために使用します。
このコンポーネントのreadOnly
属性がtrueに設定されている場合、入力フィールドはレンダリングされず、値の変更はできません。デフォルトでは、readOnly
属性はfalse
に設定されています。これにより、editMode
属性も有効化され、ユーザーはリストから値の選択のみを許可されているか(editMode
にselect
を設定)、入力フィールドに値を入力することもできるのか(editMode
にinput
を設定)が決定されます。
また、ユーザーが値の一部を入力したときに、選択可能な推奨項目のリストを表示するように、LOVコンポーネントを設定することもできます。たとえば、ユーザーがCA
と入力したときに、CA
と部分的に一致する推奨リストが、推奨項目リストとして表示されます。ユーザーはこのリストから、入力フィールドに入力する項目を選択できます。一致するものがない場合は、「結果が見つかりません。」メッセージが表示されます。「コンポーネント」ウィンドウからLOVにaf:autoSuggestBehavior
タグを追加してから、ADFモデルで実装したsuggestedItems
メソッドにselectedItem
属性を設定します。
自動提案動作は、リクエスト値の適用フェーズ中に行われることに注意してください。immediate
プロパティがtrue
に設定されていると、これと同じフェーズで検証が実行されます。検証エラーが発生すると、提案リストは表示されなくなります。自動提案動作を追加する場合は、immediate
にtrue
を設定しないでください。
LOV属性が一意でなく、同じ値のエントリが複数ある場合、自動提案ではリストの値が1つのみ表示されます。自動提案選択リストにすべての重複値を表示するには、一意の外部キーを持つ属性をLOV属性として選択する必要があります。inputListOfValues
またはinputComboboxListOfValues
コンポーネントの内部にf:converter binding
タグを追加することで、より読みやすい属性をLOV定義の表示属性として選択できます。表示属性値は、入力フィールドおよび自動提案リストに表示されます。
f:converter binding = "#{bindings.LOV_ATTR.converter
}"
たとえば、研究部門に部門番号の異なる複数のエントリがあり、DeptName
属性をLOVとして定義した場合、自動提案リストには研究の部門エントリが1つのみ表示されます。かわりに、Deptno
は一意の外部キーであるため、Deptno
をLOV属性として定義できます。自動提案には、研究部門のすべてのエントリがリストされます。ただし、LOV表示を読みやすくするには、次の例に示すように、DeptName
を表示属性として定義し、f:converter binding
タグを使用して、レンダリングされる選択フィールドにDeptName
をDeptno
のかわりに表示します。
<af:inputComboboxListOfValues id="deptnoId" popupTitle="Search and Select: #{bindings.Deptno.hints.label}" value="#{bindings.Deptno.inputValue}" label="#{bindings.Deptno.hints.label}" model="#{bindings.Deptno.listOfValuesModel}" required="#{bindings.Deptno.hints.mandatory}" columns="#{bindings.Deptno.hints.displayWidth}" shortDesc="#{bindings.Deptno.hints.tooltip}"> <f:validator binding="#{bindings.Deptno.validator}"/> <f:converter binding="#{bindings.Deptno.converter}"/> <af:autoSuggestBehavior suggestItems="#{bindings.Deptno.suggestItems}"/> </af:inputComboboxListOfValues>
LOVではユーザーに対して部門名が表示されますが、モデルと対話する場合は一意の部門番号が使用されます。
ユーザーが「検索」または「詳細」リンク(または、af:inputListOfValues
では「検索」アイコン)をクリックすると、LOVの「検索および選択」ダイアログにすべての値のリストが表形式で表示されます。図35-4は、「詳細」リンクから起動されたLOV検索および選択ダイアログです。
図35-4 LOV検索および選択ダイアログ
ユーザーがLOVに部分文字列を入力して、「検索」をクリックするかタブ・アウトすると、その部分文字列が検索フィールドに表示された状態で「検索および選択」ダイアログが開き、一致する値の結果リストが表に表示されます。ユーザーは、このリストからLOV値にするエントリを選択できます。
LOV検索および選択ダイアログは、ユーザーが新しい行を追加できるようにするための作成機能を持っています。LOV検索および選択ダイアログを使用して新しいレコードを作成している場合、LOVの「自動的に問合せ」コントロールのヒントがfalse
に設定されていると、新しい行は空白行として表に現れますので注意してください。行のコンテンツは、「検索」ボタンを使用して問合せを実行したときに表示されます。次の例は、リンクを使用して作成機能を起動するコード・サンプルを示しています。
<f:facet name="customActions"> <af:link id="createLink" text="Create..." partialSubmit="true"> <af:showPopupBehavior popupId="createSLPopup" alignId="createLink"/> </af:link> </f:facet>
LOVが独立したデータ・コントロールを使用するタスク・フローの一部で、ユーザーが新しいレコードの追加に作成機能を使用した場合、新たに追加されたレコードは親ページには表示されません。これは、検索リージョンも独立したデータ・コントロール・スコープを使用しているため、基礎となるビュー・オブジェクトの更新が表示されないからです。共有のデータ・コントロールおよび独立したデータ・コントロールの詳細は、「タスク・フロー間のデータ・コントロールの共有」を参照してください。
プログラム的にLOVをリフレッシュし、ビュー・オブジェクトの更新を表示するには、次の例に類似するコードとともに、returnListener
をCreateリンクに追加します。
public void refreshLOV() { BindingContainer bindings = this.getBindings(); oracle.jbo.uicli.binding.JUCtrlListBinding lovBinding = (oracle.jbo.uicli.binding.JUCtrlListBinding) bindings.get("Description1"); JUIteratorBinding lovIter = lovBinding.getIteratorBinding(); RowSet rs = lovIter.getRowSetIterator().getRowSet(); rs.executeQuery(); //Add LOV as the partialTrigger AdfFacesContext.getCurrentInstance().addPartialTarget(this.getPlatformDesc());
LOVは、ビュー・アクセッサ経由でデータ・ソースと関連付けられます。LOVに関連付けられているビュー・アクセッサには、1つ以上のビュー・クライテリアを適用できます。ビュー・アクセッサは、LOVデータ・ソースに永久フィルタを提供します。この永久フィルタのほかにもフィルタを適用できる可能性があります。
LOVダイアログには、ユーザーが値リストの検索に使用する基準を入力するための問合せパネルが含まれる場合も、また結果表が含まれる場合もあります。LOVをビュー・オブジェクトに定義するときに、UIヒントを使用して、リージョンを表示するかどうか、値リストを移入するための検索としてビュー基準を使用するかどうか、またどのLOVコンポーネントを使用するかを指定できます。図35-5に、「値リストの作成」ダイアログとそのオプションの一部を示します。この例では、検索リージョンは、問合せに使用したAll Queryable Attributes
名前付きビュー基準とaf:inputComboboxListOfValues
により、コンポーネントとして使用可能になります。af:inputComboboxListOfValues
の便利なオプションには、「コンボ・ボックスに表示」オプションもあります。これは、ドロップダウン・リストと「検索および選択」ダイアログに表示される多数の属性を選択できるようにするものです。LOV UIヒントの詳細は、「ビュー・オブジェクトのLOV有効属性にユーザー・インタフェース・ヒントを設定する方法」を参照してください。
af:inputListOfValues
およびaf:inputComboboxListOfValues
の両方について、ユーザーが入力検索フィールドに部分一致を入力し、[Tab]または[Enter]キーを押した場合、LOVは自動的にLOV検索および選択ダイアログを起動し、ユーザーが入力した部分一致の値を表す項目を1つ使って自動生成されたビュー基準の適用後に問合せを実行します。一致するものがある場合、LOV検索および選択ダイアログには部分一致基準を満たすエントリがすべて表示されます。入力された部分一致条件を満たすエントリがない場合、ダイアログにはすべてのエントリが表示されます。
デフォルトでは、af:inputComboboxListOfValues
コンポーネントでオートコンプリート機能を使用した検索では、大/小文字を区別します。検索で大/小文字を区別しない場合は、そのLOV属性に関連付けたビュー基準を作成します。「ビュー基準の作成」ダイアログで、該当のビュー基準の「大/小文字を区別しない」チェック・ボックスの選択を解除してから、LOV定義にそのビュー基準を適用します。ビュー基準の設定の詳細は、「名前付きビュー基準を宣言的に作成する方法」を参照してください。
また、ユーザーが値の一部を入力したときに、選択可能な推奨項目のリストを表示するように、LOVコンポーネントを設定することもできます。たとえば、ユーザーがCa
と入力すると、部分的にCA
と一致する推奨リストが、推奨項目リストとして表示されます。ユーザーはこのリストから、入力フィールドに入力する項目を選択できます。この自動提案動作機能を追加するには、「コンポーネント」ウィンドウからLOVにaf:autoSuggestBehavior
タグを組み込み、ADFモデルに実装されたsuggestedItems
メソッドにselectedItem
属性を設定します。
LOVがaf:inputComboboxListOfValues
である場合は、追加のビュー基準を適用して、ドロップダウン・リストの値をさらにフィルタ処理し、スマート・リストを作成できます。「コンボ・ボックスのフィルタ基準」UIヒントが適用されていない場合、ドロップダウン・リストは、ビュー・アクセッサに適用されたビュー基準によりフィルタされます。ただし、このスマート・リスト・フィルタはドロップダウン・リストにのみ適用されます。このリスト全体は、引き続き、検証、およびLOV検索および選択ポップアップ・ダイアログからの検索に用いられます。スマート・リストを有効化すると、LOVの「検索および選択」ダイアログには、「検索」リンクのかわりに「詳細」リンクが表示されるようになります。
LOVで自動提案動作とスマート・リスト・フィルタの両方が有効化されている場合、自動提案では、スマート・リストから検索を開始します。ユーザーがクリックせずに2秒間待機した場合、自動提案では、完全リストの検索も実行して結果を追加します。また、返される推奨項目の数を指定するには、maxSuggestedItems
属性を設定します(-1を指定すると、全リストが返されます)。maxSuggestedItems > 0
の場合、「詳細」リンクがレンダリングされます。ユーザーがこのリンクをクリックすると、LOV検索および選択ダイアログが表示されます。次の例は、自動提案動作とスマート・リストの両方を備えたLOVのコードを示しています。
af:autoSuggestBehavior suggestItems="#{bindings.CountryName.suggestItems}" smartList="#{bindings.CountryName.smartList}"/> maxSuggestedItems="5"
ビュー・オブジェクトで、1つの属性に1つ以上のLOVを定義できます。1つの属性に複数のLOVを定義した場合、LOVごとに、独自の名前、ビュー・アクセッサ、データ・マッピング、バリデータ、およびUIヒントが設定されます(ただし、デフォルトのリスト・タイプ・ヒントは例外で、属性に対して一度だけ定義されます)。実行時に使用するLOVを切り替えるには、LOV切替え機能が使用されます。LOV切替え機能は、タイプがString
の既存の属性を基礎にすることもできますし、LOV間での切替えのためにのみ、新たなString
属性として作成することもできます。LOV切替え機能は、実行時に使用されるLOV名を返します。たとえば、price属性に対して3種類のLOVを作成し、LOV切替え機能としてCountryName
属性を指定できます。実行時には、CountryName
の値により、price属性が切り替えられ、その国の価格と通貨を反映したLOVが使用されるようになります。
ある属性がLOVとして定義されている場合、そのビュー基準で「複数の値の選択をサポート」コントロールのヒントを設定し、ユーザーが検索基準フィールドで複数選択できるようにすることができます。LOV属性で複数選択が有効になっているときに、Equal to
またはNot equal to
演算子を選択した場合、selectManyChoice
コンポーネントが問合せパネルにレンダリングされます。ユーザーは検索基準として複数の項目を選択できます。
LOVの値が別のLOVの値に依存している場合、この2つのLOVはカスケードLOVと呼ばれます。たとえば、City LOVの値リストは、CountryName LOVで選択された値に応じて変化します。LOVが名前付きバインド変数として定義されている、または検証が有効化されている場合、名前付きバインド変数でNull値が使用できるかどうかなどの条件に応じて、LOV問合せの動作が変わる可能性があります。バインド変数がNullの場合、LOV問合せに空リストが返されるようにすることもできます。ビュー基準のNull値の無視および検証オプションを使用して、LOV問合せの動作を定義できます。
ビュー・オブジェクトにバインド変数を持つLOVがある場合、ビュー・オブジェクトのバインド変数のコントロールのヒントを非表示に設定する必要があります。設定しなかった場合、このバインド変数はLOV検索および選択ポップアップ・ダイアログに表示されます。ビュー・オブジェクトの概要エディタにある「問合せ」タブで、バインド変数をダブルクリックし、「コントロール・ヒント」タブをクリックして、「ヒントの表示」ドロップダウン・リストから「非表示」を選択します。
注意:
値リストは、有効な値のみを返すように設計されています。そのため、データ・ソース・ビュー・オブジェクトの属性に対して定義された検証規則は適用されなくなります。返される値リストには有効な値のみが含まれていることを確認してください。「値リストおよび属性検証規則に関する必知事項」を参照してください。
ベスト・プラクティス:
「検索モード」イテレータを使用して手動で作成した検索では、LOVとして有効化された属性を検索基準として使用してはいけません。この方法で検索フォームを作成すると、SQL例外、java.sql.SQLException: Attempt to set a parameter name that does not occur in the SQL
が発生します。検索フォームを作成するには、「問合せ」コンポーネントおよび「クイック問合せ」コンポーネントを使用するのが一番です。詳細は、「ADFによるデータバインドされた検索フォームの作成」を参照してください。
ビュー・オブジェクトのキー属性が数値である場合に名前属性のLOVリストを表示するには、LOVが有効な属性にサプリメンタル属性をマッピングする必要があります。たとえば、支払いオプションのID値のかわりに、名前別にクレジット・カードのリストを表示するには、名前参照属性にLOVを作成し、主キー属性をLOVのサプリメンタル属性として定義します。LOVが有効な参照属性の作成の詳細は、「LOVを定義して参照属性を表示する方法」を参照してください。
注意:
af:inputListOfValues
およびaf:inputComboboxListOfValues
は、「検索および選択」ダイアログから返される値リストが有効であることを想定しています。ADFビジネス・コンポーネントの検証エラーは表示されません。
様々な使用方法のシナリオと、その他のビュー基準オプションの詳細は、「名前付きビュー基準を宣言的に作成する方法」および「ビュー基準のバインド変数に関する必知事項」を参照してください。
LOVの作成には、af:inputListOfValues
コンポーネントまたはaf:inputComboboxListOfValues
コンポーネントを使用できます。これらのコンポーネントに自動提案動作を追加して、ユーザーの入力から、一致する可能性のある項目のリストを表示できます。
始める前に:
LOVの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「値リスト(LOV)のコンポーネントの作成」を参照してください。
LOVと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。
次のタスクを完了する必要があります。
LOVを作成するには:
「データ・コントロール」パネルから属性をドラッグ・アンド・ドロップすると、JDeveloperによって様々な処理が自動的に行われます。「データ・コントロール」パネルの使用時に実行される処理と作成される内容の詳細は、「テキスト・フィールドの作成時の処理」を参照してください。
LOVとして定義された属性を「データ・コントロール」パネルからドラッグし、inputListOfValues
またはinputComboboxListOfValues
コンポーネントとしてJSFページにドロップすると、JDeveloperにより、次の例に類似したコードがこのページに追加されます。CustomerVO
ビュー・オブジェクトのState
属性は、LOVとして定義されていて、そのデフォルト・コンポーネントはinputComboboxListOfValues
になるように設定されています。このコンポーネントは、ビュー・オブジェクトで宣言的に定義されたコントロールのヒントからプロパティを取得します。自動提案動作を組み込む場合は、「コンポーネント」ウィンドウから手動でタグを追加する必要があります。
<af:inputComboboxListOfValues id="stateId" popupTitle="Search and Select: #{bindings.State.hints.label}" value="#{bindings.State.inputValue}" label="#{bindings.State.hints.label}" model="#{bindings.State.listOfValuesModel}" required="#{bindings.State.hints.mandatory}" columns="#{bindings.State.hints.displayWidth}" shortDesc="#{bindings.State.hints.tooltip}"> <f:validator binding="#{bindings.State.validator}"/> </af:inputComboboxListOfValues>
ページ定義ファイルに、次の例に示すようなコードが、JDeveloperによって追加されます。ページ定義のバインディング・セクションでは、LOVがState
属性用であることと、LOVの名前がLOV_State
であることを指定します。JDeveloperは、イテレータ・バインディング・オブジェクトの定義をexecutables
要素に、値リストのバインディング・オブジェクトをbindings
要素に追加します。
<executables> <variableIterator id="variables"/> <iterator Binds="Customers" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="CustomersIterator"/> </executables> <bindings> <listOfValues StaticList="false" IterBinding="CustomersIterator" Uses="LOV_State" id="State"/> </bindings>
ページ定義ファイルおよびADFデータ・バインディング式の詳細は、「ページ定義ファイルの処理」および「ADFデータ・バインディングのEL式の作成」を参照してください。
ビュー・オブジェクトの属性を値リストの属性として定義する場合は、リスト検証規則が同一のリストに基づいているかぎり、基礎となるエンティティ・オブジェクトで相当するリスト検証規則を定義できます。ビュー・オブジェクトの値リストとしてすでに定義されている属性のエンティティ・オブジェクトには、その他のタイプの検証規則を定義しないでください。これにより、予期せぬ動作が発生し、検証エラーになる可能性があります。検証ルールの定義の詳細は、図11-3および「組込みの宣言的な検証規則の使用」を参照してください。
ビュー・オブジェクト・リストのデータソースを使用してinputComboboxListOfValues
コンポーネントを作成し、かつ、そのリストを実行時に変更できるために、リスト・アイテムが削除される可能性がある場合は、NULL値をサポートするために、LOV属性に対してカスタム・プロパティdisplayMode
を定義する必要があります。デフォルトでは、使用できる表示値がない場合、inputComboboxListOfValues
コンポーネントには、LOV属性によって定義されているリスト属性の値が表示されます。削除された表示属性値が対応する属性リスト値に置き換えられないようにするには、LOV表示属性の名前を値とするカスタム・プロパティdisplayMode
を定義します。たとえば、図35-6は、LOV表示属性のName
を値としてカスタム・プロパティを定義する、LOV属性DeptId
を示しています。実行時に、使用可能な部門のリストから1つの部門名を削除した場合は、削除した名前を入力すると、カスタム・プロパティにより一致なしが返されます。
図35-6 カスタム・プロパティdisplayModeが定義されたビュー・オブジェクトのLOV属性
ADF Facesには、単純なブール・ラジオ・ボタンから、ユーザーが複数の項目を選択できるリスト・ボックスまで、様々な選択コンポーネントがあります。様々なプロシージャを使用して、モデルドリブン選択リスト、固定選択リストまたは動的選択リストを作成できます。
ADF Faces Coreには、リストから単一値および複数値を選択するコンポーネントが含まれています。たとえば、selectOneChoice
を使用するとドロップダウン・リストから項目を1つ選択でき、selectManyChoice
を使用するとチェック・ボックスのリストから項目を複数選択できます。表35-1に、選択リストの説明を示します。
表35-1 ADF Facesの単一選択および複数選択リスト・コンポーネント
ADF Facesコンポーネント | 説明 | 例 |
---|---|---|
|
項目のリストから単一値を選択します。 |
|
|
ラジオ・ボタンのセットから単一値を選択します。 |
|
|
スクロール可能な項目のリストから単一値を選択します。 |
|
|
スクロール可能なチェック・ボックスのリストから複数値を選択します。リストの最上位に、選択した項目の名前が表示されます。 |
|
|
チェック・ボックスのグループから複数値を選択します。 |
|
|
スクロール可能なチェック・ボックスのリストから複数値を選択します。 |
SelectOneChoice
ADF Facesコンポーネントを使用して、選択リストを作成できます。作成の手順は、SelectOneRadio
やSelectOneListbox
のような他の単一値選択リストを作成する場合でも同様です。
データバインドされた選択リストは、データ・コントロール・コレクションまたは静的リストの値を表示し、ユーザーの選択に基づいて別のコレクションの属性またはメソッド・パラメータを更新します。リストにバインディングを追加する場合は、リストで選択された値によって移入されるデータ・コントロールの属性を使用します。
注意:
デフォルトでは、ADFモデル・リストのバインディングは、インデックスをコンポーネントに渡します。valuePassThru=true
を設定する場合は、対応するページ定義ファイルのリスト・バインディング・エントリでMode
属性をObject
に設定する必要があります。Mode=Object
の場合は、リスト・バインディングはインデックスのかわりにオブジェクトをコンポーネントに渡します。「固定選択リストの作成時の処理」を参照してください。
選択リストを作成するには、「リスト・バインディングの編集」ダイアログでベース・データソースとリスト・データソースを選択します。
ベース・データソース: コントロールにバインドし、ユーザーの選択に応じて更新される属性を含むデータ・コレクションを選択します。
リスト・データソース: 表示する属性を含むデータ・コレクションを選択します。
データ・コレクションは、ビュー・オブジェクトに基づいています。ビュー・オブジェクトの作成の詳細は、「エンティティ・ベースのビュー・オブジェクトの作成方法」を参照してください。
「リスト・バインディングの編集」ダイアログでは、次の3種類の選択リストを作成できます。
モデルドリブン・リスト: リストの選択は、データ・コレクションにバインドされた値リストに基づいています。この種類の選択リストは、「モデルドリブン・リストの作成方法」で説明しているように、他の2種類に比べ大きな利点があります。
静的リスト: リストの選択は、エディタに1つずつ値を入力して手動で作成した固定リストに基づいています。「固定値を含む選択リストの作成方法」を参照してください。
動的リスト: リストの選択は、1つ以上のデータバインドされた属性値に基づいて動的に生成されます。「動的に生成される値を含む選択リストの作成方法」を参照してください。
モデルドリブン・リストは、ビュー・データ・オブジェクトにバインドされた値リストに基づいています。通常、値リストはフォームで使用され、エンド・ユーザーは属性値を手動で入力する必要がなく、ドロップダウン・リストから選択できます。ユーザーが値を選択したフォームを送信すると、ADFモデル・レイヤーのADFデータ・バインディングにより、データバインドされたフィールドに対応するビュー・オブジェクト属性の値が更新されます。
注意:
モデルドリブン・リストを作成するには、データ・コントロール・パレットからJSFページにコレクションをドラッグし、ポップアップ・メニューでADFフォームのいずれか1つを選択してデフォルトを受け入れるのも1つの方法です。この利点は、基礎となるビュー・オブジェクト属性でLOVが定義されている場合、フォーム全体のすべてのLOVが自動的に構成される点です。詳細は、「単一のLOVが有効なビュー・オブジェクトの属性を定義する方法」を参照してください。
選択リスト作成の基準として値リストを使用することもできます。値リストに基づいてモデルドリブン・リストを作成する利点は次のとおりです。
再利用: 値リストはビュー・データ・コレクションにバインドされています。データ・コレクションに基づいて作成した選択リストはすべて、同じ値リストを使用できます。ADFビジネス・コンポーネントを持つデータ・モデル・プロジェクトの個々の属性にLOVを定義するため、LOV使用をカスタマイズすると、ユーザー・インタフェース内のビジネス・コンポーネントが使用されている場所で変更を参照できます。
翻訳: 値リストの値は、翻訳に使用されるリソース・バンドルに含めることができます。
始める前に:
選択リスト・コンポーネントの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「選択リストの作成」を参照してください。
選択リストと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。
次のタスクを完了する必要があります。
ビュー・オブジェクトを作成します。
オブジェクトにビュー・アクセッサを作成します。
選択リスト用のベース・データソースの属性にバインドされた値リストを作成する必要があります。たとえば、Addresses
ビュー・データ・オブジェクトのCountryId
属性にバインドされた値リストを作成できます。
詳細は、「単一のLOVが有効なビュー・オブジェクトの属性を定義する方法」を参照してください。
モデルドリブン選択リストを作成するには:
「データ・コントロール」パネルから属性をドラッグ・アンド・ドロップすると、JDeveloperによって様々な処理が自動的に行われます。「データ・コントロール」パネルの使用時に実行される処理と作成される内容の詳細は、「テキスト・フィールドの作成時の処理」を参照してください。
次の例は、モデルドリブンSelectOneChoice
コンポーネントを追加した後のページのソース・コードを示しています。
<af:selectOneChoice value="#{bindings.State.inputValue}" label="#{bindings.State.label}" required="#{bindings.State.hints.mandatory}" shortDesc="#{bindings.State.hints.tooltip}" id="soc1"> <f:selectItems value="#{bindings.State.items}" id="si1"/> </af:selectOneChoice>
選択項目のリストを提供するためのf:selectItems
タグは、バインディング・コンテナ内のState
リスト・バインディング・オブジェクトのitems
プロパティにバインドされます。ADFデータ・バインディング式の構成の詳細は、「ADFバインディング・フィルタの構成」を参照してください。
ページ定義ファイルでは、bindings要素内にリスト・バインディング・オブジェクト定義が追加されます(次の例を参照)。
<executables> <variableIterator id="variables"/> <iterator Binds="Customers" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="CustomersIterator"/> </executables> <bindings> <list IterBinding="CustomersIterator" StaticList="false" Uses="LOV_State" id="State" DTSupportsMRU="true" SelectItemValueMode="ListObject"/> </bindings>
list
要素で、id
属性は、リスト・バインディング・オブジェクトの名前を指定します。IterBinding
属性は、現在の行が、バインディング・コンテナの各変数を表す属性の行である、変数イテレータを参照します。変数イテレータは、他のデータ・コレクションの場合と同じ方法で変数値をバインディングに公開します。
ページ定義ファイルおよびADFデータ・バインディング式の詳細は、「ページ定義ファイルの処理」および「ADFデータ・バインディングのEL式の作成」を参照してください。
他のデータソースから値を取得するのではなく、ユーザーが独自にコーディングした選択肢を含む選択リストを作成できます。別のデータソースで動的に生成された値を選択リストに移入する方法の詳細は、「動的に生成される値を含む選択リストの作成方法」を参照してください。
始める前に:
選択リスト・コンポーネントの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「選択リストの作成」を参照してください。
選択リストと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。
次のタスクを完了する必要があります。
固定の値リストにバインドされたリストを作成するには:
固定選択リストを追加すると、JSFページにソース・コードが追加され、ページ定義ファイルにリスト・バインディング・オブジェクトとイテレータ・バインディング・オブジェクトが追加されます。
次の例は、固定SelectOneChoice
コンポーネントを追加した後のページのソース・コードを示しています。
<af:selectOneChoice value="#{bindings.CountryIdStatic.inputValue}" label="#{bindings.CountryIdStatic.label}"> <f:selectItems value="#{bindings.CountryIdStatic.items}"/> </af:selectOneChoice>
選択項目のリストを提供するためのf:selectItems
タグは、バインディング・コンテナ内のCountryId
リスト・バインディング・オブジェクトのitems
プロパティにバインドされています。ADFデータ・バインディング式の詳細は、「ADFデータ・バインディングのEL式の作成」を参照してください。
JDeveloperにより、ページ定義ファイルのexecutables
要素内にイテレータ・バインディング・オブジェクトの定義が、bindings
要素内にリスト・バインディング・オブジェクトの定義が追加されます(次の例を参照)。
<executables> <iterator Binds="Addresses1" RangeSize="10" DataControl="BackOfficeAppModuleDataControl" id="Addresses1Iterator"/> </executables> <bindings> <list IterBinding="Addresses1Iterator" id="CountryIdStatic" ListOperMode="0" StaticList="true"> <AttrNames> <Item Value="CountryIdStatic"/> </AttrNames> <ValueList> <Item Value="India"/> <Item Value="Japan"/> <Item Value="Russia"/> </ValueList> </list> </bindings>
ページ定義ファイルの詳細は、「ページ定義ファイルの処理」を参照してください。
実行時に、選択リスト・コンポーネントに動的に値を移入できます。
ヒント:
もう1つ、静的なビュー・オブジェクトまたは共有アプリケーション・モジュール内にデータベース・ビュー・オブジェクトを作成する方法もあります。次に、モデルドリブンLOVを使用して、リストを作成します。これにより、キャッシュと翻訳が可能になります。
始める前に:
選択リスト・コンポーネントの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「選択リストの作成」を参照してください。
選択リストと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。
次のタスクを完了する必要があります。
動的値リストを提供するリスト・データソースに対するデータソースの定義
ユーザーの選択に基づいて更新されるベース・データソースに対するデータソースの定義
動的に生成される値を含むバインドされた選択リストを作成するには:
動的選択リストをページに追加すると、JSFページにソース・コードが追加され、ページ定義ファイルにリスト・バインディング・オブジェクトとイテレータ・バインディング・オブジェクトが追加されます。
次の例は、動的SelectOneChoice
コンポーネントを追加した後のページのソース・コードを示しています。
<af:selectOneChoice value="#{bindings.SalesRepId.inputValue}" label="#{bindings.SalesRepId.label}" required="#{bindings.SalesRepId.hints.mandatory}" shortDesc="#{bindings.SalesRepId.hints.tooltip}" id="soc2"> <f:selectItems value="#{bindings.SalesRepId.items}" id="si4"/> <f:validator binding="#{bindings.SalesRepId.validator}"/> </af:selectOneChoice>
選択用のアイテム・リストを提供するf:selectItems
タグは、バインディング・コンテナ内のSalesRepId
リスト・バインディング・オブジェクトのitems
プロパティにバインドされています。ADFデータ・バインディング式の詳細は、「ADFデータ・バインディングのEL式の作成」を参照してください。
JDeveloperにより、ページ定義ファイルのexecutables
要素内にイテレータ・バインディング・オブジェクトの定義が、bindings
要素内にリスト・バインディング・オブジェクトの定義が追加されます(次の例を参照)。
<executables> <variableIterator id="variables"/> <iterator Binds="SummitAppModuleDataControl.dataProvider. BackOfficeAM.Customers" DataControl="SummitAppModuleDataControl" RangeSize="25" id="CustomersIterator"/> <iterator Binds="Countries" RangeSize="10" DataControl="BackOfficeAppModuleDataControl" id="CountriesIterator"/> <iterator Binds="Customers" RangeSize="-1" DataControl="BackOfficeAppModuleDataControl" id="CustomersIterator1"/> </executables> <bindings> <list IterBinding="CountriesIterator" StaticList="false" id="SalesRepId" DTSupportsMRU="true" SelectItemValueMode="ListObject" ListIter="CustomersIterator1"> <AttrNames> <Item Value="Id"/> </AttrNames> <ListAttrNames> <Item Value="Id"/> </ListAttrNames> <ListDisplayAttrNames> <Item Value="Id"/> </ListDisplayAttrNames> </list> </bindings>
デフォルトでは、JDeveloperはCustomers
イテレータ・バインディング用のiterator
要素に対するRangeSize
属性に値-1
を設定するため、このイテレータで有効な製品の選択用に完全なリストを提供できるようになります。list
要素で、id
属性は、リスト・バインディング・オブジェクトの名前を指定します。IterBinding
属性は、Countries
コレクションを反復処理するイテレータを参照します。ListIter
属性は、Customers
コレクションを反復処理するイテレータを参照します。AttrNames
要素は、ベース・イテレータにより戻されるベース・データソース属性を指定します。ListAttrNames
要素は、ベース・データソース属性にマッピングされるリスト・データソース属性を定義します。ListDisplayAttrNames
要素は、実行時にユーザーに表示される値をリストに移入するリスト・データソース属性を指定します。
ページ定義ファイルの詳細は、「ページ定義ファイルの処理」を参照してください。
リスト・バインディングを作成すると、リストの値へのアクセスが必要な場合があります。ビジュアル・エディタまたはプロパティ・インスペクタのいずれかで、コンポーネントのvaluePassThru
属性をtrue
に設定できます。次の例は、selectOneChoice
コンポーネントのコードを示しています。
<af:selectOneChoice value="#{bindings.Language.inputValue}" label="#{bindings.Language.label}" required="#{bindings.Language.hints.mandatory}" shortDesc="#{bindings.Language.hints.tooltip}" valueChangeListener="#{myBean.valueChanged}" id="soc1" valuePassThru="true"> <f:selectItems value="#{bindings.Language.items}" id="si1"/> </af:selectOneChoice>
valuePassThru
属性がtrue
、対応するページ定義ファイルのMode
属性がObject
に設定されている場合のみ、valueChangeListener
に渡される値のタイプをObject
(実際の値)にできます。デフォルトでは、Mode
はIndex
に設定されます。次の例は、ページ定義ファイルのMode
属性を示しています。
<list IterBinding="AvailableLanguagesView1Iterator" id="Language" DTSupportsMRU="true" StaticList="false" ListIter="CountryCodesView1Iterator" Mode="Object"/>
ADF Facesでナビゲーション・リスト・バインディングを使用すると、ユーザーがコレクション内のオブジェクト間を移動できるようになります。ユーザーがナビゲーション・リスト・コンポーネントを使用して現在のオブジェクト選択を変更すると、属性を介して同じコレクションにバインドされている他のコンポーネントも、新しく選択したオブジェクトから表示されます。
また、現在の行を変更するコレクションがデータ・モデルのマスター/ディテール関係のマスター・ビュー・オブジェクト・インスタンスである場合、ディテール・ビュー・オブジェクト・インスタンスの行セットが自動的に更新され、新規の現在のマスター行に適したデータが表示されます。
始める前に:
ナビゲーション・リストの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「ナビゲーション・リスト・バインディングを持つリストの作成」を参照してください。
ナビゲーション・リストと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。
ナビゲーション・リスト・バインディングを使用するリストの作成方法:
ナビゲーション・リストをページに追加すると、JSFページにソース・コードが追加され、ページ定義ファイルにリスト・バインディング・オブジェクトとイテレータ・バインディング・オブジェクトが追加されます。
JDeveloperは、このページにf:selectItems
タグを含むselectOneChoice
コンポーネントを追加します。selectOneChoice
コンポーネントを使用すると、ユーザーは、ソースのデータ・コレクションで選択した属性に基づいた値リストから選択できるようになります。JDeveloperは、af:panelHeader
コンポーネントも追加します。このコンポーネントには、選択内容に基づいたデータを表示するためのコンポーネントを含めます。この例では、データの表示用に表コンポーネントを追加しています。af:panelHeader
コンポーネントのpartialtriggers
は、selectOneChoice
コンポーネントのid
に設定されているため、選択内容が変更されると、新しいデータが表示されるようになります。次の例は、ナビゲーション・リストを追加した後のページのソース・コードを示しています。
<af:selectOneChoice id="nl1" autoSubmit="true" value="#{bindings.Customers.inputValue}" label="#{bindings.Customers.label}"> <f:selectItems value="#{bindings.Customers.items}" id="si1"/> </af:selectOneChoice> <af:panelHeader text="Details" partialTriggers="nl1" id="ph1"> <af:table value="#{bindings.OrdersForCustomer.collectionModel}" var="row" rows="#{bindings.OrdersForCustomer.rangeSize}" emptyText="#{bindings.OrdersForCustomer.viewable ? 'No data to display.' : 'Access Denied.'}" fetchSize="#{bindings.OrdersForCustomer.rangeSize}" rowBandingInterval="0" id="t1"> <af:column headerText="#{bindings.OrdersForCustomer.hints.Id.label}" id="c1"> <af:inputText value="#{row.bindings.Id.inputValue}" ...
ページ定義ファイルのexecutables
要素内には、JDeveloperによってイテレータ・バインディング・オブジェクトの定義が追加されます。次の例は、ページ定義ファイル内のイテレータ・バインディングとナビゲーション・リスト・バインディングを示しています。
<executables> <variableIterator id="variables"/> <iterator Binds="Customers" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="CustomersIterator"/> <iterator Binds="OrdersForCustomer" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="OrdersForCustomerIterator"/> </executables> <bindings> <navigationlist IterBinding="CustomersIterator" ListOperMode="navigation" ListIter="CustomersIterator" id="Customers" DTSupportsMRU="false"> <AttrNames> <Item Value="Name"/> </AttrNames> </navigationlist> <tree IterBinding="OrdersForCustomerIterator" id="OrdersForCustomer"> <nodeDefinition DefName="oracle.summit.model.views.OrdVO" Name="OrdersForCustomer0"> <AttrNames> <Item Value="Id"/> <Item Value="CustomerId"/> <Item Value="DateOrdered"/> <Item Value="LastName"/> <Item Value="Name"/> </AttrNames> </nodeDefinition> </tree> </bindings>
ADF Facesは、2つのリスト間でのアイテムの移動をユーザーに許可することで、値リストから複数の値を選択するメカニズムを提供するシャトル・コンポーネントを提供します。selectManyShuttle
およびselectOrderShuttle
コンポーネントを使用して、データバインド・シャトルを作成します。
selectManyShuttle
およびselectOrderShuttle
コンポーネントは、2つのリスト・ボックスと、ユーザーが先行(選択可能)リスト・ボックスから複数の項目を選択して項目を後続(選択済)リスト・ボックスに移動または往復させる(またはその逆を行う)ことのできるボタンをレンダリングします。項目をダブルクリックして、別のリスト・ボックスに移動することもできます。図35-8に、レンダリングされたselectManyShuttle
コンポーネントの例を示します。このコンポーネントは、Summit ADFサンプル・アプリケーションに実装されています。リスト・ボックスの上に表示されるヘッダーには任意のテキストを指定できます。
selectManyShuttle
とselectOrderShuttle
で違う点は、selectOrderShuttle
コンポーネントでは、ユーザーは横の上下矢印を使用して後続リスト・ボックス内の項目を並替えできることのみです。
Summit ADFサンプル・アプリケーションでは、selectManyShuttle
コンポーネントを使用することで、ユーザーが注文する製品を「All available products」リスト・ボックスから選択して「Selected Products」リスト・ボックスに移動できるようにしています。左側の先行リスト・ボックスには、入手可能なすべての製品が表示されます。右側の後続リスト・ボックスには、顧客が選択した製品が表示されます。
他のADF Faces選択リスト・コンポーネントと同様に、selectManyShuttle
コンポーネントとselectOrderShuttleコンポーネントは、f:selectItems
タグを使用して、先行リストに表示して選択できるアイテムのリストを提供できます。
f:selectItems
タグをバインドする前に、シャトルを必要とするページによって使用される汎用クラスを作成します。使用可能なすべての選択肢のリスト(先行リスト、または使用可能な製品カテゴリ)、および選択された選択肢のリスト(後続リスト、または割り当てられた製品カテゴリ)で使用すべきビュー・オブジェクト・インスタンス名を記述するプロパティのgetterメソッドおよびsetterメソッドをこのクラスで宣言し、インクルードします。Summit ADFサンプル・アプリケーションでは、f:selectItems
はバインディング・コンテナを使用して、入手可能な製品のリストを取得します。例35-1に示すShuttleBean
クラスは、showshuttle.jsf
ページのシャトル・コンポーネントの移入と選択の状態を管理するために作成します。
getSelectedProducts()
メソッドは、シャトルの後続リスト内のアイテムを定義するList
を返します。getSelectedProducts()
から返される値は、先行リスト内の値のサブセットです。先行リストに存在している値でも、getSelectedProducts()
に存在していない値は、無視されます(また、エラーがサーバー・ログに記録されます)。ShuttleBean
クラスでは、ADFUtils
クラス内のユーティリティ・メソッドを必要に応じてコールできます。また、このクラスは基本beanのいくつかのプロパティの値を使用しますので注意してください。
例35-2に、シャトル・コンポーネントを操作するためにorder-select-many-item.xml
タスク・フロー内で構成されるマネージドBeanおよび管理プロパティを示します。
例35-1 ShuttleBeanクラス
public class ShuttleBean { private List<oracle.jbo.domain.Number> _selectedProducts = new ArrayList<oracle.jbo.domain.Number>(); public ShuttleBean() { } public void setSelectedProducts(List<oracle.jbo.domain.Number> _allocatedRoles) { this._selectedProducts = _allocatedRoles; } public List<oracle.jbo.domain.Number> getSelectedProducts() { return _selectedProducts; } public void onAddMultipleProducts(ActionEvent actionEvent) { DCBindingContainer dcBindings = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry(); OperationBinding createMethod = dcBindings.getOperationBinding("CreateInsert"); if ( createMethod != null && _selectedProducts.size() > 0 ) { DCIteratorBinding iterator = dcBindings.findIteratorBinding("ItemsForOrderIterator"); for ( oracle.jbo.domain.Number productId : _selectedProducts ) { createMethod.execute(); iterator.getCurrentRow().setAttribute("ProductId", productId ); } } } }
例35-2 order-select-many-itemsタスク・フロー内のシャトル・コンポーネント用のマネージドBean
<managed-bean id="__3"> <managed-bean-name>ShuttleBean</managed-bean-name> <managed-bean-class>oracle.summit.backing.ShuttleBean</managed-bean-class> <managed-bean-scope>backingBean</managed-bean-scope> </managed-bean> <view id="showshuttle"> <page>/orders/showshuttle.jsf</page>
始める前に:
シャトルの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「データバインド・シャトルの作成」を参照してください。
選択リストと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。
次のタスクを完了する必要があります。
ページ定義ファイルに関連するイテレータ・バインディングを作成します。例35-3を参考にしてください。
Summit
ADFサンプル・アプリケーションでは、ItemsForOrderIterator
によるProductId
のリスト・バインディングがshowshuttlePageDef.xml
ファイルに追加されることで、先行リストに移入する製品のリストを提供します。
ShuttleBean
クラスと同様のクラスを作成して、必要に応じて値を処理するメソッドを用意します。例35-1を参考にしてください。
必要なマネージドBeanと管理プロパティをタスク・フロー定義で構成します。バインドなしタスク・フローの場合はadfc-config.xml
ファイルを構成します。例35-2を参考にしてください。
シャトル・コンポーネントを作成するには:
showshuttle.jsf
のすべてのバインディングは、showshuttlePageDef.xml
ファイル内で定義されます。例35-3に、showshuttle.jsf
ページ用のページ定義ファイルの一部を示します。
例35-4に、「SelectManyShuttleの挿入」ダイアログを完了した後のselectManyShuttle
コンポーネントのコードを示します。
例35-3 showshuttleページ用のページ定義ファイル
<?xml version="1.0" encoding="UTF-8" ?> <pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel" version="12.1.2.61.86" id="showshuttlePageDef" Package="orders"> <parameters/> <executables> <variableIterator id="variables"/> <iterator Binds="ItemsForOrder" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="ItemsForOrderIterator"/> </executables> <bindings> <list IterBinding="ItemsForOrderIterator" StaticList="false" Uses="LOV_ProductId" id="ProductId" DTSupportsMRU="true" SelectItemValueMode="ListObject"/> <action IterBinding="ItemsForOrderIterator" id="CreateInsert" RequiresUpdateModel="true" Action="createInsertRow"> </action> </bindings> </pageDefinition>
例35-4 showshuttle.jsffファイル内のSelectManyShuttleコンポーネント
<af:selectManyShuttle id="sms1" value="#{backingBeanScope.ShuttleBean.selectedProducts}" leadingHeader="All available products" trailingHeader="Selected products"> <f:selectItems value="#{bindings.ProductId.items}" id="si1"/> </af:selectManyShuttle>