35 データバインドされた選択リストおよびシャトルの作成

この章では、ADFビジネス・コンポーネントでモデル化されたデータから、リスト・コンポーネントとシャトル・コンポーネントを作成する方法について説明します。これらのコンポーネントの作成には、ADFデータ・バインディングとADF Facesコンポーネントを使用します。ここでは、問合せを使用して値リスト(LOV)コンポーネントを作成し、選択リストにデータを移入する方法を説明します。また、モデルドリブン・リスト、固定値リストまたは動的に生成されたリストを使用して、標準選択コンポーネントを作成する方法を説明します。さらに、ユーザーがコレクション内のオブジェクトのリストを介して操作できるようにするために、ナビゲーション・リストのバインディングを追加する方法も説明します。また、シャトル・コンポーネントを使用して、ユーザーが2つのリストの間ですばやくアイテムを移動できるようにする方法も説明します。

この章の内容は次のとおりです。

選択リストおよびシャトルについて

ADF Facesは、ユーザーが1つまたは複数の値を選択できるオブジェクトのリストを表示できる選択リストおよびシャトル・コンポーネントを提供します。値リスト(LOV)コンポーネント、ナビゲーション・リスト・バインディングまたはselectManyShuttleコンポーネントを使用して、複数のアイテムがあるリストを作成します。

選択リスト・コンポーネントにより、入力値として使用される選択項目のリストが表示されます。この選択リストは、モデルドリブンのリスト、固定リストから取得されるリスト、または実行時に動的に作成されるリストのいずれかです。選択リストのコンポーネントは、リスト、ラジオ・ボタン、チェック・ボックスおよびリスト・ボックスとしてレンダリングできます。一部の選択タイプは、単一選択(1つ選択)または複数選択(2つ以上選択)のどちらにも設定できます。

選択リストおよびシャトルは、標準的なJSFリスト・コンポーネントと同様に機能します。ただし、ADF Facesのリスト・コンポーネントには追加の機能(ラベルとメッセージの表示、自動フォーム送信、部分ページ・レンダリングのサポートなど)が備わっています。リストを提示することにより、ユーザーには使用可能な選択項目が容易にわかるため、すぐに選択を実行できます。また、リストから選択することにより、起こり得る入力エラーを防ぐこともできます。

値リスト(LOV)コンポーネントはUIコンポーネントで、これによりユーザーは問合せにより生成されたリストから値を選択して入力できます。LOVは、通常、検索機能を備えたモーダル・ポップアップ・ダイアログ内に表示されます。たとえば、af:inputListOfValuesaf: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機能を理解しておくと役立つ場合があります。また、モデル・レイヤーの構成によって可能になることについても、確認しておくことをお薦めします。次に、関連する他の機能へのリンクを示します。

値リスト(LOV)のコンポーネントの作成

ADF Facesは、ユーザーが値を選択でき、オプションで必要なアイテムを検索できるオブジェクトのモデルドリブン・リストを表示できる値リスト(LOV)コンポーネントを提供します。af:inputListOfValuesaf:inputSearchまたはaf:inputComboboxListOfValuesコンポーネントを使用して、LOVを作成します。

LOVコンポーネントは、問合せにより生成されたリストからユーザーが値を選択して入力できる、入力コンポーネントです。ADF Facesには、af:inputListOfValuesaf:inputSearchおよびaf:inputComboboxListOfValuesコンポーネントが用意されています。フル機能のLOVコンポーネントを作成する場合は、「ビュー・オブジェクト属性の値リスト(LOV)での作業」で説明するように、ビュー・オブジェクトにLOVを定義する必要があります。

検索フォームの一部に依存LOVを使用する場合は、必ず、af:queryコンポーネントとともに使用してください。検索フォームでのLOVコンポーネントの使用の詳細は、「値リスト(LOV)入力フィールド」を参照してください。

図35-1に示すように、af:inputListOfValuesコンポーネントには、検索基準フィールドの横に検索アイコンがあります。

図35-1 inputListOfValuesとして定義された検索基準入力フィールド

この図は周囲のテキストで説明しています

