ヘッダーをスキップ
Oracle Application Development Framework Forms/4GL開発者のための開発者ガイド
10g(10.1.3.0)
B40013-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

14 表の追加

この章では、データ・コントロール・パレットを使用して、ADF Facesコンポーネントを使用するデータ・バインドされた表を作成する方法について説明します。

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

14.1 表の追加の概要

フォームと異なり、表を使用すると、コレクションのデータ・オブジェクトを一度に複数表示できます。図14-1に、SRDemoアプリケーションのSRListページを示します。このページでは、参照表を使用して、ログインしたユーザーの最新のサービス・リクエストを表示しています。

図14-1 サービス・リクエスト表

SRListページにはサービス・リクエストの一覧表が表示されます

コレクションを表としてドロップすると、ユーザーが特定の行を選択できるようにする行選択コンポーネントを追加できます。アクションにバインドされたコマンド・ボタンを追加すると、ユーザーはこれらのボタンをクリックして、なんらかのロジックを選択した行に対して実行できます。詳細は、17.3項「メソッドを実行するためのコマンド・コンポーネントの作成」を参照してください。また、必要に応じてデフォルトのコンポーネントを変更することもできます。

この章では次の内容について説明します。

14.2 基本表の作成

フォームを構成する個々のUIコンポーネントをコレクションの個々の属性にバインドするフォームと異なり、表では、ADF Facesのtableコンポーネントをコレクション全体にバインドするか、一度にコレクションのN個のレンジのデータ・オブジェクトにバインドします。表内の個々の列は、属性にバインドされます。イテレータ・バインディングによって各オブジェクトの適切なデータが表示され、tableコンポーネントによって各オブジェクトが1行で表示されます。JDeveloperを使用すると、宣言的にこの処理を行うことができるため、コードを記述する必要がありません。

14.2.1 基本表の作成方法

データ・コントロールを使用して表を作成するには、tableコンポーネントをビュー・オブジェクト・コレクションにバインドします。JDeveloperでは、データ・コントロール・パレットからコレクションをドラッグ・アンド・ドロップして、宣言的にこの処理を行うことができます。

データ・バインドされた表を作成する手順:

  1. データ・コントロール・パレットから、コレクションを選択します。

    たとえば、SRDemoアプリケーションのSRList表を作成するには、LoggedInUserコレクションの下にあるServiceRequestsByStatusコレクションを選択します。図14-2に、データ・コントロール・パレットのServiceRequestsByStatusコレクションを示します。

    図14-2 データ・コントロール・パレットのServiceRequestsByStatusコレクション

    ServiceRequestsByStatusコレクション

    ServiceRequestsを拡張するServiceRequestsByStatusコレクションは、ビュー・リンクServiceRequestsForUserがあるため、LoggedInUserコレクションの子です。また、ServiceRequestsByStatusコレクションには、サービス・リクエスト・ステータス・タイプ(未処理または保留中のリクエストなど)を表す、名前付きバインド変数StatusCodeがあります。SRListページで、未処理、保留中、処理済またはすべてのサービス・リクエストを表示するメニュー・バーでログインしたユーザーがコマンド・リンクを選択する場合、選択したステータス・タイプに対して、現在ログインしているユーザーによって作成された、またはこのユーザーに割り当てられたリクエストが戻されます。

  2. コレクションをJSFページにドラッグし、ポップアップ・メニューから適切な表を選択します。

    コレクションをドラッグする場合は、次の表のタイプから選択できます。

    • ADF表: 編集可能な表の列に表示する特定の属性と、データの表示に使用するUIコンポーネントを選択できます。デフォルトでは、コレクション・オブジェクトの各属性は、inputTextコンポーネントに表示されるため、表の編集が可能になります。

    • ADF読取り専用表: 「ADF表」と同じですが、各属性は、outputTextコンポーネントに表示されます。

    • ADF読取り専用動的表: 戻されて表示される属性が動的に決定されます。このコンポーネントは、対応するオブジェクトの属性が実行時まで不明な場合、あるいはJSFページに列名をハードコーディングしない場合に適しています。たとえば、多相コレクション(哺乳動物のコレクションまたは鳥のコレクションであるビュー・オブジェクト・コレクションなど)がある場合、動的表はそれに応じて異なる属性を表示できます。

    • ADFマスター表、インライン・ディテール表: 詳細は、15.6項「インライン表を使用したマスター表でのディテール・データの表示」を参照してください。

  3. 続いて表示される「表の列の編集」ダイアログから、次の操作ができます。

    • 列の表示ラベルの変更。デフォルトでは、ラベルは表バインディング上の属性のlabelsプロパティにバインドされます。labelsプロパティの詳細は、付録B「ADFバインディング・プロパティのリファレンス」を参照してください。labelsプロパティへのバインディングにより、ビジネス・ドメイン・レイヤーで定義したUIコントロール・ヒントからラベルが継承されるようになります。このため、1箇所でラベル・テキストの値を変更できるようになり、ラベルを表示するすべてのページ上に同じようにその変更を表示させることができます。「表の列の編集」ダイアログでは、かわりにテキストまたはEL式を入力して、ラベルの値を他の何か(リソース・ファイルのキーなど)にバインドできます。

      たとえば、SRListページの表のステータス列のヘッダーは、Statusキーを使用して属性を取得するlabelsプロパティにバインドされています。

      #{bindings.LoggedInUserServiceRequests.labels.Status}
      

      しかし、次の例のように、かわりにプロパティ・リソース・ファイルのキーにバインドされるようにヘッダーを変更できます。

      #{srlist['sr.status']}
      

      この例では、srlistは、プロパティ・ファイルのロードに使用されるJSFページに定義された変数です。リソース・バンドルの使用方法の詳細は、22.4項「アプリケーションの国際化」を参照してください。

      SRDemoページで主に使用されるのは、すべての属性に対して継承されたUIコントロール・ヒント、およびビュー・オブジェクト属性に直接関連しない他の種類のラベルに対するJSFリソース文字列です。

    • 列の属性バインディングの変更。

      たとえば、かわりにrequestDate属性にバインドされるようにステータス列を変更できます。この項の後半で説明されるように、単に列を再配置する場合は、順序ボタンを使用してください。列の属性バインディングを変更する場合は、次の点に注意してください。

      • バインディングを変更すると、列のラベルも変更されます。

      • 別の列に現在バインドされている属性にバインディングを変更すると、UIコンポーネントはその属性に現在バインドされている列に使用されるのとは異なるコンポーネントに変更されます。

    • 属性の表示に使用されるUIコンポーネントの変更。UIコンポーネントは、inputTextまたはoutputTextのいずれかで、コレクションをページにドロップする際に選択した表に基づいて設定されます。ドロップダウン・メニューを使用して別のコンポーネントに変更できます。別のコンポーネント(コマンド・リンク、コマンド・ボタンなど)を使用する場合は、このダイアログを使用してoutputTextコンポーネントを選択した後、構造ウィンドウで必要なUIコンポーネント(コマンド・リンクなど)に置き換える必要があります。

    • 順序ボタンを使用した列の順序の変更。「上」は、列を表の左1列目に移動します。「上へ」は、列を左へ1列移動します。「下へ」は、列を右へ1列移動します。「下」は、列を右端に移動します。

    • 「新規」ボタンを使用した列の追加。追加する行の数に制限はありません。最初に「新規」をクリックすると、JDeveloperではダイアログの下部に新規列の行が追加され、そこにバインドされたコレクションの最初の属性のデフォルト値が移入されます。後続の新規列は順序内の次の属性の値が移入され、その後も同様に続きます。

    • 「削除」ボタンを使用した列の削除。このボタンを使用して列を削除すると、表から列が削除されます。

    • 「選択を有効にする」の選択による表のselectionファセットへのtableSelectOneコンポーネントの追加。詳細は、14.6項「表での行選択の有効化」を参照してください。

    • 「ソートの有効化」の選択によるすべての列に対するソートの有効化。

