35 データバインドされた選択リストおよびシャトルの作成
この章の内容は次のとおりです。
選択リストおよびシャトルについて
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によるデータバインドされた検索フォームの作成」を参照してください。
値リスト(LOV)のコンポーネントの作成
ADF Facesは、ユーザーが値を選択でき、オプションで必要なアイテムを検索できるオブジェクトのモデルドリブン・リストを表示できる値リスト(LOV)コンポーネントを提供します。af:inputListOfValues、af:inputSearchまたはaf:inputComboboxListOfValuesコンポーネントを使用して、LOVを作成します。
LOVコンポーネントは、問合せにより生成されたリストからユーザーが値を選択して入力できる、入力コンポーネントです。ADF Facesには、af:inputListOfValues、af:inputSearchおよび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:inputSearchコンポーネントは、一致する候補をフィルタ処理して強調表示します。このLOVコンポーネントをADF RESTリソースで使用します。候補のフィルタ処理では大/小文字を区別しません。af:inputSearchとaf:inputComboboxListOfValuesとの違いは、後者のコンポーネントではユーザーがドロップダウンを起動するたびにサーバーからリストがフェッチされるという点です。ただし、af:inputComboboxListOfValuesにはcontentDeliveryという名前の属性があり、この属性がimmediateに設定されていると、ドロップダウンの起動時にリストはフェッチされません。リストは、コンポーネントのロード時またはレンダリング時にプリフェッチしておく必要があります。af:inputSearchの場合は、RESTful Webサービスに基づいてADF RESTリソースからリストがフェッチされます。ADF RESTサービスでHTTPヘッダーを介してキャッシュを有効にしている場合、クライアント上でもリソースをキャッシュできます。キャッシュはADF RESTサービス・インプリメンタによって制御されます。このようなシナリオでは、以降にLOVドロップダウンを起動すると、リストはキャッシュから取得されます。HTTPヘッダーを介してキャッシュを有効にしている場合、ユーザー入力に基づいたブラウザ内フィルタ処理と、ブラウザ内でのMRU (最近使用した)候補の管理が容易になります。
af:inputSearchコンポーネントの提案リストのデフォルト表示は、リスト・モードと表モードです(図35-3および図35-4を参照)。
図35-3 リスト表示モードによる検索基準の「入力検索」フィールド

図35-4 表表示モードによる検索基準の「入力検索」フィールド

contentStampおよびcontentHeaderファセットを使用します。コードはaf:inputSearchタグ内に移入されます。コードには、ValueAttribute属性(af:inputSearchが構成されているLOV属性)があります。この例で、LOV属性はDeptnoであるため、ValueAttribute属性には値deptnoidが割り当てられています。contentMode属性には値tableが割り当てられており、このコンポーネントがこのLOV属性でレンダリングする提案リストは表形式で表示されることを示しています。さらに、contentStampファセット(name = contentStampで指定)のコードがf:facetタグで囲まれています。この例で、LOV属性はDeptnoであり、この属性はDept (部門)表からデータを取得します。f:facetタグが示すように、Dname (部門名)とDeptno (部門番号)は、ユーザーがLOVコンポーネントに入力したときに提案リストに表示されるように構成された列です。
提案リストに表示される列は構成できます。これを例で説明します。EmpView.xmlの図35-5を参照してください。「属性」タブでDeptno属性が選択され、「値リスト: Deptno」セクションでLOV_Deptnoエントリが選択されています。Deptnoは、すでにタイプaf:inputSearchのLOV属性として構成されています。「値リスト: Deptno」セクションでLOV_Deptnoエントリをダブルクリックし、「値リストの編集」ダイアログを開きます。図35-6に、この「値リストの編集」ダイアログを示します。「UIヒント」タブを選択し、列を「使用可能」セクションから「選択済」セクションに移動します。ユーザーがLOVコンポーネントに入力したときに、「選択済」セクション内のエントリが提案リストに表示されます。
図35-5 af:inputSearchとして構成されたLOV属性