図35-2State属性で示すように、af:inputComboboxListOfValuesコンポーネントではフィールドの横にドロップダウン・アイコンが表示されます。

図35-2 inputComboboxListOfValuesとして定義された検索基準入力フィールド

この図は周囲のテキストで説明しています

af:inputSearchコンポーネントは、一致する候補をフィルタ処理して強調表示します。このLOVコンポーネントをADF RESTリソースで使用します。候補のフィルタ処理では大/小文字を区別しません。af:inputSearchaf: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属性も有効化され、ユーザーはリストから値の選択のみを許可されているか(editModeselectを設定)、入力フィールドに値を入力することもできるのか(editModeinputを設定)が決定されます。

また、ユーザーが値の一部を入力したときに、選択可能な推奨項目のリストを表示するように、LOVコンポーネントを設定することもできます。たとえば、ユーザーがCAと入力したときに、CAと部分的に一致する推奨リストが、推奨項目リストとして表示されます。ユーザーはこのリストから、入力フィールドに入力する項目を選択できます。一致するものがない場合は、「結果が見つかりません。」メッセージが表示されます。「コンポーネント」ウィンドウからLOVにaf:autoSuggestBehaviorタグを追加してから、ADFモデルで実装したsuggestedItemsメソッドにselectedItem属性を設定します。

自動提案動作は、リクエスト値の適用フェーズ中に行われることに注意してください。immediateプロパティがtrueに設定されていると、これと同じフェーズで検証が実行されます。検証エラーが発生すると、提案リストは表示されなくなります。自動提案動作を追加する場合は、immediatetrueを設定しないでください。

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タグを使用して、レンダリングされる選択フィールドにDeptNameDeptnoのかわりに表示します。

<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をリフレッシュし、ビュー・オブジェクトの更新を表示するには、次の例に類似するコードとともに、returnListenerCreateリンクに追加します。

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定義にそのビュー基準を適用します。ビュー基準の設定の詳細は、「名前付きビュー基準を宣言的に作成する方法」を参照してください。

図35-9 「値リスト」ダイアログの「UIヒント」タブ

図35-9の説明が続きます
「図35-9 「値リスト」ダイアログの「UIヒント」タブ」の説明

また、ユーザーが値の一部を入力したときに、選択可能な推奨項目のリストを表示するように、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を作成するには:

  1. 「アプリケーション」ウィンドウで、このコンポーネントを表示するWebページをダブルクリックします。
  2. 「データ・コントロール」パネルから、属性をJSFページにドラッグ・アンド・ドロップし、「作成」→「値リスト」→「ADF LOV入力」または「作成」→「値リスト」→「ADF LOV選択肢リスト」を選択します。
  3. 「コンポーネント」ウィンドウの「ADF Faces」ページで、「操作」パネルから「自動提案動作」をドラッグして、LOVコンポーネントに子としてドロップします。
  4. プロパティ・インスペクタで、「自動提案動作」の値を入力します。
    • SuggestItems: suggestItemsメソッドに解決されるEL式。

    • SmartList: smartListメソッドに解決されるEL式。

    • MaxSuggestedItems: 自動提案リストに表示される項目数。完全なリストを表示するには、-1を入力します。

  5. LOVに異なる表示属性を設定する場合は、f:converter bindingタグをコンポーネントに追加します。たとえば、LOVで営業担当者IDのかわりに営業担当者名を表示し、このタグをコンポーネント: f:converter binding="#{bindings.SalesRepId.converter}"に追加でき、SalesRepNameを表示属性として定義できます。
  6. 自動提案動作を追加する場合は、そのコンポーネントのimmediateプロパティをtrueに設定しないでください。

    次の例は、自動提案動作とスマート・リスト機能を持つinputListOfValuesコンポーネントを示しています。

    <af:inputListOfValues id="salesRepIdId"      
    				 popupTitle="Search and Select: #{bindings.SalesRepId.hints.label}"      
    				 value="#{bindings.SalesRepId.inputValue}"      
    				 label="#{bindings.SalesRepId.hints.label}"      
    				 model="#{bindings.SalesRepId.listOfValuesModel}"      
    				 required="#{bindings.SalesRepId.hints.mandatory}"      
    				 columns="#{bindings.SalesRepId.hints.displayWidth}"      
    				 shortDesc="#{bindings.SalesRepId.hints.tooltip}">
    <f:validator binding="#{bindings.SalesRepId.validator}">
    <f:converter binding="#{bindings.SalesRepId.converter}">
    <af:autoSuggestBehavior suggestItems="#{bindings.SalesRepId.suggestedItems}"
             smartList="#{bindings.SalesRepId.smartList}"
             maxSuggestedItems="5"/>
    </af:inputListOfValues>
    
    

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を指定する方法」を参照してください。