14.2.2 データ・コントロール・パレットを使用した表の作成時に発生する処理

データ・コントロール・パレットから表をドロップすると、テキスト・フィールドまたはフォームをドロップするのと同じ効果があります。詳細は、13.2.2項「データ・コントロール・パレットを使用してテキスト・フィールドを作成した場合の処理」を参照してください。要約すると、JDeveloperにより次の処理が行われます。

  • 表のバインディングが作成され、そのバインディングがページ定義ファイルに追加されます。

  • UIコンポーネントに必要なコードがJSFページに追加されます。

14.2.2.1 表のイテレータと値バインディング

データ・コントロール・パレットから表をドロップすると、表の値バインディングが作成されます。フォームで使用される属性バインディングと同様に、表の値バインディングによってイテレータ・バインディングが参照され、イテレータ・バインディングによってデータ・コレクションのイテレータが参照されます。これにより、コレクションのデータ・オブジェクト全体の反復が機能します。属性ごとに異なるバインディングが作成されるのではなく、表バインディングのみが作成されます。表バインディングでは、表の各行で表示または参照できるようにする属性ごとの子要素が、AttrNames要素に含まれています。例14-1に、ServiceRequestsByStatusコレクションをドロップすると作成される表の値バインディングを示します。

例14-1 ページ定義ファイルにおける表の値バインディング・エントリ

<table id="LoggedInUserServiceRequests"
       IterBinding="ServiceRequestsByStatusIterator">
  <AttrNames>
    <Item Value="SvrId"/>
    <Item Value="Status"/>
    <Item Value="RequestDate"/>
    <Item Value="ProblemDescription"/>
    <Item Value="ProdId"/>
    <Item Value="CreatedBy"/>
    <Item Value="AssignedTo"/>
    <Item Value="AssignedDate"/>
  </AttrNames>
</table>

データへアクセスする必要があるのは表のUIコンポーネントのみであるため、表の値バインディングのみが必要です。表の列は、表バインディングからその情報を導出します。

14.2.2.2 ADF Faces表のJSFページのコード

データ・コントロール・パレットを使用してJSFページに表をドロップすると、バインド先のオブジェクトの属性ごとに1列が含まれる表が作成されます。これを実行するために、JDeveloperでADF Facesのtableコンポーネントが挿入されます。このコンポーネントには、表バインディングの名前の付いた各属性にADF Facesのcolumnコンポーネントが含まれています。各列には、属性の値にバインドされたinputまたはoutputTextコンポーネントが含まれます。各列のヘッダーは、表バインディングの属性のlabelsプロパティにバインドされます。例14-2に、SRListページの表から抜粋した、簡略化されたコードを示します。

例14-2 ADF Faces表の簡略化されたJSFコード

<af:table value="#{bindings.LoggedInUserServiceRequests.collectionModel}"
          var="row" ..>
  ...
  <af:column headerText="#{bindings.LoggedInUserServiceRequests.labels.Status}"
             sortProperty="Status" sortable="false">
    <af:outputText value="#{row.Status}"/>
  </af:column>
  <af:column
           headerText="#{bindings.LoggedInUserServiceRequests.labels.RequestDate}"
           sortProperty="RequestDate" sortable="false">
    <af:outputText value="#{row.RequestDate}">
      <f:convertDateTime
           pattern="#{bindings.LoggedInUserServiceRequests.formats.RequestDate}"/>
    </af:outputText>
  </af:column>
  ...
</af:table>

表バインディングは、イテレータ・バインディングによって公開されたデータ全体を反復します。FacesCtrlRangeBindingクラスは、ベースJUCtrlRangeBindingクラスを拡張して、特定のメソッドをベース表バインディング・オブジェクトに追加します。このようなメソッドの1つはgetCollectionModelメソッドであり、これは、表バインディングのcollectionModelプロパティを使用してELがアクセスするメソッドです。表は、イテレータ・バインディングからの結果セットをoracle.adf.view.faces.model.CollectionModelオブジェクト内にラップします。表バインディングが反復処理を実行すると、コレクションの各アイテムは、var属性を使用してtableコンポーネント内で使用できるようになります。

例では、表がServiceRequestsByStatusIteratorイテレータ・バインディングの現在レンジの行全体を反復します。イテレータ・バインディングは、現在行の追跡を続行する行セット・イテレータにバインドします。表のvar属性をrowに設定すると、次のaf:outputTextタグの値に示すように、各列はrow変数を使用して、表タグに示される現在行の現在データ・オブジェクトにアクセスします。

<af:outputText value="#{row.Status}"/>

表14-1は、データ・コントロール・パレットを使用して作成されたADF Faces表に対して、デフォルトで定義された他の属性を示します。

表14-1 ADF Faces表の属性と移入される値

属性 説明 デフォルト値

rows

一度に表示する行数を決定します。

関連付けられたイテレータ・バインディングのrangeSizeプロパティに評価されるEL式。この属性の詳細は、14.3項「表へのレンジ・ナビゲーションの組込み」を参照してください。rows属性の値は、対応するイテレータのrangeSize値以下にします。

first

レンジの最初の行の索引(ベース0)。

関連付けられたイテレータ・バインディングのrangeStartプロパティに評価されるEL式。この属性の詳細は、14.3項「表へのレンジ・ナビゲーションの組込み」を参照してください。

emptyText

戻す行がない場合に表示するテキスト。

イテレータの表示可能なプロパティに評価されるEL式。表が表示できる場合に戻すオブジェクトがないときは、「まだ行がありません」と表示されます。表が表示できない場合(表に対して認可の制限が設定されている場合など)は、「アクセスは制限されました」と表示されます。

列の属性



sortProperty

列をソートする対象となるプロパティを決定します。

列の対応する属性バインディング値に設定します。

sortable

ソートできる列かどうかを決定します。

falseに設定します。trueに設定すると、表はイテレータによって戻される行のみをソートします。


さらに、表の作成時に選択の有効化を選択した場合、表はselectionファセット、selection属性およびselectionListener属性も保持します。詳細は、14.6項「表での行選択の有効化」を参照してください。

14.3 表へのレンジ・ナビゲーションの組込み