図35-6 「値リストの編集」ダイアログ

af:inputComboboxListOfValuesの場合、ドロップダウン・アイコンをクリックすると、図35-7に示すように、LOVドロップダウン・リストと「詳細」または「検索」リンクが表示されます。「検索」リンクは、LOV検索および選択ポップアップ・ダイアログに検索を絞込むための検索パネルが含まれている場合に表示されます。「詳細」リンクは、ポップアップ・ダイアログに値リストの表のみが含まれている場合、またはスマート・リストが使用されている場合に表示されます。
図35-7 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-8は、「詳細」リンクから起動されたLOV検索および選択ダイアログです。
図35-8 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-9に、「値リストの作成」ダイアログとそのオプションの一部を示します。この例では、検索リージョンは、問合せに使用した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の作成方法
LOVの作成には、af:inputListOfValuesコンポーネントまたはaf:inputComboboxListOfValuesコンポーネントを使用できます。これらのコンポーネントに自動提案動作を追加して、ユーザーの入力から、一致する可能性のある項目のリストを表示できます。
始める前に:
LOVの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「値リスト(LOV)のコンポーネントの作成」を参照してください。
LOVと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。
次のタスクを完了する必要があります。
- 「ビュー・オブジェクト属性の値リスト(LOV)での作業」で説明されている手順に従って、ビュー・オブジェクトでLOVになる属性を定義します。
LOVを作成するには:
LOV属性をinputSearchとして構成する方法
最初にLOV属性を定義してから、そのLOV属性をinputSearchとして構成して、af:inputSearch LOVコンポーネントを作成します。
始める前に
属性をLOV属性として定義する方法の詳細は、「単一のLOVが有効なビュー・オブジェクトの属性を定義する方法」を参照してください。LOV属性をinputSearchとして構成した後、af:inputSearch LOVコンポーネントの作成に進みます。
LOVコンポーネントの作成方法の詳細は、「LOVの作成方法」を参照してください。af:inputSearchコンポーネントを作成した後、ADF RESTリソースのURLを指定して、af:inputSearch LOVコンポーネントがこのADF RESTリソースからLOVをフェッチできるようにします。
アプリケーション・モジュールを使用してRESTful Webサービスを作成する方法の詳細は、「アプリケーション・モジュールを使用したADF RESTリソースの作成」を参照してください。
af:inputSearch LOVコンポーネントにREST URLを指定する方法の詳細は、「af:inputSearch LOVコンポーネントにREST URLを指定する方法」を参照してください。
inputSearchとして構成するには:
- アプリケーション・ナビゲータで、
inputSearchとして構成するLOV属性が含まれるビュー・オブジェクトをダブルクリックします。 - 「属性」ページでLOV属性を選択し、「カスタム・プロパティ」セクションでプラス・アイコンをクリックして「変換不能プロパティ」を選択し、「プロパティ」列と「値」列を持つ行を追加します。
- 行をダブルクリックし、この行の「プロパティ」列に
ListTypeと入力し、「値」列にinputSearchと入力します。 - 「保存」をクリックしてプロジェクトを保存します。
inputSearchコンポーネントの作成時の処理
LOVとして定義され、さらにinputSearchとしても定義された属性を「データ・コントロール」パネルからドラッグし、inputSearchコンポーネントとして.jspxページにドロップすると、JDeveloperにより、次の例に類似したコードがこのページに追加されます。JDeveloperでは他にも様々な処理が実行されます。詳細は、「LOVの作成時の処理」を参照してください。
<af:inputSearch id="deptnoID" contentMode="table"
valueAttribute="#{bindings.Deptno.valueAttribute}"
displayAttributes="#{bindings.Deptno.displayAttributes}"
value="#{bindings.Deptno.inputValue}"
selectionConverter="#{bindings.Deptno.selectionConverter}"
label="#{bindings.Deptno.hints.label}"
required="#{bindings.Deptno.hints.mandatory}"
columns="#{bindings.Deptno.hints.displayWidth}"
shortDesc="#{bindings.Deptno.hints.tooltip}">
<f:facet name ="contentStamp">
<af:sanitized>
<td>{{Dname}}</td><td>{{Deptno}}</td>
</af:sanitized>
</f:facet>
</af:inputSearch>ページ定義ファイルに、次の例に示すようなコードが、JDeveloperによって追加されます。このコード・サンプルは、inputSearchリスト・タイプとして指定されたDeptno属性を示しています。
<listOfValues StaticList="false" IterBinding="EmpView1Iterator" Uses="LOV_Deptno" id="Deptno" ListType="inputSearch"/> </bindings>
af:inputSearch LOVコンポーネントにREST URLを指定する方法
属性をLOV属性として構成し、それをタイプinputSearchとして定義した後に、次のステップは、af:inputSearch LOVコンポーネントを作成して、このコンポーネントにREST URLを指定します。
af:inputSearchで使用するLOV属性として構成する方法の詳細は、「LOV属性をinputSearchとして構成する方法」を参照してください。REST URLをinputSearch LOVコンポーネントに指定するには:
af:inputSearchコンポーネントが含まれる.jspxページの実行時に、RESTful Webサービスが稼働していることを確認します。af:inputSearchLOVコンポーネントが含まれる.jspxページで、「ソース」タブをクリックしてソース・コードを表示します。af:searchSectionタグを検索し、REST URLをこのタグのdataURL属性の値として入力します。REST URLの例:dataUrl="//Application3-RESTWebService-context-root/rest/v1/Dept"。このREST URLで、Application3-RESTWebService-context-rootは、RESTful Webサービスのコンテキスト・ルートです。restは、RESTful Webサービスのweb.xmlファイル内にあるRESTServletのURLパターンです。v1は、ADF RESTリソースのバージョンです。Deptは、RESTリソースの名前です。.jspxページを作成してLOVコンポーネントを表示し、ADF RESTリソースから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式の作成」を参照してください。
リスト・バリデータとLOVに関する必知事項
ビュー・オブジェクトの属性を値リストの属性として定義する場合は、リスト検証規則が同一のリストに基づいているかぎり、基礎となるエンティティ・オブジェクトで相当するリスト検証規則を定義できます。ビュー・オブジェクトの値リストとしてすでに定義されている属性のエンティティ・オブジェクトには、その他のタイプの検証規則を定義しないでください。これにより、予期せぬ動作が発生し、検証エラーになる可能性があります。検証ルールの定義の詳細は、図10-3および「組込みの宣言的な検証規則の使用」を参照してください。
InputComboboxListOfValuesおよびNULL値に関する必知事項
ビュー・オブジェクト・リストのデータソースを使用してinputComboboxListOfValuesコンポーネントを作成し、かつ、そのリストを実行時に変更できるために、リスト・アイテムが削除される可能性がある場合は、NULL値をサポートするために、LOV属性に対してカスタム・プロパティdisplayModeを定義する必要があります。デフォルトでは、使用できる表示値がない場合、inputComboboxListOfValuesコンポーネントには、LOV属性によって定義されているリスト属性の値が表示されます。削除された表示属性値が対応する属性リスト値に置き換えられないようにするには、LOV表示属性の名前を値とするカスタム・プロパティdisplayModeを定義します。たとえば、図35-10は、LOV表示属性のNameを値としてカスタム・プロパティを定義する、LOV属性DeptIdを示しています。実行時に、使用可能な部門のリストから1つの部門名を削除した場合は、削除した名前を入力すると、カスタム・プロパティにより一致なしが返されます。
図35-10 カスタム・プロパティdisplayModeが定義されたビュー・オブジェクトのLOV属性

「図35-10 カスタム・プロパティ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-12に、レンダリングされた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を参考にしてください。
SummitADFサンプル・アプリケーションでは、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>