LOV属性をinputSearchとして構成するには:
  1. アプリケーション・ナビゲータで、inputSearchとして構成するLOV属性が含まれるビュー・オブジェクトをダブルクリックします。
  2. 「属性」ページでLOV属性を選択し、「カスタム・プロパティ」セクションでプラス・アイコンをクリックして「変換不能プロパティ」を選択し、「プロパティ」列と「値」列を持つ行を追加します。
  3. 行をダブルクリックし、この行の「プロパティ」列にListTypeと入力し、「値」列にinputSearchと入力します。
  4. 「保存」をクリックしてプロジェクトを保存します。

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を指定します。

これを行うのは、このコンポーネントがREST URLを使用してADF RESTリソースからLOVリストをフェッチできるようにするためです。LOV属性を作成し、それをaf:inputSearchで使用するLOV属性として構成する方法の詳細は、「LOV属性をinputSearchとして構成する方法」を参照してください。REST URLをinputSearch LOVコンポーネントに指定するには:
  1. af:inputSearchコンポーネントが含まれる.jspxページの実行時に、RESTful Webサービスが稼働していることを確認します。
  2. af:inputSearch LOVコンポーネントが含まれる.jspxページで、「ソース」タブをクリックしてソース・コードを表示します。
  3. 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リソースの名前です。
  4. .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の説明が続きます
「図35-10 カスタム・プロパティdisplayModeが定義されたビュー・オブジェクトのLOV属性」の説明

選択リストの作成

ADF Facesには、単純なブール・ラジオ・ボタンから、ユーザーが複数の項目を選択できるリスト・ボックスまで、様々な選択コンポーネントがあります。様々なプロシージャを使用して、モデルドリブン選択リスト、固定選択リストまたは動的選択リストを作成できます。

ADF Faces Coreには、リストから単一値および複数値を選択するコンポーネントが含まれています。たとえば、selectOneChoiceを使用するとドロップダウン・リストから項目を1つ選択でき、selectManyChoiceを使用するとチェック・ボックスのリストから項目を複数選択できます。表35-1に、選択リストの説明を示します。

表35-1 ADF Facesの単一選択および複数選択リスト・コンポーネント

ADF Facesコンポーネント 説明

SelectOneChoice

項目のリストから単一値を選択します。

この図は周囲のテキストで説明しています

SelectOneRadio

ラジオ・ボタンのセットから単一値を選択します。

この図は周囲のテキストで説明しています

SelectOneListbox

スクロール可能な項目のリストから単一値を選択します。

この図は周囲のテキストで説明しています

SelectManyChoice

スクロール可能なチェック・ボックスのリストから複数値を選択します。リストの最上位に、選択した項目の名前が表示されます。

この図は周囲のテキストで説明しています

SelectManyCheckbox

チェック・ボックスのグループから複数値を選択します。

この図は周囲のテキストで説明しています

SelectManyListbox

スクロール可能なチェック・ボックスのリストから複数値を選択します。

この図は周囲のテキストで説明しています

SelectOneChoice ADF Facesコンポーネントを使用して、選択リストを作成できます。作成のステップは、SelectOneRadioSelectOneListboxのような他の単一値選択リストを作成する場合でも同様です。

データバインドされた選択リストは、データ・コントロール・コレクションまたは静的リストの値を表示し、ユーザーの選択に基づいて別のコレクションの属性またはメソッド・パラメータを更新します。リストにバインディングを追加する場合は、リストで選択された値によって移入されるデータ・コントロールの属性を使用します。