組込み操作を使用してフォームと同様のナビゲーションを実行するかわりに、ADF Faces表では、tableコンポーネントに自動的に組み込まれるselectRangeChoiceBarコンポーネントを使用して組込みナビゲーションを提供します。selectRangeChoiceBarコンポーネントは、現在のページに表示するレコードのレンジを選択するために、ドロップダウン・メニューと「前へ」および「次へ」のリンクをレンダリングします。図14-3に、表におけるselectRangeChoiceBarコンポーネントの表示の例を示します。

図14-3 表におけるselectRangeChoiceBar

SRListの表では一連のサービス・リクエスト間をナビゲートできます

14.3.1 表でのナビゲーション・コントロールの使用方法

tableコンポーネント上のrows属性は、レンジ内に表示する行の最大数を決定します。次のSRList表のrows属性に対するコードSnippetが示すように、データ・コントロール・パレットを使用して表を作成する場合、デフォルトではJDeveloperでイテレータのrangeSize値と等しい行のレンジを表示するように表が設定されます。

<af:table rows="#{bindings.LoggedInUserServiceRequests.rangeSize}".../>

rows属性のEL式は、イテレータのレンジ・サイズに対して評価します。これはページ定義ファイルで定義されます。

<executables>
  <iterator id="ServiceRequestsByStatusIterator" RangeSize="10"
            Binds="ServiceRequestsByStatus" DataControl="SRService"/>
  </executables>

デフォルトでは、RangeSize値は10です。つまり、現在のページに表示するために一度に10個のレコードが戻されます。

現在のページに表示するために戻すレコード数を変更するには、ページ定義ファイルのRangeSize値を編集します(tableコンポーネントのrows属性を直接編集するのではありません)。

イテレータのRangeSize値を変更するのではなく、tableコンポーネントのrows属性を直接変更する場合は、必ずrowsの値がイテレータのRangeSize値以下であることを確認してください。RangeSize属性の詳細は、13.4.2.2項「イテレータのRangeSize属性」を参照してください。

14.3.2 表でのナビゲーション・コントロールの使用時に発生する処理

selectRangeChoiceBarコンポーネントは、コレクション内のオブジェクトの次のレンジおよび前のレンジを選択できるようにするナビゲーション・リンクを示します。コレクションの合計サイズが認識されている場合は、図14-3に示すように、コレクション内の特定のレンジ・セットに直接ナビゲートできるようにするドロップダウン・メニューを示します。イテレータのRangeSize属性を変更すると、新規レンジ・セットを表示するようにselectRangeChoiceBarコンポーネントも自動的に変更されます。

tableコンポーネントのrows属性は、レンジを設定するためにfirst属性とともに使用されます。first属性(レンジ内の行のゼロベースの索引)は、現在のレンジの1行目を決定します。デフォルトでは、rows属性は、関連付けられたイテレータのrangeSize属性の値にその値をバインドするEL式を使用します。first属性はEL式も使用しますが、式はイテレータのrangeStart属性の値にバインドします。たとえば、SRListページの表のrows属性とfirst属性の値は、次のとおりです。

<af:table rows="#{bindings.LoggedInUserServiceRequests.rangeSize}"
          first="#{bindings.LoggedInUserServiceRequests.rangeStart}"

現在のレンジはそれぞれ、firstによって特定された行で始まり、rows属性によって指定されるのと同じ行数のみが含まれます。

14.3.3 実行時に行われる処理

使用するselectRangeChoiceBarに対するレンジ・セットを決定するために、ビュー・オブジェクトが最初のRangeSizeの行数を取得してから停止し、表がgetEstimatedRowCount()メソッドをコールして別個のSELECT COUNT(*) FROM (...)問合せを作成します。これによって、実際にすべてを取得しなくても、問合せが取得する行の合計数が概算されます。getEstimatedRowCount()メソッドの詳細は、5.6.2項「行セットにおける行数計算」を参照してください。

アクション・バインディングのロジックに依存してナビゲーションを提供するナビゲーション操作と異なり、selectRangeChoiceBarコンポーネントは、RangeChangeEventイベントを送信します。ユーザーがselectRangeChoiceBarコンポーネントによって示されるナビゲーション・リンク(「前へ」「次へ」など)の1つを選択して別のレンジにナビゲートすると、表によってRangeChangeEventイベントが生成されます。このイベントには、現時点でレンジの一番上にある必要のあるオブジェクトの索引が含まれます。表は、このイベントに応じてfirst属性の値をこの新しい索引に変更します。

RangeChangeEventイベントには、リスナーが関連付けられています。表のRangeChangeListener属性は、マネージドBeanのメソッドにバインドできます。このメソッドは、RangeChangeEventイベントに応えて、つまり、ユーザーによる表のレンジの変更に応じて表がfirst属性を変更するたびに起動されます。このバインディングは、たとえば、前のレンジに対して作成されたキャッシュ済データを解放する必要がある場合など、ユーザー・ナビゲーションに応えてなんらかの補足アクションが発生する必要がある場合に適しています。組込み操作の前後へのロジックの追加の詳細は、17.5項「宣言メソッドのオーバーライド」を参照してください。

14.3.4 ブラウザの「戻る」ボタンについての考慮事項

ブラウザの「戻る」ボタンを使用すると、第13章で説明したものと同じ問題が発生することに注意してください。詳細は、13.4.4項「ブラウザの「戻る」ボタンについての考慮事項」を参照してください。イテレータは現在オブジェクトを追跡するため、ユーザーがページのナビゲーション・ボタンを使用するかわりにブラウザの「戻る」ボタンをクリックすると、イテレータが無視されるので、イテレータと表示されるページとの同期がずれてしまいます。フォームの場合と同様に、表ではブラウザの「戻る」 ボタンを使用する際に示されるページに表示される現在行(またはレンジあるいは複数の行)が、現在行およびレンジのイテレータ・バインディングの概念に対応しないことがあります。

たとえば、図14-1に示したSRListページでは、IDが4のサービス・リクエストを選択した後、IDのリンク、「表示」ボタンまたは「編集」ボタンのいずれかを使用してページを移動すると、イテレータはサービス・リクエスト4を表すオブジェクトに設定されます。(13.4.4項「ブラウザの「戻る」ボタンについての考慮事項」の手順で説明したように)EnableTokenValidationtrueに設定した場合は、ページのトークンも4に設定されます。ブラウザの「戻る」ボタンを使用すると、何事も問題ないように見え、同じレンジが表示されます。ただし、別のボタンをクリックすると、現在行が同期していないことを示すエラーが表示されます。これは、表示されたページはトークンが0に設定された前のページであるのに、イテレータは4になっているためです。

14.4 表に表示される属性の変更

データ・コントロール・パレットを使用して表を作成したら、属性の削除、表示順序の変更、表示に使用されるコンポーネントの変更、コンポーネントの属性バインディングの変更ができます。また、新規属性を追加することもできます。新規属性を追加する前に、表に表示する属性が表バインディングに含まれていることを確認してください。

14.4.1 表示される属性の変更方法

