JDeveloper 11g によるリッチクライアント開発

第4章 テーブルを使用したアプリケーションの作成

日本オラクル株式会社 セールスコンサルティング統括本部
Fusion Middleware SC本部 Fusion Middleware レディネス部
智野 潤子 (ちの じゅんこ)

Part1に引き続き、ファイルの情報をテーブル形式で表示する簡単なアプリケーションを作成します。Part2の今回は、Part1で作成したアプリケーションにソートやデータの選択、ポップアップ・メニューなどの機能を追加します。

図52 チュートリアルで作成するアプリケーション
図52 チュートリアルで作成するアプリケーション

目次

Part1

Part2

ソート機能の追加

af:tableおよびaf:columnタグによって実装されたテーブルは、簡単な設定だけでデータのソートが可能です。ソート機能を使用するには、af:columnタグのsortable属性の値をtrueに設定し、sortProperty属性にソートの基準となるプロパティの名前を指定します。
このチュートリアルで追加したテーブルの名前列のデータはJSF EL式で「#{row.name}」と記述されているので、テーブルのデータをソートするためには、sortProperty属性に「name」と指定します。図53のようにプロパティ・インスペクタの[Behavior]カテゴリで[Sortable]と[SortProperty]の値を変更します。

図53 プロパティ・インスペクタで[Sortable]と[SortProperty]の値を編集
図53 プロパティ・インスペクタで[Sortable]と[SortProperty]の値を編集

同様に他の3つの列も、プロパティ・インスペクタを使用して[Sortable]の値を「true」に変更し、[SortProperty]の値を表11のように指定します。

表11 [SortProperty]に指定する値
[SortProperty]の値
サイズ size
タイプ type
更新日時 lastModified

すべての列の[Sortable]および[SortProperty]の値を変更したら、index.jspxを実行してデータのソートができることを確認してみましょう。

行の選択

この項では、テーブルの行データを選択可能にします。またユーザーが選択したデータをManaged Beanで取得できるようにします。

行の選択の有効化

テーブルのデータを選択可能にするには、af:tableタグのrowSelection属性の値を次のいずれかに設定します。

  • sigle(1行ずつ選択する場合)
  • multiple(1度に複数行を選択する場合)

プロパティ・インスペクタで[RowSelection]の値を変更するには、構造ウィンドウで「af:table」を選択して、af:tableタグのプロパティ・インスペクタを開き、[Behavior]カテゴリの[RowSelection]ドロップダウン・リストから「single」を選択します。

図54 プロパティ・インスペクタで[RowSelection]の値を選択
図54 プロパティ・インスペクタで[RowSelection]の値を選択

これにより、ユーザーがテーブルの行を選択すると、アプリケーション・サーバーに選択されたデータの情報が送信されます。

イベント・リスナーの実装

ユーザー選択した行データがアプリケーション・サーバーに送信されると、SelectionEventが発生します。Managed Beanでユーザーが選択したデータを取得するには、Selection Eventに対応したリスナーを実装し、af:tableタグのSelectionListener属性にJSF EL式で指定します。Selection Eventのリスナーを実装するには、[SelectionListener]フィールドの右にある[▼]アイコンをクリックし、メニューから[編集]を選択します。

図55 プロパティ・インスペクタで[SelectionListener]のメニューから[編集]を選択
図55 プロパティ・インスペクタで[SelectionListener]のメニューから[編集]を選択

メニューから[編集]を選択すると、[プロパティの編集]ダイアログが表示されされるので、[マネージドBean]ドロップダウン・リストから「file_service」を選択します。

図56 [プロパティの編集]ダイアログ
図56 [プロパティの編集]ダイアログ

次に、[プロパティの編集]ダイアログの[メソッド]ドロップダウン・リストの右にある[新規]ボタンをクリックします。これにより、[メソッドの作成]ダイアログが表示されます。[メソッド]に「selectRow」と入力したら、[OK]ボタンをクリックします。

図57 [メソッドの作成]ダイアログ
図57 [メソッドの作成]ダイアログ

[プロパティの編集]ダイアログで[OK]ボタンをクリックすると、FileService.javaにselectRowメソッドのひな型が生成されています。

コード3 FileService.javaに追加されたselectRowメソッドのひな型

public void selectRow(SelectionEvent selectionEvent) {
  // Add event code here...
}

追加されたselectRowメソッドをコード4のように実装します。

コード4 selectRowメソッド