ノート:

デフォルトでは、ADFモデル・リストのバインディングは、インデックスをコンポーネントに渡します。valuePassThru=trueを設定する場合は、対応するページ定義ファイルのリスト・バインディング・エントリでMode属性をObjectに設定する必要があります。Mode=Objectの場合は、リスト・バインディングはインデックスのかわりにオブジェクトをコンポーネントに渡します。「固定選択リストの作成時の処理」を参照してください。

選択リストを作成するには、「リスト・バインディングの編集」ダイアログでベース・データソースとリスト・データソースを選択します。

  • ベース・データソース: コントロールにバインドし、ユーザーの選択に応じて更新される属性を含むデータ・コレクションを選択します。

  • リスト・データソース: 表示する属性を含むデータ・コレクションを選択します。

データ・コレクションは、ビュー・オブジェクトに基づいています。ビュー・オブジェクトの作成の詳細は、「エンティティ・ベースのビュー・オブジェクトの作成方法」を参照してください。

「リスト・バインディングの編集」ダイアログでは、次の3種類の選択リストを作成できます。

モデルドリブン・リストの作成方法

モデルドリブン・リストは、ビュー・データ・オブジェクトにバインドされた値リストに基づいています。通常、値リストはフォームで使用され、エンド・ユーザーは属性値を手動で入力する必要がなく、ドロップダウン・リストから選択できます。ユーザーが値を選択したフォームを送信すると、ADFモデル・レイヤーのADFデータ・バインディングにより、データバインドされたフィールドに対応するビュー・オブジェクト属性の値が更新されます。

ノート:

モデルドリブン・リストを作成するには、データ・コントロール・パレットからJSFページにコレクションをドラッグし、ポップアップ・メニューでADFフォームのいずれか1つを選択してデフォルトを受け入れるのも1つの方法です。この利点は、基礎となるビュー・オブジェクト属性でLOVが定義されている場合、フォーム全体のすべてのLOVが自動的に構成される点です。詳細は、「単一のLOVが有効なビュー・オブジェクトの属性を定義する方法」を参照してください。

選択リスト作成の基準として値リストを使用することもできます。値リストに基づいてモデルドリブン・リストを作成する利点は次のとおりです。

  • 再利用: 値リストはビュー・データ・コレクションにバインドされています。データ・コレクションに基づいて作成した選択リストはすべて、同じ値リストを使用できます。ADFビジネス・コンポーネントを持つデータ・モデル・プロジェクトの個々の属性にLOVを定義するため、LOV使用をカスタマイズすると、ユーザー・インタフェース内のビジネス・コンポーネントが使用されている場所で変更を参照できます。

  • 翻訳: 値リストの値は、翻訳に使用されるリソース・バンドルに含めることができます。

始める前に:

選択リスト・コンポーネントの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「選択リストの作成」を参照してください。

選択リストと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. ビュー・オブジェクトを作成します。

  2. オブジェクトにビュー・アクセッサを作成します。

  3. 選択リスト用のベース・データソースの属性にバインドされた値リストを作成する必要があります。たとえば、Addressesビュー・データ・オブジェクトのCountryId属性にバインドされた値リストを作成できます。

    詳細は、「単一のLOVが有効なビュー・オブジェクトの属性を定義する方法」を参照してください。

モデルドリブン選択リストを作成するには:

  1. 「データ・コントロール」パネルから、JSFページに属性をドラッグ・アンド・ドロップして、ポップアップ・メニューから「作成」→「単一選択」→「ADF選択肢を1つ選択」を選択します。
  2. 「リスト・バインディングの編集」ダイアログで、「モデルドリブン・リスト」ラジオ・ボタンをクリックします。
  3. 「ベース・データソース属性」ドロップダウン・リストから、値リストに表示する属性を選択します。

    「ベース・データソース」は、「データ・コントロール」パネルからドラッグしたコレクションになります。このコレクションがドロップダウン・リストに表示されていない場合は、「追加」ボタンをクリックして必要なコレクションを選択します。

  4. 「サーバー・リスト・バインディング名」ドロップダウン・リストから、ベース属性用に作成した値リスト定義の名前を選択します。

    値リスト定義が作成されている属性を選択しているときには、その定義がドロップダウン・リストに表示されます。たとえば、State属性用の値リスト定義として、LOV_Stateを定義しておくと、「サーバー・リスト・バインディング名」ドロップダウン・リストにはLOV_Stateが表示されます。

  5. 「OK」をクリックします。