データ・コントロール・パレットを使用して作成された表は、次のような変更ができます。

  • 行のラベルに対するバインディングの変更

  • UIコンポーネントがバインドされている属性の変更

  • 属性にバインドされているUIコンポーネントの変更

  • 表内の列の並替え

  • 表内の列の削除

  • 表への列の追加

表の属性を変更する手順:

  1. 構造ウィンドウで、af:tableを右クリックし、「列の編集」を選択します。

  2. 「表の列の編集」ダイアログでは、次の操作ができます。

    • 列の表示ラベルの変更。デフォルトでは、ラベルは表バインディング上の属性のlabelsプロパティにバインドされます。labelsプロパティの詳細は、付録B「ADFバインディング・プロパティのリファレンス」を参照してください。labelsプロパティへのバインディングにより、ビジネス・ドメイン・レイヤーで定義したUIコントロール・ヒントからラベルが継承されるようになります。このため、1箇所でラベル・テキストの値を変更できるようになり、ラベルを表示するすべてのページ上に同じようにその変更を表示させることができます。このダイアログでは、かわりにテキストまたはEL式を入力して、ラベルの値を他の何か(リソース・ファイルのキーなど)にバインドすることができます。

      たとえば、SRListページの表のステータス列のヘッダーは、Statusキーを使用して属性を取得するlabelsプロパティにバインドされています。

      #{bindings.LoggedInUserServiceRequests.labels.Status}
      

      しかし、次の例のように、かわりにプロパティ・リソース・ファイルのキーにバインドされるようにヘッダーを変更できます。

      #{srlist['sr.status']}
      

      この例では、srlistは、プロパティ・ファイルのロードに使用されるJSFページに定義された変数です。リソース・バンドルの使用方法の詳細は、22.4項「アプリケーションの国際化」を参照してください。

    • 列の属性バインディングの変更。

      たとえば、かわりにRequestDate属性にバインドされるようにステータス列を変更できます。次のことに注意してください。

      • バインディングを変更すると、列のラベルも変更されます。

      • 別の列に現在バインドされている属性にバインディングを変更すると、UIコンポーネントはその属性に現在バインドされている列に使用されるのとは異なるコンポーネントに変更されます。

      この項の後半で説明されるように、単に列を再配置する場合は、順序ボタンを使用してください。

    • 属性の表示に使用されるUIコンポーネントの変更。UIコンポーネントは、inputTextまたはoutputTextのいずれかで、コレクションをページにドロップする際に選択した複合コンポーネントに基づいて設定されます。ドロップダウン・メニューを使用して別のUIコンポーネントに変更できます。まったく別のコンポーネント(コマンド・リンク、コマンド・ボタンなど)を使用する場合は、このダイアログを使用してoutputTextコンポーネントを変更した後、構造ウィンドウでoutputTextコンポーネントを必要なUIコンポーネント(コマンド・リンクなど)に置き換える必要があります。


      ヒント:

      次のUIコンポーネントを表内で使用する際は、注意事項を考慮してください。
      • selectBooleanCheckboxコンポーネントは、boolean型またはjava.lang.Boolean型のみを処理する場合に、表の内部で使用できます。

      • selectOneListbox/Choice/Radioコンポーネントは、選択肢のリストを列挙として手動で追加する場合に、表の内部で使用できます。かわりにリスト・バインディングを使用する場合は、selectOne UIコンポーネントを表の内部で使用することはできません。リスト・バインディングの詳細は、19.7項「選択リストの作成」を参照してください。


    • 順序ボタンを使用した列の順序の変更。「上」は、列を表の左1列目に移動します。「上へ」は、列を左へ1列移動します。「下へ」は、列を右へ1列移動します。「下」は、列を右端に移動します。

    • 「新規」ボタンを使用した列の追加。このボタンを使用して列を追加すると、新しい列がダイアログの下部に追加され、デフォルトでコレクションの次の順の属性から値が移入されます。値は、編集する必要があります。選択できるのは、表がバインドされているオブジェクトに関連付けられた属性のみです。

    • 「削除」ボタンを使用した列の削除。このボタンを使用して列を削除すると、表から列が削除されます。

    • 「選択を有効にする」の選択による表のselectionファセットへのtableSelectOneコンポーネントの追加。詳細は、14.6項「表での行選択の有効化」を参照してください。

    • 「ソートの有効化」の選択によるソート機能の追加。

14.4.2 表のバインディングの変更方法

バインディングを変更するかわりに、表がバインドされているオブジェクトを完全に変更することができます。

表をリバインドする手順:

  1. 構造ウィンドウで表を右クリックし、「バインディングを編集」を選択して表バインディング・エディタを起動します。

  2. エディタで、表のバインド先とする新しいコレクションを選択します。表のバインディングを変更すると、すべての列のバインディングも変更されます。14.4.1項「表示される属性の変更方法」の手順に従って、これらのバインディングを変更できます。

14.4.3 バインディングまたは表示される属性の変更時に発生する処理

UIコンポーネントを移動または変更して単に属性の表示方法を変更すると、JSFページの対応するコードが変更されます。バインディング・エディタを使用してバインディングを追加または変更すると、JDeveloperによって、JSFページにコードが追加され、ページ定義ファイルに適切な要素が追加されます。

14.5 表への非表示機能の追加

detailStampファセットを表内で使用すると、表示または非表示にできるデータを挿入できます。コンポーネントをこのファセットに追加すると、表には「詳細」という追加の列がトグルスイッチとともに表示されます。トグルスイッチをクリックすると、ファセットに追加されたコンポーネントが表示されます。トグルスイッチを再度クリックすると、コンポーネントは非表示になります。ファセットの概要は、13.3.2.1項「ファセットの使用方法」を参照してください。図14-4に、outputTextコンポーネントのサービス・リクエストの説明が表内でどのように非表示または表示されるかを示します(この機能は現在SRDemoアプリケーションには存在しません)。

図14-4 detailStampファセットの出力UIコンポーネントを使用する表

問題の説明テキストは行の下に隠すことができます。

マスター/ディテール関係がある別のオブジェクトの詳細を表示する場合(たとえば、サービス・リクエストが割り当てられているユーザーの詳細を表示する場合など)は、Master Table-Inline Detail複合コンポーネントを使用できます。マスター/ディテール関係およびマスター/ディテール複合コンポーネントの使用の詳細は、15.6項「インライン表を使用したマスター表でのディテール・データの表示」を参照してください。

14.5.1 detailStampファセットの使用方法

detailStampファセットを使用するには、表示または非表示にするデータにバインドされているコンポーネントをファセットに挿入します。また、すべての詳細を一度に表示または非表示にできるようにするリンクを作成する属性を表に設定できます。

