Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.2.1) E70030-02 |
|
前 |
次 |
この章の内容は次のとおりです。
選択リストを使用して、関連するマスター・コレクションまたはディテール・コレクションからのキー値をコレクションに移入する方法の詳細は、「データバインドされた選択リストおよびシャトルの作成」を参照してください。
データを階層形式で表現する必要がある場合が多くあります。マスター/ディテール関係では、ユーザーがマスター・データ・オブジェクト内でアイテムの選択を変更すると、これに合せ、ディテール・データ・オブジェクト内で表示されていたデータ・セットも変更されます。たとえば、マスター・オブジェクト内でテレビのカテゴリを選択すると、ディテール・オブジェクトにはすべてのテレビ・モデルが表示されます。
ADF Faces UIコンポーネントと組み合せてADFモデルを使用すると、複数のオブジェクトでマスター/ディテール関係が定義されている場合には、これらのオブジェクトから同時にデータを表示するマスター/ディテール・ページを宣言的に作成できます。ADFイテレータ・バインディングは、選択されたマスター・データ・オブジェクトに対して表示されるディテール・データ・オブジェクトの同期化を自動的に管理します。
ADFビジネス・コンポーネントにおけるマスター/ディテール関係は、ビュー・リンクが2つのビュー・オブジェクト・インスタンスを関連付けるように作成される場合に確立されます。「ビュー・オブジェクトについて」で説明しているように、ビュー・リンクは2つのビュー・オブジェクト間の関係を表します。通常は基礎となるデータ表間の外部キー関係に基づきますが、そうである必要はありません。ビュー・リンクは、1つのビュー・オブジェクト・インスタンス(マスター・オブジェクト)の行を別のビュー・オブジェクト・インスタンス(ディテール・オブジェクト)の1つ以上の行に関連付けます。
オブジェクトがマスター/ディテール関係にある場合は、両方のオブジェクトのデータを同時に表示するページを宣言的に作成できます。たとえば、図34-1に示すページでは、ページ上部のフォームには顧客の入力を表示し、ページ下部には顧客注文の表を示しています。このような表示ができるのは、オブジェクトがマスター/ディテール関係にあるためです。この例では、Customers
ビュー・オブジェクトがマスター・オブジェクトで、OrdersForCustomer
がディテール・オブジェクトです。ADFイテレータは、選択されたマスター・データ・オブジェクトに対して表示されるディテール・データ・オブジェクトの同期化を自動的に管理します。イテレータ・バインディングにより、データ・コレクションのスクロール処理やページング、または概要情報から詳細情報へのドリルダウンを可能にするユーザー・インタフェースを簡単に作成できます。
図34-1 マスター・フォームとディテール表
マスター/ディテール・オブジェクトは、フォーム、表、ツリーおよびツリー表に表示します。これらのオブジェクトは同じページまたは別々のページに表示できます。たとえば、マスター・オブジェクトをあるページの表に表示し、ディテール・オブジェクトを別のページの読取り専用フォームに表示できます。
マスター・オブジェクトは多数のディテール・オブジェクトを保持でき、各ディテール・オブジェクトも自身のディテール・オブジェクトを多くのレベル(深さ)にわたって保持できます。この階層内のディテール・オブジェクトの1つを「アプリケーション」ウィンドウからマスター/ディテール・フォームとしてページにドロップすると、直接の親マスター・オブジェクトのみがページに表示されます。最上位の親オブジェクトまで、階層全体が表示されるわけではありません。
ディテール・オブジェクトをツリーまたはツリー表オブジェクトとして表示すると、深さのレベルが複数ある階層全体を、最上位のマスター・オブジェクトから始まり、各ノードのディテール子オブジェクトを横断して表示できます。
図34-1 は、ディテール表を伴うマスター・フォームの例を示します。ユーザーがコマンド・ボタンを使用して顧客間を移動する場合、顧客が行った注文が表にリストされます。
図34-2は、2レベルのノードで構成されるツリーを示しています。ツリーを使用して、階層情報を表示できます。この例では、ツリーを使用して、国別にグループ化された顧客が表示されています。ユーザーは各ノードを開いて、ツリーのブランチを下位に横断し、リーフ・レベルのアイテムにアクセスできます。
図34-2 複数レベルのツリー
図34-3は、国別だが、ツリーではなくツリー表を使用した、グループ化された同じ顧客を示しています。ツリー表では、階層ノード・レベルのツリーだけでなく、各ノードに対する列情報も表示できます。また、要素を開いたり閉じるだけでなく、サブツリーに焦点を当てることもできます。
図34-3 ツリー表
ADFモデル・レイヤーを構成または使用する前に、他のOracle ADF機能を理解しておくと役立つ場合があります。また、モデル・レイヤーの構成によって可能になることについても、確認しておくことをお薦めします。次に、関連する他の機能へのリンクを示します。
ADFビュー・オブジェクトおよびビュー・リンク: フォーム内でのコンポーネントの表示方法および機能のほとんどは、対応するビュー・オブジェクトによって制御されます。ビュー・オブジェクトの作成方法およびビュー・リンクでのデータ・モデルのマスター/ディテール階層の確立の詳細は、「マスター/ディテール階層における複数表の使用」を参照してください。
ADFアプリケーション・モジュール: ページにデータバインドされたコンポーネントをドラッグする「データ・コントロール」パネルに、アプリケーション・モジュールに追加したビュー・オブジェクトの表示が移入されます。詳細は、「アプリケーション・モジュールによるビジネス・サービスの実装」を参照してください。
アダプタベースのデータ・コントロール: EJBコンポーネントやWebサービスなど他のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』の説明に従って、ビジネス・サービス用データ・コントロールを作成できます。
ADFモデルとデータ・バインディング: ADF Webアプリケーション内でフォームを作成する場合は、ADFモデルおよびデータ・バインディングを使用します。詳細は、「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。
ADF Faces: ADF Faces UIコンポーネントも使用します。ADF Facesを使用した開発の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』を参照してください。
ADFフォームおよび表: デフォルトのフォームまたは表を変更する場合は、「データ・コントロールのコレクションを使用した基本的なフォームの作成」または「基本表の作成」を参照してください。
タスク・フロー: トランザクションに携わるフォームの場合は、フォームのレンダリングの前または後に、ADFタスク・フローを使用して特定の操作を起動する必要がある場合があります。詳細は、「ADFタスク・フローの作成」を参照してください。
イベント処理: クライアント側イベントを処理するためにリスナー・メソッドを記述することが必要な場合があります。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「イベントの処理」を参照してください。
マネージドBean: イベントの処理および他のフロントエンド処理にマネージドBeanの作成が必要な場合があります。マネージドBeanの作成および使用の詳細は、「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。
マスター/ディテール表、フォーム、ツリーおよびツリー表を使用するには、データ・モデル内でマスター/ディテール関係を確立する必要があります。マスター/ディテール関係は、「データ・コントロール」パネルに反映され、そこからマスター/ディテール・データを表示するページを宣言的に作成するオブジェクトをドラッグ・アンド・ドロップできます。
ADFビジネス・コンポーネント・アプリケーションでのマスター/ディテール関係は、2つのビュー・オブジェクト間のビュー・リンクを作成することによって示します。次に、マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトの両インスタンスをアプリケーション・モジュールのデータ・モデルに追加します。詳細は、「データ・モデルでアクティブなマスター/ディテール調整を有効化する方法」を参照してください。
注意:
WebサービスやEJBセッションBeanなど、他のビジネス・サービスに基づいたデータ・コントロールの場合、マスター/ディテール関係は通常、Webサービスの定義ファイルまたはJPAベースのBeanのJoinColumn
アノテーションなど、これらのサービス内の標準メカニズムから推定されます。
たとえば、図34-4
に示すように、Oracle ADFのSummitサンプル・アプリケーションにはCustomerId
属性に基づくCustomerVO
ビュー・オブジェクトからOrdVO ビュー・オブジェクトへのビュー・リンクがあり、どちらもアプリケーション・モジュールのデータ・モデルに含まれています。マスター・ビュー・オブジェクト・インスタンスの現在の行を変更すると、ディテール・ビュー・オブジェクト・インスタンスの行セットがリフレッシュされて現在のマスターの詳細が含まれるようになります。
図34-4 CustomerVOおよびOrdVOの両ビュー・オブジェクト間のビュー・リンク
注意:
Summit ADFサンプル・アプリケーションのCustomerVO
ビュー・オブジェクトとOrdVO
ビュー・オブジェクトの間のビュー・リンクは、一方向の関係です。ビュー・リンクが双方向で、マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトの両セットがアプリケーション・モジュールのデータ・モデルに追加された場合、「データ・コントロール」パネルには、OrdersForCustomer
コレクションもCustomers
コレクションと同じノード・レベルで表示され、OrdersForCustomer
コレクションのディテール・インスタンスもCustomers
コレクションの子として表示されます。
マスター/ディテール・オブジェクトは「データ・コントロール」パネルの階層を調べることで識別できます。
始める前に:
マスター/ディテールの関係の基本を理解しておくと役立つ場合があります。詳細は、「マスター/ディテール表、フォームおよびツリーの前提条件」を参照してください。
また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。
次のタスクを完了する必要があります。
必要なマスター/ディテール階層を確立するビュー・オブジェクトとビュー・リンクのインスタンスを含むアプリケーション・モジュールを作成します(「アプリケーション・モジュールの作成と変更」を参照)。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
マスター/ディテール・オブジェクトを識別するには:
「アプリケーション」ウィンドウで、「データ・コントロール」パネルを開いて、コレクション・ノードを開き、これらのコレクションのコレクション子ノード検索します。
コレクション・ノードの子コレクション・ノードは、親ノードとのマスター/ディテール関係のディテール部分を表しています。親コレクションは、複数の子コレクションとのマスター/ディテール関係の一部にできます。また、コレクションは複数のレイヤーでネストできます。これは、コレクションを1つのマスター/ディテール関係のディテール部分とし、別のマスター/ディテール関係のマスター部分にできることを意味しています。
図34-5 は、Summit ADFサンプル・アプリケーションの「データ・コントロール」パネルに表示された2つのマスター/ディテール関連コレクションを示しています。Customers
コレクションはCustomerVO
ビュー・オブジェクトのインスタンスで、Customer
コレクションの子として表示されているOrdersForCustomer
コレクションはOrdVO
ビュー・オブジェクトのインスタンスです。
ノート
「データ・コントロール」パネルに表示されるマスター/ディテール階層には、関係のカーディナリティ(1対多、1対1、多対多)は反映されません。階層には、別のコレクション(ディテール)から1つ以上のオブジェクトを取得するために使用されているコレクション(マスター)が簡潔に示されます。
図34-5 「データ・コントロール」パネルでのマスター/ディテール・オブジェクト
「データ・コントロール」パネル上のマスター/ディテール階層には、図34-4 に示す、アプリケーション・モジュールのデータ・モデルに定義されている階層が反映されます。「データ・コントロール」パネルに表示されるアイコンの詳細は、「「データ・コントロール」パネルの使用方法」を参照してください。
フォームと表コンポーネントを使用してページにマスター/ディテール機能を作成できます。作成するには、個々のフォームおよび表コンポーネントを作成するか、マスター/ディテール・コンポーネント両方を含む事前作成済ウィジェットを使用します。
事前作成済のウィジェットにより、「データ・コントロール」パネルを使用して単一の宣言的アクションで、読取り専用マスター/ディテール・ブラウザ・ページを作成できます。そのために必要な操作は、ディテール・コレクションをページにドロップして、使用するウィジェットのタイプを選択することのみです。生成されたコンポーネントには、エンド・ユーザーがコレクション内のデータ・オブジェクトをスクロールできるレンジ・ナビゲーションが含まれます。テキスト・フィールドまたは列をページから削除すると、不要な属性を削除できます。
図34-6 に示す事前作成済のマスター/ディテール・ウィジェットの例では、ページ上部のフォームに一般的な注文情報が表示され、ページ下部の表に注文詳細が表示されています。ユーザーが「次へ」ボタンをクリックし、ページ上部のマスター・データのレコードをスクロールすると、ページが自動的に更新され、現在表示されているマスター・レコードのディテール・データが表示されます。
図34-6 「データ・コントロール」パネルの事前作成済のマスター/ディテール・ウィジェット
JDeveloperで提供される事前作成済マスター/ディテールUIコンポーネントでは必要な機能を発揮できない場合があります。たとえば、マスター/ディテールUIコンポーネントを使用するかわりに、コンポーネントを編集可能にしたり、コンポーネントをプログラム的にバインドすることが必要な場合があります。このような場合には、フォームと表を別々に作成することにより、マスター/ディテール・ページを作成できます。コンポーネントがコレクションおよびネストされたコレクションから作成される場合は、ネストされたコレクションのイテレータ・バインディングはマスターおよびディテール・コンポーネント間の調整を自動的に管理します。詳細は、「個別のコンポーネントからマスター/ディテール・フォームを作成する方法」および「個別のページにマスター/ディテール・コンポーネントを表示する方法」を参照してください。
注意:
また、マスター表のdetailStamp
ファセットを使用して、選択した行のディテールを表示することもできます。動的コンポーネントを使用してこれを行う方法の詳細は、「detailStampファセットを使用した動的表の作成方法」を参照してください。
「データ・コントロール」パネルで事前作成済のマスター/ディテール・フォームおよび表を使用すると、単一の宣言的アクションで、マスター・ウィジェットとディテール・ウィジェットの両方を1つのページ上に作成できます。これらの事前作成済マスター/ディテール・ウィジェットは読取り専用です。マスター・データとディテール・データを個別のページに表示する方法の詳細は、「個別のコンポーネントからマスター/ディテール・フォームを作成する方法」を参照してください。マスター・データとディテール・データを個別のページに表示する方法の詳細は、「個別のページにマスター/ディテール・コンポーネントを表示する方法」を参照してください。
始める前に:
マスター/ディテール表およびフォームの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「表およびフォームを使用したマスター/ディテール・オブジェクトの表示」を参照してください。
また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。
次のタスクを完了する必要があります。
必要なマスター/ディテール階層を確立するビュー・オブジェクトとビュー・リンクのインスタンスを含むアプリケーション・モジュールを作成します(「アプリケーション・モジュールの作成と変更」を参照)。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
事前作成済のADFマスター/ディテール・フォームおよび表を使用したマスター/ディテール・ページを作成するには:
事前作成済のマスター/ディテール・ウィジェットを使用してマスター/ディテール・フォームを作成するかわりに、マスター/ディテール関係を持つデータ・コントロール・オブジェクトから表およびフォーム・コンポーネントを別々に作成して、マスター/ディテール調整を提供するディテール・オブジェクトのイテレータ・バインディングを利用できます。別々のコンポーネントからマスター/ディテール・フォームを作成することにより、コンポーネントとそのバインディングの生成方法により柔軟性がもたらされます。
始める前に:
マスター/ディテール表およびフォームの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「表およびフォームを使用したマスター/ディテール・オブジェクトの表示」を参照してください。
また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。
次のタスクを完了する必要があります。
「ビュー・オブジェクトのみに基づくマスター/ディテール階層の作成方法」の説明に従って、必要なマスター/ディテール階層を確立するビュー・オブジェクトとビュー・リンクのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
個々のコンポーネントを使用してマスター/ディテール・フォームを作成するには:
「データ・コントロール」パネルからコレクションをドラッグ・アンド・ドロップすると、JSFページへのコードの追加やページ定義ファイルに対応するエントリの追加など、様々な処理が自動的に行われます。「データ・コントロール」パネルの使用時に実行される処理と作成される内容の詳細は、「「データ・コントロール」パネルの使用時の処理」を参照してください。
事前作成済のマスター/ディテール・ウィジェット用に生成されたJSFコードは、「データ・コントロール」パネルを使用して読取り専用のフォームまたは表を作成したときに生成されるJSFコードとほぼ同じです。独自のマスター/ディテール・ウィジェットを作成する場合、事前作成済のマスター/ディテール表およびフォームに自動的に組み込まれるものと同様のコンポーネントを組み込むことを検討してください。
事前作成済のマスター/ディテール・ウィジェットの表およびフォームには、マスター・フォームまたは表にデータを移入するデータ・コントロールの名前を保持するpanelHeader
タグが含まれます。このラベルは、リソース・バンドルにバインドする文字列またはEL式を使用して、必要に応じて変更できます。
コレクション内に複数のデータ・オブジェクトがある場合、事前作成済のマスター/ディテール・ウィジェットのフォームには、レンジ・ナビゲーション用としてFirst
、Previous
、Next
およびLast
という4つのbutton
タグがあります。これらのレンジ・ナビゲーション・ボタンを使用して、コレクション内のオブジェクトをスクロールできます。各ボタンのactionListener
属性は、ナビゲーションを実行するデータ・コントロール操作にバインドされています。ボタンをクリックすると、actionListener
バインディングで使用されるexecute
プロパティによって、操作が起動します。(フォームに単一のオブジェクトが表示されている場合、レンジ・ナビゲーション・コンポーネントは表示されません。)レンジ・ナビゲーションの詳細は、「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。
ヒント:
ページに「ADFマスター表、ディテール・フォーム」ウィジェットまたは「ADFマスター表、ディテール表」ウィジェットをドロップすると、ディテール・コンポーネントの親タグ(panelHeader
タグやtable
タグなど)のpartialTriggers
属性はマスター・コンポーネントのid
に自動的に設定されます(部分トリガーの詳細は、「入力表の作成方法」を参照)。実行時に、ユーザーがマスター・コンポーネントで選択を行うと、partialTriggers
属性によりディテール・コンポーネントのみが再度レンダリングされます。これは、部分ページ・レンダリングと呼ばれます。部分ページ・レンダリングが使用されるのは、ディテール・コンポーネントのみ新しいデータを表示するために再度レンダリングする必要があるためです。ユーザーがファセット内で選択のみを行う場合、表を再度レンダリングする必要はありません。
次の例は、マスター/ディテール・ページ用に作成されたページ定義ファイルを示しています。このページは、Customers
オブジェクトの下位のディテール・オブジェクトであるOrdersFromCustomer
コレクションを、「ADFマスター・フォーム、ディテール表」としてページにドロップして作成したものです。
このexecutables
要素では2つのイテレータが定義されており、1つはマスター・オブジェクトに対するもの、もう1つはディテール・オブジェクトに対するものです。実行時には、ディテール・ビュー・オブジェクト・インスタンスのデータ・モデルおよび行セット・イテレータにより、現在の行が変更されたときに、ディテール・ビュー・オブジェクトの行セットが現在のマスター行の正しい行セットになるようにリフレッシュされます。詳細は、「実行時に行われる処理: マスター/ディテール表およびフォームのADFイテレータ」を参照してください。
bindings
要素は、フォームおよび表の値バインディングを定義します。フォーム内のテキスト・フィールドに値を移入する属性バインディングは、attributeValues
要素内で定義されます。attributeValues
要素のid
属性には各データ属性の名前が含まれ、IterBinding
属性はイテレータ・バインディングを参照し、マスター・オブジェクトのデータをテキスト・フィールドに表示します。
フォーム内のレンジ・ナビゲーション・ボタンは、action
要素で定義されたアクション・バインディングにバインドされます。属性バインディングの場合と同様に、アクション・バインディングのIterBinding
属性は、マスター・オブジェクトのイテレータ・バインディングを参照します。
ディテール・データを表示する表は、table
要素で定義される表バインディング・オブジェクトにバインドされます。IterBinding
属性は、ディテール・オブジェクトのイテレータ・バインディングを参照します。
ページ定義ファイルの要素および属性の詳細は、「pageNamePageDef.xml」を参照してください。
<executables> <variableIterator id="variables"/> <iterator Binds="Customers" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="CustomersIterator" ChangeEventPolicy="ppr"/> <iterator Binds="OrdersForCustomer" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="OrdersForCustomerIterator" ChangeEventPolicy="ppr"/> </executables> <bindings> <action IterBinding="CustomersIterator" id="First" RequiresUpdateModel="true" Action="first"/> <action IterBinding="CustomersIterator" id="Previous" RequiresUpdateModel="true" Action="previous"/> <action IterBinding="CustomersIterator" id="Next" RequiresUpdateModel="true" Action="next"/> <action IterBinding="CustomersIterator" id="Last" RequiresUpdateModel="true" Action="last"/> <attributeValues IterBinding="CustomersIterator" id="Id"> <AttrNames> <Item Value="Id"/> </AttrNames> </attributeValues> <attributeValues IterBinding="CustomersIterator" id="Name"> <AttrNames> <Item Value="Name"/> </AttrNames> </attributeValues> <attributeValues IterBinding="CustomersIterator" id="Phone"> <AttrNames> <Item Value="Phone"/> </AttrNames> </attributeValues> . . . <tree IterBinding="OrdersForCustomerIterator" id="OrdersForCustomer"> <nodeDefinition DefName="oracle.summit.model.views.OrdVO" Name="OrdersForCustomer0"> <AttrNames> <Item Value="Id"/> <Item Value="CustomerId"/> <Item Value="DateOrdered"/> ... </AttrNames> </nodeDefinition> </tree> </bindings>
注意:
EJBセッションBeanなど、ビジネス・サービスの他のタイプに基づくデータ・コントロールの場合、イテレータ・バインディングの処理にiterator
要素のかわりにaccessorIterator
要素が使用されます。
実行時に、ADFイテレータは、マスター表オブジェクトのどの行をマスター/ディテール・フォームに表示するかを決定します。フォームが最初に表示されるときは、マスター表オブジェクトの1行目がフォームのマスター・セクションに強調表示されます。マスター行に関連付けられているディテール表の行は、フォームのディテール・セクションに表示されます。
「マスター/ディテール・ページ定義ファイルで定義されるバインディング・オブジェクト」で説明しているように、ADFイテレータは基礎となるrowsetIterator
オブジェクトに関連付けられています。これらのイテレータは、ページに現在表示されているデータ・オブジェクト(つまり行)がどれかを管理します。実行時には、行セット・イテレータがマスター・コンポーネントとディテール・コンポーネントに表示されるデータを管理します。
マスターおよびディテールの行セット・イテレータは、どちらも行セット・ナビゲーション・イベント(ユーザーによるレンジ・ナビゲーション・ボタンのクリックなど)をリスニングし、適切な行をUIに表示します。デフォルトのマスター/ディテール・コンポーネントの場合は、行セット・ナビゲーション・イベントは、フォーム上のコマンド・ボタン(「先頭へ」、「前へ」、「次へ」、「最後へ」)になります。
ディテール・コレクションの行セット・イテレータは、 ディテール・データとマスター・データの同期化を管理します。マスター・ビュー・オブジェクトからディテール・ビュー・オブジェクトへの基礎となるビュー・リンクにより、ディテール行セット・イテレータは、マスター・コレクションとディテール・コレクションの両方で行ナビゲーション・イベントをリスニングします。マスター・コレクションで行セット・ナビゲーション・イベントが発生すると、ディテール行セット・イテレータが自動的に実行され、現在のマスター行に関連するディテール行が戻されます。
デフォルトのマスター/ディテール・コンポーネントでは、 マスター/ディテール・データは単一のページに表示されます。ただし、「データ・コントロール」パネルでマスター・オブジェクトとディテール・オブジェクトを使用して、バインディング・イテレータにマスター・オブジェクトとディテール・オブジェクトの同期化を管理させたまま、コレクションを別々のページ(または同じページの別のフラグメント)に表示できます。
始める前に:
マスター/ディテール表およびフォームの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「表およびフォームを使用したマスター/ディテール・オブジェクトの表示」を参照してください。
また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。
次のタスクを完了する必要があります。
「ビュー・オブジェクトのみに基づくマスター/ディテール階層の作成方法」の説明に従って、必要なマスター/ディテール階層を確立するビュー・オブジェクトとビュー・リンクのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
マスター・オブジェクトとディテール・オブジェクトを個別のページに作成するには:
たとえば、Summit ADFサンプル・アプリケーションのCustomers.jsff
フラグメントには、OrdersFromCustomer
コレクションから作成される表が含まれます。その表は、顧客注文のディテール・ビューとItemsFromOrder
コレクションから作成される注文品目表のマスター・ビューの両方として機能し、 Orders.jsff
にあります(「Order」タブに表示されます)。図34-7は、顧客のディテール・ビューとして注文表を示し、図34-8は、その表で選択される注文とその注文のディテールを示しています。OrdersFromCustomer
コレクションは、Customers.jsff
およびOrders.jsff
フラグメントの両方で使用されますが、マスター/ディテール調整を保持するために両方の場所で使用される必要はありません。ItemsFromOrder
のイテレータ・バインディングでは、ページ・フラグメントでさえも、マスター/ディテール調整が維持されます。
図34-7 1ページ・フラグメントでのマスター・ビュー
図34-8 1 個別のページ・フラグメントでのディテール・ビュー
表およびフォーム以外に、階層ツリーにもマスター/ディテール・データを表示できます。ADF Facesのtree
コンポーネントは階層データの表示に使用します。マスター・オブジェクトのバインディングによって移入される複数のルート・ノードが表示されます。ツリー内の各ルート・ノードは、ディテール・オブジェクトのバインディングによって移入されるブランチを持つことが可能で、その数に制限はありません。ツリーには複数のレベルのノードがあり、各ノードは親ノードのディテール・オブジェクトを示します。ツリー内の各ノードは、階層でのノードのレベルを示します。
tree
コンポーネントには、ツリー・ノードを開閉するメカニズムが含まれていますが、フォーカス機能はありません。フォーカス機能を使用する必要がある場合は、ADF FacesのtreeTable
コンポーネントの使用を検討してください(詳細は、「ツリー表を使用したマスター/ディテール・オブジェクトの表示」を参照)。デフォルトでは、ツリーの各ノードのアイコンはフォルダですが、独自のアイコンを階層内の各レベルのノードに使用できます。
図34-9 に、Summit ADFサンプル・アプリケーションのCustomers.jsff
フラグメントにあるツリーの例を示します。このツリーには、ルートおよびブランチの2つのノード・レベルが表示されます。ルート・ノードには、国が表示されます。ブランチ・ノードには、顧客が表示されます。
図34-9 データバインドされたADF Facesツリー
ツリーはノードの階層で構成され、各サブノードは上位レベルのノードから分岐します。データバインドされたADF Facesのtree
コンポーネントの各ノード・レベルは、異なるデータ・コレクションによって移入されます。JDeveloperでは、「ツリー・バインディングの編集」ダイアログを使用してデータバインド・ツリーを定義します。このダイアログで、ツリー内の各ノード・レベルにデータを移入するためのルールを定義できます。階層内の各ノード・レベルに対して1つのルールが必要です。それぞれのルールは、次のノード・レベル・プロパティを定義します。
ノード・レベルを移入するデータ・コレクション。
そのノード・レベルで表示される、データ・コレクションからの属性。
図34-9 で示すように、Summit ADFサンプル・アプリケーションで顧客ツリーの作成を有効にするには、ビュー・オブジェクトCountryVO
を最初に作成して、国のリストを戻します。もう1つのビュー・オブジェクトCustomerVO
も作成して、顧客を戻します。また、マスター/ディテール関係を確立するために、CountryVO
からCustomerVO
にビュー・リンクが作成されます。
この場合、CustomerVO
がビュー・オブジェクトOrdVO
へのビュー・リンクを持ち、OrdVO
がItemVO
へのビュー・リンクを持つため、第3レベルと第4レベルのノードも追加できます。
ツリーのブランチが再帰的な場合、自己参照型のビュー・リンクを伴う単一のビュー・オブジェクトをデータ・モデル・プロジェクトで定義する必要があります。たとえば、EmployeesView
で定義されたコレクションで、各ブランチのルート・ノードがManagerId
属性で指定され、同じブランチの子ノードがManagerId
に関連する従業員(直属の部下とも呼ぶ)になります。自己参照型のビュー・リンクによって名前が付けられるリンク元とリンク先の両方のビュー・オブジェクトは、どちらもEmployeesView
として定義されますが、わかりやすくするためにリンク先の名前がDirectReports
に変更されます。自己参照型のビュー・リンクの作成の詳細は、「エンティティ・ベースのビュー・オブジェクトに対する再帰的マスター/ディテール階層の作成方法」を参照してください。
注意:
ビジネス・サービスがADFビジネス・コンポーネントに基づいている場合、マスター・ビュー・オブジェトのビュー・リンク・アクセッサ属性にプログラム的にアクセスし、現在のノード・レベルのブランチとして表示するディテール・オブジェクトを戻すことができます。ビュー・リンク・アクセッサの詳細は、「ビュー・リンク・アクセッサを使用したディテール・コレクションのアクセス方法」を参照してください。
始める前に:
マスター/ディテール表およびフォームの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「ツリーを使用したマスター/ディテール・オブジェクトの表示」を参照してください。
また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。
次のタスクを完了する必要があります。
データ・モデル・プロジェクトのマスター/ディテール・ビュー・オブジェクトおよびビュー・リンクを作成し、ツリー・コンポーネントの行セット・アクセスのパフォーマンスを最適化して、マスター・ビュー・オブジェクト(および必要に応じてディテール・ビュー・オブジェクト)をアプリケーション・モジュールに追加します。最適化フラグ「行セットの保存」の設定の詳細は、「マスター/ディテール・データを表示するためのビュー・リンク・アクセッサのアクセスの最適化」を参照してください。マスター/ディテール階層を作成して、これをアプリケーション・モジュールに追加する方法の詳細は、「ビュー・オブジェクトのみに基づくマスター/ディテール階層の作成方法」を参照してください。
または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
ツリーでのマスター/ディテール・オブジェクトの表示方法:
「データ・コントロール」パネルからドラッグ・アンド・ドロップを行うと、JDeveloperによって様々な処理が自動的に行われます。「データ・コントロール」パネルの使用時に実行される処理と作成される内容の詳細は、「「データ・コントロール」パネルの使用方法」を参照してください。
「データ・コントロール」パネルを使用して「データ・コントロール」ページ定義ファイルにバインディング・オブジェクトが追加され、JSFページにtree
タグも追加されます。作成されたUIコンポーネントは、そのままで十分機能するため、変更する必要はありません。
次の例は、「データ・コントロール」パネルを使用してツリーを作成したときにJSFページで生成されるコードを示しています。このサンプル・ツリーには、国と顧客の2レベルのノードが表示されます。ルート・ノードを移入するために、Countries
コレクションが使用されています。
<af:tree value="#{bindings.Countries.treeModel}" var="node" selectionListener="#{bindings.Countries.treeModel.makeCurrent}" rowSelection="single" id="t1" <f:facet name="nodeStamp"> <af:outputText value="#{node}" id="ot1"/> </f:facet> </af:tree>
デフォルトで、フォームの中にaf:tree
タグが作成されます。tree
タグのvalue
属性には、tree
コンポーネントをページ定義ファイルのCountries
ツリー・バインディング・オブジェクトにバインドするEL式が含まれます。バインディング式のtreeModel
プロパティは、基礎となるデータ・モデルに基づいてtree
階層の表示方法を定義する、ADFクラスを参照します。var
属性は、現在のノードへのアクセスを提供します。
f:facet
タグに含まれるnodeStamp
ファセットは、各ノードのデータを表示するために使用されます。tree
では、ノードごとにコンポーネントを持つかわりに、ADF Facesの表コンポーネントに対して行がレンダリングされるのと同様の方法で、nodeStamp
ファセットが繰返しレンダリングされます。
ADF Facesのtree
コンポーネントは、oracle.adf.view.faces.model.PathSet
クラスのインスタンスを使用して、開いた状態のノードを表示します。このインスタンスは、コンポーネントのtreeState
属性として格納されます。このインスタンスを使用して、階層での要素の開閉状態をプログラム的に管理できます。PathSet
インスタンスに含まれるすべての要素は、開いた状態とみなされます。その他のすべての要素は閉じた状態です。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』のプログラムを使用したノードの開閉に関する必知事項に関する項を参照してください。
次の例は、Summit ADFサンプル・アプリケーションのCountries
ADFデータバインド・ツリーに関するページ定義ファイルで定義されるバインディング・オブジェクトを示しています。
<executables> ... <iterator Binds="Countries" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="CountriesIterator"/> </executables> <bindings> ... <tree IterBinding="CountriesIterator" id="Countries"> <nodeDefinition DefName="oracle.summit.model.views.CountryVO" Name="Countries0"> <AttrNames> <Item Value="Country"/> </AttrNames> <Accessors> <Item Value="CustomerVO"/> </Accessors> </nodeDefinition> <nodeDefinition DefName="oracle.summit.model.views.CustomerVO" Name="Countries1" TargetIterator="${bindings.CustomersIterator}"> <AttrNames> <Item Value="Id"/> <Item Value="Name"/> </AttrNames> </nodeDefinition> </tree> </bindings>
ページ定義ファイルには、ツリー・バインディング・エディタで定義された規則情報が含まれます。executables
要素では、2つのノード・レベルがツリーに表示されても、1つのイテレータ・バインディング・オブジェクトしか要求されません。このイテレータは、ツリーのルート・ノードを移入するマスター・コレクションを反復処理します。このノードで指定したアクセッサは、各ブランチ・ノードのディテール・データを戻します。
tree
要素は、ツリーに表示されるすべての属性の値バインディングです。tree
要素のIterBinding
属性は、ツリーにデータを移入するイテレータ・バインディングを参照します。tree
要素内のAttrNames
要素は、マスター・コレクション内のすべての属性のバインディング・オブジェクトを定義します。ただし、ツリーに表示するように選択する属性は、nodeDefinition
要素内のAttrNames
要素で定義されます。
nodeDefinition
要素は、ツリーのノードにデータを移入するためのルールを定義します。ノードごとに1つのnodeDefinition
要素があり、各要素には次の属性およびサブ要素が含まれます。
DefName:
ノードの移入に使用されるデータ・コレクションの完全修飾名が含まれる属性
id:
ノードの名前を定義する属性。
AttrNames
: 実行時にノードに表示される属性を定義するサブ要素。
Accessors
: ツリーの次のブランチを戻すアクセッサ属性を定義するサブ要素。
ページ定義ファイルでのnodeDefintion
要素の順序によって、ツリーでのノードの順序またはレベルが決まります。最初のnodeDefinition
要素は、ルート・ノードを定義します。後続の各nodeDefinition
要素は、先行するノードのサブノードを定義します。
ページ定義ファイルの要素および属性の詳細は、「pageNamePageDef.xml」を参照してください。
tree
コンポーネントは、org.apache.myfaces.trinidad.model.TreeModel
を使用してデータにアクセスします。このクラスは、ADF Facesのtable
コンポーネントがデータへのアクセスに使用するCollectionModel
を拡張します。TreeModel
クラスの詳細は、ADF Faces Javadocを参照してください。
tree
を含むページが表示されると、ツリーのイテレータ・バインディングによって、ルート・ノードにデータが移入されます。ユーザーがノードを開いてブランチを表示したり、閉じて非表示にすると、DisclosureEvent
イベントが送信されます。このイベントのisExpanded
メソッドは、ユーザーによるノードの操作(開いているか、閉じているか)を判断します。DisclosureEvent
イベントには、リスナーが関連付けられています。
tree
のDisclosureListener
属性は、ページ定義ファイルで定義済のノード・ルールで指定されたアクセッサ属性にバインドされます。このアクセッサ属性は、DisclosureEvent
イベントに応じて起動します。つまり、ユーザーがノードを開くたびに、アクセッサ属性によってブランチ・ノードにデータが移入されます。
ディテール・ビューをマスター・ビューと同期させるほか、ページの他の部分をツリーの選択と同期させることができます。各ノード定義(ルール)に対して、オプションのTargetIterator
プロパティを指定して、それを現在のバインディング・コンテナのイテレータ・バインディングのEL式に設定できます。その式は、ユーザーがツリーで行を選択すると、実行時に評価されます。イテレータ・バインディングのビュー行キーの属性は、ツリー用にnodeDefinition
タイプの行が取得されるイテレータのビュー行キーと(順序、数およびデータ型が)一致します。実行時に、ツリー・コントロールはselectionChanged
イベントを受け取ると、ツリーのレベルごとにキーのリストを渡します。これらのキーは選択されたノードを一意に識別します。
注意:
ページ定義エディタでノード・バインディングを開くことで、ページのnodeDefinition
要素を表示できます。これらは、ツリー・バインディング・ダイアログで構成できる同じツリー・バインディング・ルールです。
ツリー・バインディングは、ツリーの最上位から始まります。Currently Selected Tree Node Keys
リストにキーが存在するツリー・レベルごとに、そのnodeDefinition
について構成されているTargetIterator
プロパティがある場合、ツリー・バインディングは選択されたターゲット・イテレータに対してsetCurrentRowWithKey()
操作を実行します。Currently Selected Tree Node Keys
リストの適切なレベルからキーを使用します。
たとえば、Summit ADFサンプル・アプリケーションには、第1ノードで顧客を表示し、第2ノードで顧客を表示するツリーが含まれています。ユーザーがツリーで顧客を選択すると、図34-13 で示すように、顧客情報を表示するフォームがページの「Summit Customer Management」パネルに表示されます。この機能は、Countries
データ・コントロール・オブジェクト、Customers
オブジェクトから作成されるフォームおよびOrdersFromCustomer
オブジェクトから作成されるディテール表(「データ・コントロール」パネルのCustomers
の下にネストされます)から作成されたツリーで構成されます。
図34-13 ツリーの選択と同期されるフォーム
始める前に:
ツリーの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「ツリーを使用したマスター/ディテール・オブジェクトの表示」を参照してください。
また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。
次のタスクを完了する必要があります。
データ・モデル・プロジェクトのマスター/ディテール・ビュー・オブジェクトおよびビュー・リンクを作成し、ツリー・コンポーネントの行セット・アクセスのパフォーマンスを最適化して、マスター・ビュー・オブジェクト(および必要に応じてディテール・ビュー・オブジェクト)をアプリケーション・モジュールに追加します。最適化フラグ「行セットの保存」の設定の詳細は、「マスター/ディテール・データを表示するためのビュー・リンク・アクセッサのアクセスの最適化」を参照してください。マスター/ディテール階層を作成して、これをアプリケーション・モジュールに追加する方法の詳細は、「ビュー・オブジェクトのみに基づくマスター/ディテール階層の作成方法」を参照してください。
または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
ページの他の部分をツリーの選択と同期するには:
ADF FacesのtreeTable
コンポーネントを使用すると、マスター/ディテール・コレクションの階層を表に表示できます。tree
コンポーネントのかわりにtreeTable
コンポーネントを使用することの利点は、treeTable
コンポーネントがツリー内の特定のノードにフォーカスして表示するメカニズムを使用できることです。
たとえば、各ルート・ノードが個々の国を表す国および顧客のノード・レベルを表示するツリー表を作成できます。各ルート・ノードが分岐して、その国の顧客が表示されます。ツリーの場合と同様、このようなツリー表を作成するには、階層内のコレクション間でマスター/ディテール関係を持つ必要があります。
データバインドされたADF FacesのtreeTable
には、一度に1つのルート・ノードしか表示されませんが、様々なルート・ノードをスクロールするためのナビゲーションが用意されています。各ルート・ノードには、任意の数のブランチ・ノードを表示できます。各ノードは表の個別の行として表示され、各行の左端の列にはフォーカス・メカニズムが付属します。
「プロパティ」ウィンドウで、次のtreeTable
コンポーネント・プロパティを編集できます。
レンジ・ナビゲーション: ユーザーは、「前へ」および「次へ」のナビゲーション・ボタンをクリックして、ルート・ノードをスクロールできます。
リスト・ナビゲーション: 「前へ」ボタンと「次へ」ボタンの間にあるリスト・ナビゲーションにより、ユーザーは、選択リストを使用してデータ・コレクション内の特定のルート・ノードに移動できます。
ノードを開閉するためのメカニズム: ユーザーは、それぞれのノードを個別に開閉するか、「すべて開く」または「すべて閉じる」のコマンド・リンクを使用できます。デフォルトでは、個々のノードを開閉するためのアイコンは、プラス記号またはマイナス記号が表示された矢印です。カスタム・アイコンを選択して使用することもできます。
フォーカス・メカニズム: ユーザーがノードの横(左端の列)のフォーカス・アイコンをクリックすると、ページが再表示され、ノードとそのブランチのみが表示されます。親ノードに戻るためのナビゲーション・リンクも表示されます。
ADF Facesデータ・バインド・ツリー表の作成手順は、ADF Facesデータ・バインド・ツリーの作成手順とほぼ同じですが、データ・コレクションをドロップする際に、ADFツリーとしてではなくADFツリー表としてドロップします。詳細は、「ツリーでのマスター/ディテール・オブジェクトの表示方法」を参照してください。
「データ・コントロール」パネルからドラッグ・アンド・ドロップを行うと、JDeveloperによって様々な処理が自動的に行われます。「データ・コントロール」パネルの使用時に実行される処理と作成される内容の詳細は、「「データ・コントロール」パネルの使用方法」を参照してください。
「データ・コントロール」パネルを使用してデータバインド・ツリー表を作成すると、JDeveloperによって、ページ定義ファイルにバインディング・オブジェクトが追加され、JSFページにtreeTable
タグが追加されます。作成されたUIコンポーネントは、そのままで十分機能するため、変更する必要はありません。
次の例は、「データ・コントロール」パネルを使用してツリー表を作成したときにJSFページで生成されるコードを示しています。このサンプル・ツリーには、国と顧客の2レベルのノードが表示されます。
デフォルトでは、フォームの中にtreeTable
タグが作成されます。treeTable
タグのvalue
属性には、tree
コンポーネントを、データ移入を行うバインディング・オブジェクトにバインドするEL式が含まれます。treeModel
プロパティは、基礎となるデータ・モデルに基づいてツリー階層の表示方法を定義する、ADFクラスを参照します。var
属性は、現在のノードへのアクセスを提供します。
<af:treeTable value="#{bindings.Countries.treeModel}" var="node" selectionListener="#{bindings.Countries.treeModel.makeCurrent}" rowSelection="single" id="tt1"> <f:facet name="nodeStamp"> <af:column id="c1"> <af:outputText value="#{node}" id="ot1"/> </af:column> </f:facet> <f:facet name="pathStamp"> <af:outputText value="#{node}" id="ot2"/> </f:facet> </af:treeTable>
各ノードのデータの表示には、nodeStamp
ファセットが使用されます。ノードごとにコンポーネントを持つかわりに、ツリーでは、ADF Faces table
コンポーネントに対して行がレンダリングされるのと同様の方法で、nodeStamp
ファセットが繰返しレンダリングされます。pathStamp
ファセットは、ユーザーがディテール・ノードにフォーカスした後で親ノードに戻れるように、表の上に列およびパスのリンクをレンダリングします。
ツリー表に対してページ定義ファイルで作成されるバインディング・オブジェクトは、ツリーに対して作成されるものとまったく同じです。詳細は、「ページ定義ファイルで定義されるバインディング・オブジェクト」を参照してください。
tree
コンポーネントは、oracle.adf.view.faces.model.TreeModel
を使用してデータにアクセスします。このクラスは、ADF Facesのtable
コンポーネントがデータへのアクセスに使用するCollectionModel
を拡張します。TreeModel
クラスの詳細は、ADF Faces Javadocを参照してください。
ツリー表を含むページが表示されると、treeTable
コンポーネントのイテレータ・バインディングは、ルート・ノードに値を移入し、行ナビゲーション・イベント(ユーザーによる「次へ」ボタンまたは「前へ」ボタンのクリック、もしくはレンジ・ナビゲータからの行の選択)をリスニングします。ユーザーが行ナビゲーション・イベントを開始すると、イテレータによって適切な行が表示されます。
ユーザーがコンポーネントのフォーカス・アイコンをクリックして表示のフォーカスを変更すると、treeTable
コンポーネントによってフォーカス・イベント(FocusEvent
)が生成されます。フォーカス変更後のノードが現在のノードになった後で、イベントが配信されます。その後、treeTable
コンポーネントによってfocusPath
プロパティが適切に変更されます。ツリー上のFocusListener
属性は、マネージドBeanのメソッドにバインドできます。これにより、このメソッドはフォーカス・イベントに応じて起動されます。
ユーザーがノードを開閉するたびに、公開イベント(DisclosureEvent
)が送信されます。この公開イベントのisExpanded
メソッドは、ユーザーの操作に基づいてノードを開くか閉じるかを判断します。公開イベントには、リスナーDisclosureListener
が関連付けられます。ツリー表上のDisclosureListener
属性は、ページ定義ファイルで定義済のノード規則で指定されたアクセッサ属性にバインドされます。このアクセッサ属性は、公開イベント(ユーザーがノードを開くなど)に応じて起動し、そのノードを移入するコレクションを戻します。
treeTable
コンポーネントには、「すべて開く」リンクおよび「すべて閉じる」リンクも表示されます。ユーザーがどちらかのリンクをクリックすると、treeTable
によってDisclosureAllEvent
イベントが送信されます。このイベントのisExpandAll
メソッドは、ユーザーの操作に基づいてすべてのノードを開くか閉じるかを判断します。その後、現在フォーカスしているルート・ノードの子ノードが、開くか閉じます。大規模なツリーの場合は、「すべて開く」コマンドを使用しても、直下の子より下にあるノードは開きません。ADF FacesのtreeTable
コンポーネントでは、oracle.adf.view.faces.model.PathSet
クラスのインスタンスを使用して、開いたノードが判別されます。このインスタンスは、コンポーネントのtreeState
属性として格納されます。このインスタンスを使用して、階層でのノードの開閉状態をプログラム的に管理できます。PathSet
インスタンスに含まれるすべてのノードは、開いているとみなされます。その他のすべてのノードは閉じた状態になります。このクラスでは、addAll()
やremoveAll()
のような操作もサポートされます。
ADF FacesのtreeTable
コンポーネントの詳細は、ADF Faces Javadocのoracle.adf.view.faces.component.core.data.CoreTreeTable
クラスを参照してください。
ADF FacesのlistView
コンポーネントを使用すると、マスター/ディテール・コレクションの階層を単純なツリー表に表示できます。各オブジェクトの属性は、グループまたは単一行および単一列内のグリッドに表示されます。
たとえば、図34-14 に示すように、注文を表示して、それらを顧客別にグループ化するlistView
を作成できます。
図34-14 listViewコンポーネントがあるマスター/ディテール
データバインドされたリスト・ビューの使用の詳細は、「コレクションのリスト・ビューの作成」を参照してください。
「リスト・ビューの作成」ウィザードを使用して、リストを作成します。ウィザードでは、panelGroupLayout
またはpanelGridLayout
コンポーネントを選択して、リスト・アイテムのコンポーネントを配置できます。
始める前に:
マスター/ディテール・リスト・ビューの作成で使用可能な各オプションを理解しておくと役立つことがあります。詳細は、「リスト・ビューを使用したマスター/ディテール・オブジェクトの表示」を参照してください。
また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。
次のタスクを完了する必要があります。
必要なマスター/ディテール階層を確立するビュー・オブジェクトとビュー・リンクのインスタンスを含むアプリケーション・モジュールを作成します(「アプリケーション・モジュールの作成と変更」を参照)。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
リスト・ビューを作成する手順:
ウィザードを使用してグループ・ヘッダー付きのlistView
コンポーネントを作成する場合、JDeveloperでは、listView
、listItem
およびレイアウト・コンポーネントが作成および構成されます。listView
には、詳細アイテムのlistItem
と、グループ・ヘッダー・スタンプのfacet
が含まれます。グループ・ヘッダー・スタンプには、マスター・アイテムのlistItem
が含まれます。
バインディングは、表の場合と同じです。listView
コンポーネントは、「データ・コントロール」パネルから削除されたコレクションの親にバインドされています。このコンポーネントのvar
属性の値は、表の場合と同じ方法で、データにアクセスするためにoutputFormatted
コンポーネントによって使用されます。コレクションのページ定義コードとJSPコードの詳細は、「表の作成時の処理」を参照してください。
次の例は、図34-14に示した単純な表のページ・コードを示しています。
<af:form id="f1"> <af:panelGridLayout id="pgl1"> <af:gridRow height="100%" id="gr1"> <af:gridCell width="100%" halign="stretch" valign="stretch" id="gc1"> <!-- Content --> <af:listView value="#{bindings.Customers.treeModel}" var="item" emptyText="#{bindings.Customers.viewable ? 'No data to display.' : 'Access Denied.'}" fetchSize="#{bindings.Customers.rangeSize}" id="lv1"> <af:listItem id="li1"> <af:panelGroupLayout layout="horizontal" id="pgl2"> <f:facet name="separator"> <af:spacer width="10" id="s1"/> </f:facet> <af:outputFormatted value="#{item.bindings.DateOrdered.inputValue}" id="of1"> <af:convertDateTime pattern="#{bindings.Customers.hints.DateOrdered.format}"/> </af:outputFormatted> <af:outputFormatted value="#{item.bindings.Total.inputValue}" id="of2"> <af:convertNumber groupingUsed="false" pattern="#{bindings.Customers.hints.Total.format}"/> </af:outputFormatted> </af:panelGroupLayout> </af:listItem> <f:facet name="groupHeaderStamp"> <af:listItem id="li2" inlineStyle="font-size:medium;"> <af:panelGroupLayout layout="horizontal" id="pgl3"> <f:facet name="separator"> <af:spacer width="10" id="s2"/> </f:facet> <af:outputFormatted value="#{item.bindings.Name.inputValue}" id="of3"/> </af:panelGroupLayout> </af:listItem> </f:facet> </af:listView> </af:gridCell> </af:gridRow> </af:panelGridLayout> </af:form>
アプリケーションでなんらかの処理を行うために、ツリーまたはツリー表で選択されているノードを判別する必要が生じることがあります。たとえば、アプリケーションで、ユーザーによって選択される製品カテゴリ・ノードに一致する製品を決定するための処理が必要になる場合があります。
ユーザーがツリーのノード(または表の行)を選択するたびに、コンポーネントは選択イベントを起動します。selectionEvent
イベントは、選択解除された行と選択された行をレポートします。現在の選択内容、つまり選択済の行は、RowKeySet
オブジェクトによって管理され、このオブジェクトは、行の関連キーをキー・セットに追加、またはキーセットから削除することで、現在選択されているすべてのノードを追跡します。ユーザーが新しいノードを選択したときに、ツリーまたは表が単一選択用に構成されている場合、それまで選択されていたキーは破棄され、新たに選択されたキーが追加されます。ツリーまたは表が複数選択用に構成されている場合は、新たに選択されたキーがセットに追加されます。それまで選択されていたキーを破棄するかどうかは、ノードの選択方法によって決まります。たとえば、ユーザーが[Ctrl]キーを押した場合、新たに選択されたノードは現在のセットに追加されます。
選択イベントの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の表の選択された行でのアクションの実行に関する必知事項に関する項を参照してください。
注意:
選択したノードおよびページ上の他のUIコンポーネント間の行の現在位置を同期させる必要がある場合、各ノード定義に対してTargetIterator
プロパティを使用して宣言的に実行できます。詳細は、「ページの他の部分をツリーの選択と同期する方法」を参照してください。
ツリーまたは表内で選択項目を変更すると、ページ内のリージョン間の通信を実行するコンテキスト・イベントもトリガーされます。詳細は、「コンテキスト・イベントの使用方法」を参照してください。