モデルドリブン選択リストの作成時の処理

「データ・コントロール」パネルから属性をドラッグ・アンド・ドロップすると、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式の作成」を参照してください。

固定値を含む選択リストの作成方法

他のデータソースから値を取得するのではなく、ユーザーが独自にコーディングした選択肢を含む選択リストを作成できます。別のデータソースで動的に生成された値を選択リストに移入する方法の詳細は、「動的に生成される値を含む選択リストの作成方法」を参照してください。

図35-11 固定の値リストにバインドされた選択リスト

図35-11の説明が続きます
「図35-11 固定の値リストにバインドされた選択リスト」の説明

始める前に:

選択リスト・コンポーネントの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「選択リストの作成」を参照してください。

選択リストと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。

次のタスクを完了する必要があります。

  • 固定リストとしてコンポーネントに組み込む値リストを準備します。

固定の値リストにバインドされたリストを作成するには:

  1. 「データ・コントロール」パネルから、JSFページに属性をドラッグ・アンド・ドロップして、ポップアップ・メニューから「作成」→「単一選択」→「ADF選択肢を1つ選択」を選択します。
  2. 「リスト・バインディングの編集」ダイアログで、「固定リスト」ラジオ・ボタンをクリックします。
  3. 「ベース・データソース属性」ドロップダウン・リストから、値リストに表示する属性を選択します。

    「ベース・データソース」は、「データ・コントロール」パネルからドラッグしたコレクションになります。このコレクションがドロップダウン・リストに表示されていない場合は、「追加」ボタンをクリックして必要なコレクションを選択します。

  4. 「一連の値」ボックスで、リストに表示するそれぞれの値を入力します。[Enter]キーを押して値を設定してから、次の値を入力します。たとえば、使用する属性がCountryの場合は、国コードのIndiaJapanおよびRussiaを追加します。

    値を入力する順序は、実行時にSelectOneRadioコントロールにリスト項目が表示される順序です。

    SelectOneRadioコンポーネントではnull値がサポートされています。このため、ユーザーが項目を選択しない場合、その項目のラベルがブランクとして表示され、コンポーネントの値がデフォルトで空の文字列に設定されます。ブランクまたは空の文字列を使用せずに、null値を表す文字列を指定できます。デフォルトでは、リストの先頭に新しい文字列が表示されます。

  5. 「OK」をクリックします。

固定選択リストの作成時の処理

固定選択リストを追加すると、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を使用して、リストを作成します。これにより、キャッシュと翻訳が可能になります。

始める前に:

選択リスト・コンポーネントの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「選択リストの作成」を参照してください。

選択リストと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 動的値リストを提供するリスト・データソースに対するデータソースの定義

  2. ユーザーの選択に基づいて更新されるベース・データソースに対するデータソースの定義