detailStampファセットを使用する手順:

  1. データ・コントロール・パレットから、ファセット内に表示する属性をdetailStampファセット・フォルダにドラッグします。図14-5に、構造ウィンドウでのdetailStampファセット・フォルダの表示方法を示します。

    図14-5 構造ウィンドウでのdetailStampファセット・フォルダ

    detailStampファセットは表の様々なファセットの1つです。
  2. 次に、ポップアップ・メニューから、属性を表示するUIコンポーネントを選択します。

  3. すべての詳細を一度に非表示または表示できるようにするリンクが必要な場合は、構造ウィンドウで表を選択します。次に、プロパティ・インスペクタでallDetailsEnabled属性をtrueに設定します。

  4. 表示する属性が現在レコードに固有である場合は、表の変数を使用して現在レコードのデータを表示するように、コンポーネントを属性に単にバインドするJSFコードを置き換える必要があります。

    たとえば、属性をドラッグすると、次のコードが挿入されます。

    <f:facet name="detailStamp">
      <af:outputText value="#{bindings.<attributename>.inputValue}"/>
    </f:facet>
    

    このコードを次のように変更する必要があります。

    <f:facet name="detailStamp">
      <af:outputText value="#{row.<attributename>}"/>
    </f:facet>
    

14.5.2 detailStampファセットの使用時に発生する処理

detailStampファセット・フォルダに属性をドラッグすると、属性値バインディングがページ定義ファイルに存在しない場合は追加されます。また、ファセットのコードがJSFページに追加されます。

たとえば、SRListページで、必要に応じてサービス・リクエストの説明を非表示にできるようにするとします。表はServiceRequestsByStatusコレクションを使用して作成されているため、構造ウィンドウでProblemDescription属性をドラッグしてdetailStampファセット・フォルダ内にドロップできます。

例14-3に、JSFページに追加されるコードを示します。

例14-3 detailStampファセットのJSFコード

<f:facet name="detailStamp">
  <af:outputText value="#{bindings.ServiceRequestsByStatusProblemDescription.inputValue}"/>
</f:facet>

次に、コンポーネントが表の変数を使用して各行の正しい問題の説明にアクセスするように、このコードを変更する必要があります。例14-4に、row変数を使用した後のコードを示します。

例14-4 detailStampファセットの変更されたJSFコード

<f:facet name="detailStamp">
  <af:outputText value="#{row.ServiceRequestsByStatusProblemDescription}"/>
</f:facet>

14.5.3 実行時に行われる処理

ユーザーが行の詳細を非表示または表示にすると、表によってDisclosureEventイベント(あるいは、表のallDetailsEnabled属性がtrueに設定されている場合はDisclosureAllEventイベント)が生成されます。このイベントは、詳細を切り替える(開くまたは閉じる)ように表に指示します。

DisclosureEventイベントには、リスナーが関連付けられています。表のDisclosureListener属性は、マネージドBeanのメソッドにバインドできます。このメソッドは、DisclosureEventイベントに応えて起動され、必要な後処理を実行します。

14.6 表での行選択の有効化

tableSelectOneコンポーネントまたはtableSelectManyコンポーネントが表のselectionファセットに追加されると、表に「選択」列が表示されます。この列により、ユーザーは、1行のみまたは1行以上を選択し、コマンド・ボタンを通じてなんらかのアクションをそれらの行に実行できます。

tableSelectOneコンポーネントを使用すると、1行のみ選択できます。図14-6のように、このコンポーネントにより、「Select」列の各行に対してラジオ・ボタンが提供されます。たとえば、SRListページの表には、1行を選択できるtableSelectOneコンポーネントがあり、「View」または「Edit」コマンド・ボタンのいずれかをクリックして、選択されたサービス・リクエストの詳細を表示または編集できます。

図14-6 SRList表でのtableSelectOneコンポーネントの使用

SRList表で1行を選択できます。

tableSelectManyコンポーネントは、「Select」列の各行に対するチェック・ボックスを示し、ユーザーは1行以上を選択できます。tableSelectManyコンポーネントを使用すると、図14-7のように、行のすべてを選択または選択解除できるテキスト・リンクも追加されます。たとえば、SRMainページの表には、ユーザーが複数レコードを選択できるtableSelectManyコンポーネントがあり、「Delete Service History Record」コマンド・ボタンをクリックすると選択されたレコードを削除できます。

図14-7 サービス履歴表でのtableSelectManyコンポーネントの使用

履歴表で複数の行を選択できます。

表の行を選択するどちらのコンポーネントにも、ユーザーへの指示となる値を保持するtext属性があります。表の行選択コンポーネントも、通常、選択された行に対してなんらかのアクションを実行するために使用されるコマンド・ボタンまたはコマンド・リンクを子として保持します。たとえば、SRListページの表にはコマンド・ボタンがあり、選択されたサービス・リクエストを表示または編集できます。

tableSelectOnetableSelectManyの両コンポーネントのrequired属性は、trueに設定できます。この値に設定すると、行が選択されていない場合はエラーがスローされます。しかし、required属性を設定する場合は、必須入力エラー・メッセージを正しく表示するために、summary属性も表に設定する必要があります。required属性の詳細は、20.3.1.1.1項「検証属性の使用」を参照してください。

autoSubmit 属性をtableSelectOneおよびtableSelectManyコンポーネントに設定することもできます。autoSubmit属性をtrueに設定すると、選択が行われたときに、表を保持するフォームが自動的に送信されます。詳細は、11.6項「ADF Facesのベスト・プラクティス」を参照してください。

tableSelectOnetableSelectManyを使用するための手順はまったく異なります。ADFアプリケーションでは、操作(メソッドなど)は、イテレータが追跡している現在のデータ・オブジェクトに対して作用します。tableSelectOneコンポーネントは、現在のデータ・オブジェクトを選択中として表示できます。また、新たに選択された行をイテレータの現在オブジェクトに設定できます。同じイテレータが後続のページで使用される場合(たとえば、行の選択後にコマンド・ボタンをクリックしてオブジェクトを編集できるページにナビゲートする場合など)は、選択されたオブジェクトが表示されます。このように動作するのは、イテレータとコンポーネントが単一のオブジェクトを処理するためです。異なるバインディング・コンテナの異なるイテレータ・バインディングが同じ行セット・イテレータにバインドされるため、現在行の概念は同じです。

しかし、tableSelectManyコンポーネントでは、選択されたオブジェクトが複数存在します。ADFモデル・レイヤーには、「現在」とは対照的な「選択」という概念はありません。操作をオブジェクトに対して実行できるように、選択された各オブジェクトをループして、順に現在オブジェクトにするロジックをモデル・レイヤーに追加する必要があります。

14.6.1 selectionファセットにおけるtableSelectOneコンポーネントの使用方法

コレクションを表としてデータ・コントロール・パレットからドロップする際に、selectionファセットの挿入を選択できます。「選択を有効にする」を選択すると、tableSelectOneコンポーネントがtableSelectOneの子である「発行」 commandButtonコンポーネントとともにselectionファセットに挿入されます。


注意:

データ・コントロール・パレットを使用して表を作成する場合、tableSelectManyコンポーネントは挿入できません。このコンポーネントは、表の作成後に手動で追加する必要があります。ただし、ADFアプリケーションで複数選択処理を使用するには、追加コードを作成する必要があります。詳細は、14.6.5項「selectionファセットにおけるtableSelectManyコンポーネントの使用方法」を参照してください。