public void selectRow(SelectionEvent selectionEvent) {
  // selectionEventからイベントが発生したテーブルのインスタンスを取得
  RichTable table = (RichTable) selectionEvent.getComponent();
  // tableのインスタンスから選択した行データを取得
  FileItem item = (FileItem) table.getSelectedRowData();
  System.out.println(item.getName());
  setSelectedItem(item);
}

※ oracle.adf.view.rich.component.rich.data.RichTable のインポートが必要です

index.jspxを実行し、テーブルの任意のファイル情報(行)をクリックすると、ログ・ウィンドウに選択したファイルの名前が表示されることを確認してください。

ポップアップ・メニューの追加と実装

この項では、テーブルに表示されたファイル情報(行)を右クリックした際にポップアップ・メニューを表示し、選択したファイルを削除できるように変更します。

ポップアップ・メニューの追加

ADF Faces Rich Clientでは、ポップアップで表示されるメニューやダイアログ、ウィンドウをaf:popupタグ内に記述します。ポップアップ・メニューはaf:menuタグで記述し、それぞれのメニュー項目をaf:commandMenuItemで記述します。

af:popupタグの追加

最初に、index.jspxにaf:popupタグを追加します。構造ウィンドウで[af:table]→[Tableファセット]→[contextMenu]を右クリックし、[contextMenuの中に挿入]→[Popup]を選択します。

図58 エディタ・ウィンドウに[Popup]をドラッグ&ドロップ
図58 エディタ・ウィンドウに[Popup]をドラッグ&ドロップ

これによりindex.jspxにaf:popupタグが追加され、エディタ・ウィンドウと構造ウィンドウはそれぞれ図59、図60のように表示されます。

図59 af:popupタグが追加された直後のエディタ・ウィンドウ
図59 af:popupタグが追加された直後のエディタ・ウィンドウ

図60 プロパティ・インスペクタで[Id]を編集
図60 af:popupタグが追加された直後の構造ウィンドウ

af:menuタグの追加

次にaf:popupタグの内部にaf:menuタグを追加します。構造ウィンドウで[af:popup]を右クリックし、コンテキスト・メニューから[Insert inside af:popup]→[Menu]を選択します。

図61 構造ウィンドウで[af:popup]を右クリックし[メニュー]を選択
図61 構造ウィンドウで[af:popup]を右クリックし[メニュー]を選択

これにより、af:popupタグの中にaf:menuタグが追加されます。

af:commandMenuItemタグの追加

最後にaf:menuタグの中にaf:commandMenuItemタグを追加します。構造ウィンドウで追加された[af:menu – menu 1]を右クリックし、コンテキスト・メニューから[af:menu – menu1の中に挿入]→[メニュー・アイテム]を選択します。

図62 構造ウィンドウで[af:menu - menu 1]を右クリックし、を右クリックし[メニュー・アイテム]を選択
図62 構造ウィンドウで[af:menu - menu 1]を右クリックし、を右クリックし[メニュー・アイテム]を選択

これにより、af:commandMenuItemタグがaf:menuタグの中に追加され、プロパティ・インスペクタでは、追加されたaf:commandMenuItemタグの属性が編集できるようになっています。プロパティ・インスペクタの[Common]カテゴリを開き、[Id]および[Text]の値を表12のように編集します。

表12 [JSFページの作成]ダイアログに入力する値
設定する項目 設定する値
Id deleteMenuItem
Text 削除

図63 プロパティ・インスペクタで[Id]と[Text]の値を編集
図63 プロパティ・インスペクタで[Id]と[Text]の値を編集

プロパティ・インスペクタで指定した[Id]の値は、後述する部分ページ・レンダリングの設定の際に使用します。

イベント・リスナーの実装

ユーザーがポップアップ・メニューから[削除]を選択すると、その情報がアプリケーション・サーバーに送信されてAction Eventが発生します。ファイルをリストから削除する処理はAction Listenerとして実装し、実装したメソッドをaf:commandMenuItemタグのactionListener属性にJSF EL式で指定します。
Action Listenerを実装するために、構造ウィンドウで[af:commandMenuItem]を選択し、af:commandMenuItemタグの属性を編集するプロパティ・インスペクタを開きます。[Common]カテゴリの[Action Listener]フィールドの右の[▼]をクリックし、表示されたメニューから[Edit]を選択します。

図64 プロパティ・インスペクタの[Action Listener]のメニューから[編集] を選択
図64 プロパティ・インスペクタの[Action Listener]のメニューから[編集] を選択