動的に生成される値を含むバインドされた選択リストを作成するには:

  1. 「データ・コントロール」パネルから、JSFページに属性をドラッグ・アンド・ドロップして、ポップアップ・メニューから「作成」→「単一選択」→「ADF選択肢を1つ選択」を選択します。
  2. 「リスト・バインディングの編集」ダイアログで、「動的リスト」ラジオ・ボタンをクリックします。
  3. ドロップダウン・リストから「ベース・データソース」を選択するか、「追加」をクリックします。
  4. 「データソースの追加」ダイアログから、更新する属性が含まれるデータ・コレクションを選択して、「OK」をクリックします。
  5. ドロップダウン・リストから「リスト・データソース」を選択するか、「追加」をクリックします。
  6. 「データソースの追加」ダイアログから、表示する属性が含まれるデータ・コレクションを選択して、「OK」をクリックします。

    ノート:

    リスト・コレクションとベース・コレクションはマスター/ディテール関係になっている必要はありませんが、リスト・コレクション内の属性のタイプはベース・コレクション属性と同じである必要があります。

  7. 「データ・マッピング」セクションでは、デフォルト・マッピングをそのまま受け入れることも、「データ値」リストと「リスト属性」リストから別の属性アイテムを選択してマッピングを更新することもできます。

    「データ値」コントロールには、選択リストでユーザーがアイテムを選択すると更新される、データ・コレクションの属性が含まれます。「リスト属性」コントロールには、選択リストに値を移入する属性が含まれます。

    2番目のマッピングを追加するには、「追加」をクリックします。

  8. 「リスト・アイテム」セクションでは、次のように値を選択します。
    • 表示属性: 表示する属性を選択します。

    • ""選択なし""アイテム: NULL値の選択肢をリストに表示するかどうかと、NULL値の表示方法を指定します。

    • MRU: 最近使用したアイテムのリストを表示する場合に選択します。MRUリストに表示するアイテムの数と、使用するセパレータを指定します。

  9. 「OK」をクリックします。

動的選択リストの作成時の処理

動的選択リストをページに追加すると、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(実際の値)にできます。デフォルトでは、ModeIndexに設定されます。次の例は、ページ定義ファイルのMode属性を示しています。

<list IterBinding="AvailableLanguagesView1Iterator" id="Language"
      DTSupportsMRU="true" StaticList="false"
      ListIter="CountryCodesView1Iterator"
      Mode="Object"/>

ナビゲーション・リスト・バインディングを持つリストの作成

ADF Facesでナビゲーション・リスト・バインディングを使用すると、ユーザーがコレクション内のオブジェクト間を移動できるようになります。ユーザーがナビゲーション・リスト・コンポーネントを使用して現在のオブジェクト選択を変更すると、属性を介して同じコレクションにバインドされている他のコンポーネントも、新しく選択したオブジェクトから表示されます。

また、現在の行を変更するコレクションがデータ・モデルのマスター/ディテール関係のマスター・ビュー・オブジェクト・インスタンスである場合、ディテール・ビュー・オブジェクト・インスタンスの行セットが自動的に更新され、新規の現在のマスター行に適したデータが表示されます。

ナビゲーション・リスト・バインディングを持つリストの作成方法

始める前に:

ナビゲーション・リストの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「ナビゲーション・リスト・バインディングを持つリストの作成」を参照してください。

ナビゲーション・リストと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。

ナビゲーション・リスト・バインディングを使用するリストを作成するには:

  1. 「データ・コントロール」パネルから、マスター・コレクションをページにドラッグ・アンド・ドロップし、「作成」→「ナビゲーション」→「ADFナビゲーション・リスト」を選択します。

    ユーザーは、マスター・コレクションから選択します。

  2. 「リスト・バインディングの編集」ダイアログの「ベース・データソース」ドロップダウン・リストからコレクションを選択します。このコレクションのメンバーがリストの作成に使用されます。

    これは、「データ・コントロール」パネルからドラッグしたコレクションです。このコレクションがドロップダウン・リストに表示されていない場合は、「追加」ボタンをクリックして必要なコレクションを選択します。

  3. 「属性の表示」ドロップダウン・リストから、リストに表示される属性を選択します。すべての属性を含む選択肢を指定し、「複数の選択」を選んで、選択ダイアログを開くことができます。
  4. 「複数の表示属性の選択」ダイアログで、表示する属性を「使用可能な属性」リストから「表示する属性」リストに移します。「OK」をクリックして、ダイアログを閉じます。
  5. 「OK」をクリックします。
  6. 「データ・コントロール」パネルから、詳細コレクションをドラッグして、ページの「詳細」セクションの内側に出力コンポーネントとしてドロップします。

    この出力コンポーネントは、データの表示に使用する任意のコンポーネントになります。たとえば、表を使用する場合は、「作成」→「表」→「ADF表」を選択します。

    「詳細」セクションは、ステップ1でナビゲーション・リストを作成したときに、JDeveloperによって追加されたaf:panelHeaderコンポーネントです。