「発行」ボタンをメソッドにバインドする場合は、選択したメソッドまたは操作にcommandButtonコンポーネントをリバインドする必要があります。リバインドの手順は、21.6項「アクションへのADFバインディングの追加」を参照してください。

また、tableSelectOneコンポーネントをselectionファセットに手動で追加できます。

selectionファセットを手動で使用する手順:

  1. 構造ウィンドウで、af:tableを選択し、ポップアップ・メニューから「列の編集」を選択します。

  2. 「表の列の編集」ダイアログで、「選択を有効にする」を選択し、「OK」をクリックします。

    tableSelectOneコンポーネントが(必要なリスナーとtableコンポーネントでの選択と連携して機能する属性とともに)selectionファセット・フォルダに追加されます。

  3. 構造ウィンドウで、表のselectionファセット・フォルダを開き、af:tableSelectOneを選択します。

  4. 新しいコンポーネントのプロパティ・インスペクタで、選択の処理に使用されるコマンド・ボタンまたはコマンド・リンクの使用に関する指示を示すtext属性の値を入力します。

  5. (オプション): 「発行」コマンド・ボタンをデータ・コントロール・パレットから選択したメソッドまたは操作にリバインドします。リバインドの手順は、21.6項「アクションへのADFバインディングの追加」を参照してください。メソッドを使用したコマンド・ボタンの作成の詳細は、17.3項「メソッドを実行するためのコマンド・コンポーネントの作成」を参照してください。


    注意:

    コマンド・コンポーネントをファセットに追加しないかぎり、text属性の値は表示されません。

14.6.2 tableSelectOneコンポーネントの使用時に発生する処理

例14-5に示すように、表の初回作成時または後からの表の編集時に選択の有効化を選択すると、text属性の値としてSelect andが設定されたtableSelectOneコンポーネントがselectionファセットに挿入されます。「発行」コマンド・ボタンも子として挿入されます。

例14-5 selectionファセットのコード

<f:facet name="selection">
  <af:tableSelectOne text="Select and">
    <af:commandButton text="Submit"/>
</af:tableSelectOne>

例14-6に示すように、表のselectionState属性の値は、イテレータから作成されたコレクション・モデルの選択された行に評価されるEL式です。selectionListener属性の値は、コレクション・モデルのmakeCurrentメソッドに評価されます。この値は、選択ファセットが選択された行を現在オブジェクトとしてイテレータに設定できるようにするものです。

例14-6 表でのselection属性

<af:table var="row"
   rows="#{bindings.ServiceRequests.rangeSize}"
   first="#{bindings.ServiceRequests.rangeStart}"
   selectionState="#{bindings.ServiceRequests.collectionModel.selectedRow}"
   selectionListener="#{bindings.ServiceRequests.collectionModel.makeCurrent}"...>

14.6.3 実行時に行われる処理

ユーザーが選択を行い、関連付けられたコマンド・ボタンをクリックすると、tableSelectOneコンポーネントにより、表のgetSelectionState()メソッドをコールして取得されたRowKeySetが更新されます。選択の状態はコレクション・モデルの選択された行に評価されるため、その行は選択済としてマークされます。この選択は、コマンド・ボタンに関連付けられたActionListenerをコールする前に実行されます。

tableSelectOneコンポーネントの場合、ActionListenerの起動前に現在行が選択されるため、コマンド・ボタンのActionListenerを、行のデータに対して該当する処理を実行するマネージドBeanのメソッドにバインドできます。あるいは、単にロジックを宣言メソッドに追加できます。詳細は、17.5項「宣言メソッドのオーバーライド」を参照してください。

tableSelectOneコンポーネントは、表の選択の状態が変更されると、SelectionEventイベントをトリガーします。SelectionEventは、選択された行と選択解除された行をレポートします。SelectionListener属性はコレクション・モデルのmakeCurrentメソッドにバインドされているため、イベントが発生するとこのメソッドが起動し、イテレータに新しい現在行を設定します。

14.6.4 selectionファセットのかわりにリンクを使用することについての考慮事項

14.6.1項「selectionファセットにおけるtableSelectOneコンポーネントの使用方法」で説明したように、コレクションを表としてドロップして同時に「選択を有効にする」を選択する場合、または「表の列の編集」ダイアログを使用して後から選択を有効化する場合に、commandButtonコンポーネントはtableSelectOneコンポーネントの子として自動的に追加されます。tableSelectOneコンポーネントは、tableコンポーネントのselectionファセットに挿入されます。

表で選択を行う場合、tableSelectOneコンポーネントは選択された行をイテレータの現在オブジェクトとして設定します。次に、ユーザーは選択された行にコマンド・ボタンを使用してなんらかのアクションを実行できます。

selectionファセットのコンポーネントを使用して現在オブジェクトを設定し、次のページへ移動するためのcommandButtonを提供するかわりに、リンクをクリックして選択に対して操作を実行し、かつ別のページに移動できるようにするcommandLinkコンポーネントを使用できます。図14-6のように、表の2番目の列を使用すると、最初に行を選択し、次にコマンド・ボタンをクリックしてアクションを実行して移動する必要がある手順が省略されます。列リンクを追加する場合、現在オブジェクトをイテレータ・バインディングに手動で設定する必要があります。現在オブジェクトの手動設定の詳細は、14.7項「コマンド・コンポーネントを使用した現在オブジェクトの設定」を参照してください。


ヒント:

後続のページで同じイテレータを使用しない場合は、通常、選択された行を表すパラメータを後続のページ用に手動で設定する必要があります。たとえば、SRListページから、ユーザーがサービス・リクエストを選択してから「Edit」コマンド・ボタンをクリックする場合、アプリケーションはSREditページに移動します。ここで、選択されたサービス・リクエストの正しいデータが表示されます。「Edit」コマンド・ボタンは、setCurrentRowWithKeyアクション・バインディングを使用しており、移動の前にprocessScopeに適切な値を設定するためのaf:setActionListenerタグが含まれます。SREditページには、setCurrentRowWithKey操作を起動するinvokeActionオブジェクトがあります。rowKey NamedData要素にバインドされる値は、パラメータとして渡され、それによって表示する現在行が決定されます。詳細は、17.4項「コマンド・コンポーネントを使用したパラメータ値の設定」を参照してください。

14.6.5 selectionファセットにおけるtableSelectManyコンポーネントの使用方法

データ・コントロール・パレットを使用して表を作成する場合、tableSelectManyコンポーネントは挿入できません。このコンポーネントは、表の作成後に手動で追加する必要があります。

tableSelectOneコンポーネントとは異なり、tableSelectManyコンポーネントでは、選択されたオブジェクトが複数存在します。

ADF表バインディングを使用する表にtableSelectManyコンポーネントを追加する場合、それぞれを順番に処理するメソッドに、選択されたキーのセットを渡す必要があります。