行の選択」でSelectionEventのリスナーを実装した時と同様に、[プロパティの編集]ダイアログが表示されるので、Managed Bean「file_service」に「deleteFileItem」メソッドを追加します。
これにより、FileService.javaにdeleteFileItemメソッドのひな型が追加されます。

コード5 FileService.javaに追加されたdeleteFileItemメソッドのひな型

public void deleteFileItem(ActionEvent actionEvent) {
  // Add event code here...
}

追加されたdeletFileItemメソッドをコード6のように実装します。

コード6 deletFileItemメソッド

public void deleteFileItem(ActionEvent actionEvent) {
  // 選択されたFileItemオブジェクトを取得
  FileItem item = getSelectedItem();
  if (item != null) {
    // 選択されたオブジェクトをリストから削除
    getFileItems().remove(item);
  }
}

部分ページ・レンダリングの設定

最後に部分ページ・レンダリングの設定をし、ユーザーがポップアップ・メニューの[削除]を選択したら、テーブルに表示されるデータがリフレッシュされるように変更します。
部分ページ・レンダリングの設定は、af:tableタグのpartialTrigger属性に[削除]メニューを定義したaf:commandMenuItemタグに指定したid属性の値を指定します。
構造ウィンドウで[af:table]を選択した状態でプロパティ・インスペクタを開きます。[Behavior]カテゴリの[PartialTrigger]フィールドの右にある[▼]をクリックし、メニューから[編集]を選択します。

図65 プロパティ・インスペクタで[PartialTrigger]のメニューから[編集]を選択
図65 プロパティ・インスペクタで[PartialTrigger]のメニューから[編集]を選択

これにより、[プロパティの編集]ダイアログが起動されるので、[使用可能]ツリーから[commandMenuItem – deleteMenuItem]を選択した状態でダイアログ中央の[>]ボタンをクリックします。

図66 [プロパティの編集]ダイアログ
図66 [プロパティの編集]ダイアログ

[プロパティの編集]ダイアログの[OK]ボタンをクリックしたら部分ページ・レンダリングの設定は完了です。この状態でindex.jspxを実行すると、テーブルのデータを削除できるようになります。

Excelファイルへのエクスポート

このチュートリアルの最後に、テーブルに表示されたデータをエクスポートしたExcelファイルをダウンロードするためのボタンを追加します。

af:tableタグの設定

テーブルで表示しているデータをExcelファイルにエクスポートするには、af:tableタグのid属性を指定する必要があります。構造ウィンドウで[af:table]を選択した状態でプロパティ・インスペクタを開き、[Common]カテゴリの[Id]に「fileItemTable」と入力します。

図67 プロパティ・インスペクタで[Id]の値を編集
図67 プロパティ・インスペクタで[Id]の値を編集

ツールバーの追加

この項では、Excelファイルをダウンロードするためのボタンを配置するためのツールバーを追加します。

af:toolbarタグの追加

構造ウィンドウで[パネル・コレクション facets]内に表示されている[toolbar]を右クリックし、コンテキスト・メニューから[toolbarの中に挿入]→[ツールバー]を選択します。

図68 [toolbar]のコンテキスト・メニューから[ツールバー]を選択
図68 [toolbar]のコンテキスト・メニューから[ツールバー]を選択

これにより、af:panelCollectionタグのtoolbarファセット内にaf:toolbarタグが追加されます。

図69 af:toolbarが追加された直後の構造ウィンドウ
図69 af:toolbarが追加された直後の構造ウィンドウ

NOTE
ファセットはJSFのUIコンポーネントに事前定義されている名前付きの子要素です。JSFのUIコンポーネントにはファセット(f:facetタグ)を記述することで、特別な機能を追加できるものが多数あります。af:panelCollectionタグにはこのチュートリアルで使用した「toolbar」の他にも、「menus」、「secondaryToolbar」、「statusbar」、「viewMenu」などのファセットが定義されています。例えば、「viewMenu」ファセットにメニューを追加することで、af:panelCollectionが提供する[ビュー]メニュー以外の独自のメニューを追加することができます。

af:commandToolbarButtonの追加

次に、追加したaf:toolbarタグにaf:commandToolbarButtonタグを追加します。構造ウィンドウで、[af:toolbar]を右クリックし、コンテキスト・メニューから[af:toolbarの中に挿入]→[ツールバー・ボタン]を選択します。
プロパティ・インスペクタで、追加されたaf:commandToolbarButtonタグの属性値が編集できるようになっているので、[Common]カテゴリの[Text]の値を「Excel」に変更します。