ナビゲーション・リスト・バインディングの作成時の処理

ナビゲーション・リストをページに追加すると、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サンプル・アプリケーションに実装されています。リスト・ボックスの上に表示されるヘッダーには任意のテキストを指定できます。

図35-12 selectManyShuttleコンポーネント

図35-12の説明が続きます
「図35-12 SelectManyShuttleコンポーネント」の説明

selectManyShuttleselectOrderShuttleで違う点は、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>

データバインドされたシャトルの作成方法

始める前に:

シャトルの作成時には使用可能なオプションに関する知識が役立つ場合があります。詳細は、「データバインド・シャトルの作成」を参照してください。

選択リストと併用可能な機能についても理解しておくと役立ちます。詳細は、「選択リストとシャトルの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. ページ定義ファイルに関連するイテレータ・バインディングを作成します。例35-3を参考にしてください。

    Summit ADFサンプル・アプリケーションでは、ItemsForOrderIteratorによるProductIdのリスト・バインディングがshowshuttlePageDef.xmlファイルに追加されることで、先行リストに移入する製品のリストを提供します。

  2. ShuttleBeanクラスと同様のクラスを作成して、必要に応じて値を処理するメソッドを用意します。例35-1を参考にしてください。

  3. 必要なマネージドBeanと管理プロパティをタスク・フロー定義で構成します。バインドなしタスク・フローの場合はadfc-config.xmlファイルを構成します。例35-2を参考にしてください。

シャトル・コンポーネントを作成するには:

  1. 「アプリケーション」ウィンドウで、コンポーネントを表示するWebページをダブルクリックします。
  2. 「コンポーネント」ウィンドウの「ADF Faces」ページで、「テキストおよび選択」パネルからSelectManyShuttleまたはSelectOrderShuttleをドラッグしてページにドロップします。

    図35-13に示すように、シャトルの挿入ウィザードが表示されます。

    図35-13 「SelectManyShuttleの挿入」ウィザード

    図35-13の説明が続きます
    「図35-13 SelectManyShuttleの挿入ウィザード」の説明
  3. 「リストにバインド(アイテムを選択)」を選択し、「バインド」をクリックします。
  4. 「式ビルダー」で、ツリー構造を開いて、先行リストの値を移入する式を作成し、「OK」をクリックします。

    Summit ADFサンプル・アプリケーションで、「ADFバインディング」→bindings→ProductId→itemsを選択し、式#{bindings.ProductId.items}を作成して、「終了」をクリックします。これにより、selectManyShuttleコンポーネントのf:selectedItemタグをデータ・コレクションにバインドします。このタグにより、製品のリストをシャトルの先行リストに移入します。

    getAllProducts()などのメソッドを使用して先行リストの値を取得する場合は、このメソッドをマネージドBean内に作成する必要があります。その後、式ビルダーで、このメソッドにバインドします。

  5. 「次へ」をクリックします。
  6. 「共通プロパティ」ページで、「値」フィールドの横にある「バインド」をクリックします。
  7. 「式ビルダー」で、ツリーを開いて、後続リストの値を移入する式を作成し、「OK」をクリックします。

    Summit ADFサンプル・アプリケーションで、「ADFマネージドBean」→BackingBeanScope→ShuttleBean→selectedProductsを選択し、式#{backingBeanScope.ShuttleBean.selectedProducts}を作成してから、「終了」をクリックします。これにより、value属性をselectedProducts()メソッドにバインドします。このメソッドで、シャトルの後続リストに値を移入します。

  8. 選択された値を処理するために、別のコントロールを追加することもできます。

    Summit ADFサンプル・アプリケーションでは、「Done」というラベルの付いたaf:buttonコンポーネントがページに追加されます。このコンポーネントは、ShuttleBeanに定義されているonAddMultipleProductsメソッドをコールすることで、選択された製品を処理します。

データバインドされたシャトルの作成時の処理

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>