ADFアプリケーションでtableSelectManyコンポーネントを使用する手順:

  1. 14.2.1項「基本表の作成方法」に示すように表を作成します。ただし、「選択を有効にする」は選択しないでください。

  2. 構造ウィンドウで、Table facetsフォルダを開き、selectionファセット・フォルダを右クリックして、「selectionの中に挿入」「TableSelectMany」の順に選択します。

  3. 構造ウィンドウでaf:tableノードを選択し、必要に応じて、プロパティ・インスペクタでSelectionState属性およびSelectionListener属性の値を削除します。そうすることで、コンポーネントが選択された行の1つを現在オブジェクトに設定することを防ぎます。このロジックは、作成するコードによって処理する必要があるためです。

  4. データ・コントロール・パレットから、選択されたオブジェクトに対して作用するメソッドをaf:tableSelectManyノードの上にドラッグします。次に、ポップアップ・メニューから「作成」 「ADFコマンド・ボタン」を選択します。そうすることで、メソッドがcommandButtonコンポーネントとしてドロップされます。メソッドがパラメータを受け入れる場合は、メソッドに対してパラメータ値を設定する必要があります。

    たとえば、SRMainページを作成して、サービス・リクエストに関連付けられる複数のサービス履歴レコードをユーザーが削除できるようにするには、カスタムdeleteServiceHistoryNotes(Set)操作をaf:tableSelectManyノード上にドラッグします。

  5. アクション・バインディング・エディタの「値」フィールドの省略記号(...)ボタンをクリックしてEL式ビルダーを開き、各パラメータの値を入力します。パラメータの値を表すノードを選択します。

    たとえば、SRMainページの表が、backing_SRMainという名前のマネージドBeanのhistoryTableプロパティにバインドされます。表内の選択された行セットにアクセスするには、パラメータの値として次のように使用します。

    #{backing_SRMain.historyTable.selectionState.keySet}
    

    詳細は、17.3.1項「サービス・メソッドにバインドされたコマンド・コンポーネントの作成方法」を参照してください。

  6. ロジックを追加して、宣言メソッドが選択された行セットに対して操作できるようにします。ロジックを追加するには、コマンド・ボタンのドロップ時に作成される宣言メソッドをオーバーライドします。手順は、17.5項「宣言メソッドのオーバーライド」を参照してください。要約すると、コマンド・ボタンのaction属性を、追加されたロジックを持つバッキングBeanメソッドにバインドすることにより、宣言メソッドをオーバーライドします。例14-11は、SRMainページのために作成されたバッキングBeanメソッドonDeleteHistoryRows()を示します。

14.6.6 tableSelectManyコンポーネントの使用時に発生する処理

tableSelectManyコンポーネントを表に挿入して、サービス・メソッドにバインドされたコマンド・ボタンを追加すると、次の処理が実行されます。

  • tableSelectManyおよびcommandButtonコンポーネントがtableコンポーネントのselectionファセットに追加されます。

  • ページ定義ファイルでバインドされたメソッドに対してメソッド・バインディングが作成され、メソッドをボタンとしてドロップしたときに決定される、メソッドに必要なパラメータ(存在する場合)の値を保持するNamedData要素が挿入されます。

例14-7は、tabletableSelectMany、およびcommandButtonコンポーネントのコードを示します。

例14-7 tableSelectManyコンポーネントを使用する表のJSFコード

<af:table value="#{bindings.ServiceHistories.collectionModel}" var="row"
          rows="#{bindings.ServiceHistories.rangeSize}"
          first="#{bindings.ServiceHistories.rangeStart}"...
          binding="#{backing_SRMain.historyTable}">
  <af:column headerText="#{bindings.ServiceHistories.labels.SvhDate}"
             sortable="false">
    <af:outputText value="#{row.SvhDate}">
      <f:convertDateTime pattern="#{bindings.ServiceHistories.formats.SvhDate}"/>
    </af:outputText>
  </af:column>
  <af:column headerText="#{bindings.ServiceHistories.labels.SvhType}"
             sortable="false">
    <af:outputText value="#{row.SvhType}"/>
  </af:column>
  <af:column headerText="#{bindings.ServiceHistories.labels.Notes}"
             sortable="false">
    <af:outputText value="#{row.Notes}"/>
  </af:column>
  <f:facet name="selection">
    <af:tableSelectMany text="Select items and ...">
      <af:commandButton text="..."
                    actionListener="#{bindings.deleteServiceHistoryNotes.execute}"
                         .../>
    </af:tableSelectMany>
  </f:facet>
</af:table>

カスタム・サービス・メソッドを使用してコマンド・ボタンを作成する場合、actionListener属性を使用して、そのボタンがメソッドにバインドされます。ボタンは、指定されたメソッドのアクション・バインディングのexecuteプロパティにバインドされます。例14-8は、コマンド・ボタン上のバインドされたメソッドに対するメソッド・アクション・バインディングが含まれる、ページ定義コードを示します。

例14-8 deleteServiceHistoryNotesメソッド・アクション・バインディング

<methodAction id="deleteServiceHistoryNotes"
              InstanceName="SRService.dataProvider" DataControl="SRService"
              MethodName="deleteServiceHistoryNotes"
              RequiresUpdateModel="true" Action="999">
  <NamedData NDName="keySet"
             NDValue="${backing_SRMain.historyTable.selectionState.keySet}"
             NDType="java.util.Set"/>
</methodAction>

メソッド・アクション・バインディングによって、関連付けられているメソッドがビジネス・サービスで起動し、NamedData要素にバインドされている値がパラメータとして渡されます。

アクション・バインディングのexecuteメソッドにコマンド・ボタンをバインドするかわりに、宣言メソッドをオーバーライドするバッキングBean内のメソッドにボタンをバインドできます。そうすることで、元のメソッドの実行前か実行後に、ロジックを追加できるようになります。宣言メソッドをオーバーライドすると、例14-9のように、(actionListener属性のかわりに)action属性を使用して、コマンド・コンポーネントが新規メソッドに自動的にリバインドされます。

例14-9 宣言メソッドをオーバーライドした後のコマンド・ボタン・コード

<af:commandButton text="..."
                  action="#{backing_SRMain.onDeleteHistoryRows}"/>

例14-10は、宣言メソッドをオーバーライドする場合に、バッキングBeanに挿入されるバインディング・コンテナ・コードを示します。コードによってバインディング・コンテナにアクセスし、関連付けられるメソッドに対するバインディングが検索されます。

例14-10 バッキングBeanでJDeveloperにより追加されたバインディング・コンテナ・コード

private BindingContainer bindings;

public BindingContainer getBindings() {
       return this.bindings;
}

public void setBindings(BindingContainer bindings) {
       this.bindings = bindings;
}

public String onDeleteHistoryRows() {
    BindingContainer bindings = getBindings();
    OperationBinding operationBinding =
        bindings.getOperationBinding("deleteServiceHistoryNotes");
    Object result = operationBinding.execute();
    if (!operationBinding.getErrors().isEmpty()) {
        return null;
    }
    return null;
}

メソッド・バインディングへのexecute()コールの前または後にロジックを追加することにより、宣言メソッドの前または後に必要なロジックを実行できます。

14.6.7 実行時に行われる処理