図70 プロパティ・インスペクタで[Text]の値を編集
図70 プロパティ・インスペクタで[Text]の値を編集

af:exportCollectionActionListenerタグの追加

構造ウィンドウまたはエディタ・ウィンドウで、追加したaf: commandToolbarButtonを右クリックし、コンテキスト・メニューから[af: commandToolbarButton - Excelの 中に挿入]→[ADF Faces]→[Export Collection Action Listener]を選択します。

図71 構造ウィンドウで[af:commandToolbarButton]を右クリックし[Export Collection Action Listener]を選択
図71 構造ウィンドウで[af:commandToolbarButton]を右クリックし[Export Collection Action Listener]を選択

これにより、[Export Collection Action Listenerの挿入]ダイアログが表示されるので、[ExportedId]フィールドの右にある[▼]ボタンをクリックします。

図72 [Export Collection Action Listenerの挿入]ダイアログ
図72 [Export Collection Action Listenerの挿入]ダイアログ

[編集]メニューをクリックすると[プロパティの編集]ダイアログが起動されるので、[使用可能]ツリーから[table – fileItemTable]を選択し、[OK]ボタンをクリックします。

図73 [プロパティの編集]ダイアログ
図73 [プロパティの編集]ダイアログ

次に[Export Collection Action Listenerの挿入]ダイアログの[Type]ドロップダウン・リストから[excelHTML]を選択し、[OK]ボタンをクリックします。

図74 [Export Collection Action Listenerの挿入]ダイアログ
図74 [Export Collection Action Listenerの挿入]ダイアログ

[Insert Export Collection Action Listener]ウィザードで[終了]ボタンをクリックすると、af:commandToolbarButtonタグの中にaf:exportCollectionActionListenerタグが追加されます。
index.jspxを実行して[Excel]ボタンをクリックすると、テーブルに表示されているデータが記述されたExcelファイルがダウンロードできます。

NOTE

ADF Faces Rich Clientのためのweb.xmlの事前構成

ADF Faces Rich Clientを使用したWebアプリケーションを実行するには、ServletやServlet Filterの構成が必要ですが、それらはJDeveloperにより自動的に設定されます。

  • コンテキスト・パラメータ javax.faces.STATE_SAVING_METHOD
    javax.faces.STATE_SAVING_METHODは、JSFアプリケーションのビューの状態をどこに格納するかを指定するコンテキスト・パラメータで、「server」または「client」のいずれかを指定します。ADF Faces Rich Clientを使用する場合は、「client」が推奨されています。
  • Faces Servlet
    Faces Servletは、JSFのフロント・コントローラの役割を持ったServletです。JDeveloperによって生成されたweb.xmlでは、URLパターン「/faces/*」にマッピングされています。
  • Trinidad Resource Servlet
    ADF Faces Rich Clientが使用するWebリソース(画像、スタイルシート、JavaScript)を提供するServletです。Trinidad Resource Servlet は、URLパターン「/afr/*」および「/adf/*」にマップする必要があります。
  • Trinidad Filter
    ADF Faces Rich Clientの初期化やファイルのアップロードなどの処理を実行するServlet Filterです。

まとめ

この章では、ADF Faces Rich Clientを使用したJSFアプリケーションの開発手順をチュートリアル形式で説明しました。

  • テーブル形式でのデータの表示
  • テーブルの列のカスタマイズ
  • ユーザーが選択した行の取得
  • テーブルへのポップアップ・メニューの追加
  • テーブルで表示されているデータのExcelファイルへのエクスポート

次の章では、ADF Faces Rich ClientとADF Modelを組み合わせたアプリケーション開発手法を紹介します。

Copyright © 2009, Oracle Corporation Japan. All rights reserved.
無断転載を禁ず

この文書はあくまでも参考資料であり、掲載されている情報は予告なしに変更されることがあります。日本オラクル社は本書の内容に関していかなる保証もいたしません。また、本書の内容に関連したいかなる損害についても責任を負いかねます。

Oracleは米国Oracle Corporationの登録商標です。文中に参照されている各製品名及びサービス名は米国Oracle Corporationの商標または登録商標です。その他の製品名及びサービス名はそれぞれの所有者の商標または登録商標の可能性があります。

智野 潤子 智野 潤子 (ちの じゅんこ)
日本オラクルで主に開発ツール/フレームワーク製品を担当しています。