tableSelectOneコンポーネントと同様に、ユーザーがtableSelectManyコンポーネントを使用して複数選択を行ってから、関連付けられたコマンド・ボタンをクリックする場合、ユーザーが選択したすべての行をRowKeySetに配置すると、tableSelectManyコンポーネントによって表の選択の状態が更新されます。

例14-11は、deleteServiceHistoryNotes(Set)操作がコマンド・ボタンとしてドロップされる場合に作成される宣言メソッドをオーバーライドするSRMainページのバッキングBeanメソッドを示します。

例14-11 サービス履歴レコードの削除に関するバッキングBeanメソッド

public String onDeleteHistoryRows() {
  BindingContainer bindings = getBindings();
  Set keySet = getHistoryTable().getSelectionState().getKeySet();
  if (!keySet.isEmpty()) {
    getBindings().getOperationBinding("deleteServiceHistoryNotes").execute();
    keySet.clear();
  }
  return null;
}

例14-12は、サービス履歴表の使用に関して追加する必要があるバッキングBeanのコードを示します。

例14-12 サービス履歴表の使用に関するバッキングBeanコード

private CoreTable historyTable;

public void setHistoryTable(CoreTable historyTable) {
  this.historyTable = historyTable;
}

public CoreTable getHistoryTable() {
  return historyTable;
}

ユーザーがサービス履歴表で複数行を選択して、「Delete Service History Record」ボタンをクリックする場合、選択されたすべての行をRowKeySetに配置すると、tableSelectManyコンポーネントによって表の選択の状態が更新されます。バッキングBeanメソッドonDeleteHistoryRows()はバインディング・コンテナにアクセスし、履歴表でgetSelectionState.getKeySet()をコールすることにより、選択されたキーを取得します。バッキングBeanメソッドは、次にバインディングでexecute()メソッドをコールすることにより、deleteServiceHistoryNotesメソッド・アクション・バインディングを実行します(これは、アプリケーション・モジュールのクライアント・インタフェースでdeleteServiceHistoryNotes()メソッドにバインドされます)。サービス・メソッドは、各キーによって検索された行を削除しながら、keySetをループします。最後に、サービス・メソッドによって選択された行がすべて削除された後、バッキングBeanメソッドがkeySetclear()メソッドをコールして、キーを削除します。

14.7 コマンド・コンポーネントを使用した現在オブジェクトの設定

オブジェクトの現在行をプログラムでイテレータに設定する必要がある場合があります。たとえば、SRDemoアプリケーションのSRListページでは、図14-8に示すように2番目の列にコマンド・リンクを使用しています。ユーザーはこのリンクをクリックすると、先に行を選択しなくても、サービス・リクエストを直接編集できます。

図14-8 SRListページ上の表で使用されるコマンド・リンク

IDを現在行に設定するコマンド・リンク

コマンド・リンクを使用するとユーザーの手順を省略できますが、コマンド・リンクはselectionファセットと同じ機能を提供するわけではなく、現在行を特定したり、イテレータに現在行を設定することができません。そのため、手動で現在行を設定する必要があります。

14.7.1 手動による現在行の設定方法

組込み操作のsetCurrentRowWithKeyまたはsetCurrentRowWithKeyValueを使用して現在行を設定します。これらの操作は、コレクションに対するイテレータの組込みメソッドです。setCurrentRowWithKey操作を使用すると、文字列化されたキーを指定して現在行を設定できます。setCurrentRowWithKeyValue操作を使用すると、主キーの値を指定して現在行を設定できます。現在行の操作の詳細は、10.5.6項「setCurrentRowWithKeyとsetCurrentRowWithKeyValueの違いの理解」を参照してください。

これらの操作は任意のタイプのコマンド・コンポーネントとしてドロップできますが、このような状況では通常、commandLinkコンポーネントが使用されます。次の手順では、このコンポーネントをsetCurrentRowWithKey操作およびsetCurrentRowWithKeyValue操作とともに使用する方法について説明します。

現在行を設定する手順:

  1. データ・コントロール・パレットから、setCurrentRowWithKey操作またはsetCurrentRowWithKeyValue操作をドラッグします。

  2. ポップアップ・メニューから、「操作」「ADFコマンド・リンク」の順に選択します。

    ページ上にコマンド・リンク・コンポーネントが作成され、アクション・バインディングがページ定義ファイルに追加されます。アクション・バインディング・エディタで、rowKeyパラメータの値を変更する必要があります。

  3. 構造ウィンドウでコマンド・リンク・コンポーネントを選択して、ポップアップ・メニューから「バインディングを編集」を選択します。

  4. アクション・バインディング・エディタでは、デフォルトで、rowKeyパラメータの値が${bindings.setCurrentRowWithKey_rowKey}に設定されます。実際の値は、現在行の特定に使用できるものにする必要があります。

    たとえば、図14-8のコマンド・リンクには、現在行をクリックされるリンクと同じ行に設定する必要があります。setCurrentRowWithKey操作の場合、行の文字列化されたキーにアクセスするために、バインディングのrowKeyStrプロパティまたは#{row.rowKeyStr}を使用できます。

    あるいは、setCurrentRowWithKeyValue操作を使用する場合は、rowKeyを現在行の値または#{row.svrId}に設定できます。

    表の現在行の設定に使用される変数(この場合はrow)の詳細は、14.2.2.2項「ADF Faces表のJSFページのコード」を参照してください。

14.7.2 現在行の設定時に発生する処理

setCurrentRowWithKey操作をコマンド・コンポーネントとして使用すると、その操作に対してアクション・バインディングが作成されます。この操作は、現在行を特定するパラメータ(rowKey)をとるため、その値の設定に使用されるNamedData要素を保持します(パラメータおよびNamedData要素の詳細は、17.3項「メソッドを実行するためのコマンド・コンポーネントの作成」を参照してください)。

例14-13に、setCurrentRowWithKey操作をドロップして#{row.rowKeyStr}rowKeyパラメータの値として設定したときにページ定義ファイルに作成されるコードを示します。

例14-13 setCurrentRowWithKey操作のページ定義コード

<action id="setCurrentRowWithKey" IterBinding="ServiceRequestsByStatusIterator"
            InstanceName="SRService.ServiceRequestsByStatus"
            DataControl="SRService" RequiresUpdateModel="false"
            Action="96">
  <NamedData NDName="rowKey" NDValue="${row.rowKeyStr}"
             NDType="java.lang.String"/>
</action>

14.7.3 実行時に行われる処理

ユーザーがコマンド・リンクをクリックすると、現在行を特定するrowKeyパラメータを使用して、setCurrentRowWithKey操作がイテレータで実行されます。tableSelectOneコンポーネントと同様に、同じイテレータを使用して現在レコードを表示すると、正しいデータが表示されます。


ヒント:

SRDemoアプリケーションのものと同様の機能の場合、現在行を表すパラメータ値を渡すコマンド・リンクが必要になることがあります。この値は、次のフォームの作成に使用されるメソッドで使用されます。詳細および手順は、17.4項「コマンド・コンポーネントを使用したパラメータ値の設定」を参照してください。