Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.2.1) E70030-02 |
|
![]() 前 |
![]() 次 |
この章の内容は次のとおりです。
フォームとは異なり、表を使用すると、コレクションのデータ・オブジェクトを一度に複数表示できます。
単にデータを表示する表を作成することも、データの編集または作成が可能な表を作成することもできます。コレクションを表としてドロップすると、選択した行に対してなんらかのロジックを実行するアクションにバインドされたコマンド・ボタンを追加できます。また、必要に応じてデフォルトのコンポーネントを変更することもできます。
単純な表と同様に、各オブジェクトの属性の表示にグリッドを使用するリストにオブジェクトのコレクションを表示することもできます。
表およびツリー・コンポーネントを実装する前に、他のADF Faces機能を理解することが役立つ場合があります。また、ページにツリーまたは表コンポーネントを追加した後で、検証やアクセシビリティなどの機能を追加することが必要になる場合があります。表およびツリー・コンポーネントで使用できる他の機能へのリンクを次に示します。
ADFビュー・オブジェクト: 表内でのコンポーネントの表示方法および機能のほとんどは、対応するビュー・オブジェクトによって制御されます。詳細は、「ビュー・オブジェクトを使用したSQL問合せの定義」を参照してください。
ADFアプリケーション・モジュール: ページにデータバインドされたコンポーネントをドラッグする「データ・コントロール」パネルに、アプリケーション・モジュールに追加したビュー・オブジェクトの表示が移入されます。詳細は、「アプリケーション・モジュールによるビジネス・サービスの実装」を参照してください。
アダプタベースのデータ・コントロール: EJBコンポーネントやWebサービスなど他のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』の説明に従って、ビジネス・サービス用データ・コントロールを作成できます。
ADFモデルとデータ・バインディング: ADF Webアプリケーション内でデータバインドされた表を作成する場合は、ADFモデルおよびデータ・バインディングを使用します。詳細は、「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。
ADF Faces: ADF Facesを使用した開発の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』を参照してください。
コマンド・ボタン: データ・セットに対して様々な機能を起動するためのコマンド・ボタンやリンクを追加できます。この章で説明したもの以外の高度な機能については、「ビュー・レイヤーで各機能を起動するコマンド・コンポーネントの使用」を参照してください。
フィルタ処理された表: フィルタリングを可能にする表を作成できます。これにより、実質的に表内のデータに対し、例による問合せ検索を実行できます。詳細は、「スタンドアロンのフィルタ処理された検索表を名前付きビュー基準から作成」を参照してください。
タスク・フロー: トランザクションに携わる表の場合は(入力表など)、表のレンダリングの前または後に、ADFタスク・フローを使用して特定の操作を起動する必要があります。詳細は、「ADFタスク・フローの作成」を参照してください。
検証: 特定のフィールドがデータ・ストアに送信される前に、このフィールドを検証する必要がある場合もあります。詳細は、「検証とビジネス・ルールの宣言的な定義」および「ADFモデル・レイヤーでの検証の使用」を参照してください。
アクティブ・データ: アプリケーションでアクティブ・データを使用する場合は、データ・ソースのデータが変更されるたびに、表およびツリーのデータを自動的に更新できます。詳細は、「アクティブ・データ・サービスの使用」を参照してください。
注意:
アクティブ・データを使用し、アプリケーションでADFビジネス・コンポーネントを使用する場合は、表が次の条件に適合する必要があります。
アクセッサが依然として、似たようなアクセッサにアクセスしているとしても、バインディングが同種のデータ(つまり、ルールは1つのみ)を表していること。
バインディング・ルールに含まれる属性は1つであること。
表でフィルタを使用しないこと。
ツリー・コンポーネントのnodeStamp
ファセットに、単一のoutputText
タグが含まれ、他のタグが含まれていないこと。
フォームを構成する個々のUIコンポーネントをコレクション上の個々の属性にバインドするフォームとは異なり、表では、ADF Facesのtable
コンポーネントをコレクション全体にバインドするか、コレクションから一度にnデータ・オブジェクトのレンジにバインドします。その結果、列にデータを表示するために使用される個々のコンポーネントが属性にバインドされます。イテレータ・バインディングによって各オブジェクトの適切なデータが表示され、table
コンポーネントによって各オブジェクトが1行で表示されます。JDeveloperを使用すると、宣言的にこの処理を実行できるため、コードを記述する必要がありません。
データ・コントロールを使用して表を作成するには、table
コンポーネントをコレクションにバインドします。JDeveloperでは、「データ・コントロール」パネルからコレクションをドラッグ・アンド・ドロップして、宣言的にこの処理を実行できます。
始める前に:
ADF Facesによるデータバインドされた表について理解しておくと役立ちます。詳細は、「基本表の作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド表の追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
データ・バインドされた表を作成するには:
「データ・コントロール」パネルから表をドロップすると、テキスト・フィールドまたはフォームをドロップするのと同じ効果があります。要約すると、JDeveloperによって行われる処理は次のとおりです。
表のバインディングを作成し、ページ定義ファイルにそのバインディングを追加します。
UIコンポーネントに必要なコードをJSFページに追加します。
詳細は、「テキスト・フィールドの作成時の処理」を参照してください。
「データ・コントロール」パネルから表をドロップすると、tree
の値バインディングが作成されます。ツリーはノードの階層で構成され、各サブノードは上位レベルのノードから分岐します。表の場合、フラット化された階層であり、各属性(列)は表のサブノードになります。フォームで使用される属性バインディングと同様で、tree
の値バインディングによってイテレータ・バインディングが参照されると同時に、イテレータ・バインディングによってデータ・コレクションのイテレータが参照されるため、コレクションのデータ・オブジェクト全体の反復が円滑に行われます。属性ごとに異なるバインディングが作成されるのではなく、表ノードへのツリー・バインディングのみが作成されます。ツリー・バインディングでは、表の各行で表示または参照に使用する各属性の子要素が、nodeDefinition
要素のAttrNames
要素に含まれています。
ツリーの値バインディングは、FacesCtrlHierBinding
クラスのインスタンスです。このクラスは、コアのJUCtrlHierBinding
クラスを拡張して、次の2つのJSF固有のプロパティを追加します。
collectionModel
: JSFおよびADF Facesで表などのコレクション値コンポーネントに使用するjavax.faces.model.DataModel
オブジェクトを拡張するオブジェクトによってラップされたデータを戻します。
treeModel
: collectionModel
を拡張し、実質的に階層構造であるデータを戻します。詳細は、「マスター/ディテール・データの表示」を参照してください。
次の例は、ADFタスク・フローのProductVO1
コレクションのSummitサンプル・アプリケーションをドロップすると作成される表の値バインディングを示しています。
<bindings> <tree IterBinding="ProductVO1Iterator" id="ProductVO1"> <nodeDefinition DefName="oracle.summit.model.views.ProductVO" Name="ProductVO10"> <AttrNames> <Item Value="Id"/> <Item Value="Name"/> <Item Value="ShortDesc"/> <Item Value="LongtextId"/> <Item Value="ImageId"/> <Item Value="SuggestedWhlslPrice"/> <Item Value="WhlslUnits"/> </AttrNames> </nodeDefinition> </tree> </bindings>
データにアクセスする必要があるのは表のみであるため、(列または個々のセル内のテキスト・コンポーネントではなく)モデルにバインドする必要があるのは表コンポーネントのみです。表のツリー・バインディングは表の個々の構造化属性にドリルダウンするので、表の列は表コンポーネントからその情報を導出できます。
「データ・コントロール」パネルを使用してJSFページに表をドロップすると、表バインディングで指定された各属性に対するADF Facesのcolumn
コンポーネントが含まれたADF Facesのtable
コンポーネントがJDeveloperによって挿入されます。各列には、属性の値にバインドされた別のコンポーネント(inputText
コンポーネントやoutputText
コンポーネントなど)が含まれます。各列の見出しは、属性のコントロール・ヒントのlabels
プロパティにバインドされます。
ヒント:
関連するビューまたはエンティティ・オブジェクトで属性が非表示としてマークされている場合、対応するUIは作成されません。
次の例は、ProductsVO1
コレクションを読取り専用表としてドロップして作成した表から抜粋したコードを示しています。
<af:table value="#{bindings.ProductVO1.collectionModel}" var="row" rows="#{bindings.ProductVO1.rangeSize}" emptyText="#{bindings.ProductVO1.viewable ? 'No data to display.' : 'Access Denied.'}" fetchSize="#{bindings.ProductVO1.rangeSize}" rowBandingInterval="0" selectedRowKeys="#{bindings.ProductVO1.collectionModel.selectedRow}" selectionListener="#{bindings.ProductVO1.collectionModel.makeCurrent}" rowSelection="single" id="t1"> <af:column headerText="#{bindings.ProductVO1.hints.Id.label}" id="c1"> <af:outputText value="#{row.Id}" shortDesc="#{bindings.ProductVO1.hints.Id.tooltip}" id="ot1"> <af:convertNumber groupingUsed="false" pattern="#{bindings.ProductVO1.hints.Id.format}"/> </af:outputText> </af:column> <af:column headerText="#{bindings.ProductVO1.hints.Name.label}" id="c2"> <af:outputText value="#{row.Name}" shortDesc="#{bindings.ProductVO1.hints.Name.tooltip}" id="ot2"/> </af:column> <af:column headerText="#{bindings.ProductVO1.hints.ShortDesc.label}" id="c3"> <af:outputText value="#{row.ShortDesc}" shortDesc="#{bindings.ProductVO1.hints.ShortDesc.tooltip}" id="ot3"/> </af:column> . . . </af:table>
ツリー・バインディングは、イテレータ・バインディングによって公開されたデータ全体を反復します。表の値は、collectionModel
オブジェクトにアクセスするcollectionModel
プロパティにバインドされています。表は、イテレータ・バインディングからの結果セットをcollectionModel
オブジェクト内にラップします。collectionModel
により、コレクションの各アイテムは、var
属性を使用して表コンポーネント内で使用できるようになります。
例では、表がProductVO1
イテレータ・バインディングの現在レンジの行全体を反復します。イテレータ・バインディングは、現在行の追跡を続行する行セット・イテレータにバインドします。表のvar
属性をrow
に設定すると、次のaf:outputText
タグの値に示すように、各列はrow
変数を使用して、表タグに示される現在行の現在データ・オブジェクトにアクセスします。
<af:outputText value="#{row.Id}"/>
ADF表をドロップし、それを読取り専用表として指定しない場合は、次の例に示すように、出力コンポーネントではなく、入力コンポーネントが生成されます。入力コンポーネントの値は、行変数にバインドされるのではなく、bindings
プロパティを使用してバインディング・コンテナの特定の行に暗黙的にバインドされます。さらに、入力コンポーネントごとにバリデータ・コンポーネントが追加されます。bindingsプロパティを使用すると、発生した例外を該当するバインド・オブジェクトにリンクできます。コントローラは、バインディング・コンテナ内のすべての例外を反復処理し、FacesMessage
オブジェクトの作成時にクライアントIDを取得するためのバインディング・オブジェクトを取得します。この取得により、特定のセルのエラーを表に表示できるようになります。この方法は、リストなどの選択コンポーネントを含め、すべての入力コンポーネントに使用されます。
<af:table value="#{bindings.ProductVO1.collectionModel}" var="row" rows="#{bindings.ProductVO1.rangeSize}" emptyText="#{bindings.ProductVO1.viewable ? 'No data to display.' : 'Access Denied.'}" fetchSize="#{bindings.ProductVO1.rangeSize}" rowBandingInterval="0" id="t1"> <af:column headerText="#{bindings.ProductVO1.hints.Id.label}" id="c1"> <af:inputText value="#{row.bindings.Id.inputValue}" label="#{bindings.ProductVO1.hints.Id.label}" required="#{bindings.ProductVO1.hints.Id.mandatory}" columns="#{bindings.ProductVO1.hints.Id.displayWidth}" maximumLength="#{bindings.ProductVO1.hints.Id.precision}" shortDesc="#{bindings.ProductVO1.hints.Id.tooltip}" id="it1"> <f:validator binding="#{row.bindings.Id.validator}"/> <af:convertNumber groupingUsed="false" pattern="#{bindings.ProductVO1.hints.Id.format}"/> </af:inputText> </af:column>
ADF Facesのバリデータとコンバータの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「入力の検証および変換」を参照してください。
表32-1に、「データ・コントロール」パネルを使用して作成されたADF Faces表に対して、デフォルトで定義された他の属性を示します。
表32-1 ADF Faces表の属性と移入される値
属性 | 説明 | デフォルト値 |
---|---|---|
|
一度に表示する行数を決定します。 |
デフォルトで、関連付けられたイテレータ・バインディングの |
|
レンジの最初の行の索引(ベース0)。 |
関連付けられたイテレータ・バインディングの |
|
戻す行がない場合に表示するテキスト。 |
イテレータの表示可能なプロパティに評価されるEL式。表が表示可能で、戻すオブジェクトがない場合、「表示するデータがありません」と表示されます。表が表示できない場合(表に対して認可の制限が設定されている場合など)は、「アクセスが拒否されました」と表示されます。 |
|
データソースからフェッチされたデータの行数。 |
デフォルトで、関連付けられたイテレータ・バインディングの 表でのスクロール動作を向上させるため、表のイテレータ・バインディングが200超の項目で構成されるデータ・セットを管理すると想定され、ビュー・オブジェクトが範囲ページングを使用するように構成されている場合、イテレータは1つの範囲のみではなく範囲のセットを実際には戻します。ビュー・オブジェクトの範囲ページングの使用方法の詳細は、「大きい結果セットを効率的にスクロールするための範囲ページ移動の使用方法」を参照してください。JPAベースのデータ・コントロールの範囲ページングの詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のEJBデータ・コントロールでのデータのページ分割されたフェッチに関する項を参照してください。 |
|
表の選択の状態。 |
デフォルトでコレクション・モデルの選択された行に評価されるEL式。 |
|
選択したイベントをリスニングするメソッドへの参照。 |
デフォルトでコレクション・モデルの |
|
行が選択可能かどうかを決定します。 |
一度に1行のみ選択するには |
列属性 |
||
|
列をソートする対象となるプロパティを決定します。 |
列の対応する属性バインディング値に設定します。 |
|
ソートできる列かどうかを決定します。 |
|
|
列の上部に表示されるテキストを決定します。 |
デフォルトで、対応する属性に設定されたラベルのコントロール・ヒントに評価されるEL式。 |
アプリケーションで表を使用し、ADFモデル・レイヤーで行選択を管理できるようにする場合、現在行はイテレータによって決定されます。ユーザーがADF Faces表で行を選択すると、表の行が影付きになり、選択された行がコンポーネントによりイテレータに通知されます。そのためには、次の例に示すように、表のselectedRowKeys
属性をコレクション・モデルの選択した行にバインドします。
<af:table value="#{bindings.ProductVO1.collectionModel}" var="row" . . . selectedRowKeys="#{bindings.ProductVO1.collectionModel.selectedRow}" selectionListener="#{bindings.ProductVO1.collectionModel.makeCurrent}" rowSelection="single">
このバインディングは、表の選択したキーをコレクション・モデルの選択した行にバインドします。selectionListener
属性は、コレクション・モデルのmakeCurrent
プロパティにバインドされます。このバインディングは、コレクションの選択した行をイテレータの現在行に設定します。
注意:
カスタム選択リスナーを作成した場合、コレクション・モデル(#{binding.Products.collectionModel.makeCurrent}
など)のmakeCurrent
プロパティへのメソッド・バインディングを作成し、任意のカスタム・ロジックの前にこのメソッド・バインディングをカスタム選択リスナーで起動する必要があります。
表は選択を自動的に処理できますが、オブジェクトの現在行をイテレータにプログラムで設定する必要がある場合があります。
getKey()
メソッドをどのビュー行でコールしても、行を識別する1つ以上のキー属性をカプセル化するKey
オブジェクトを取得できます。findByKey()
メソッドを使用して行セットのビュー行を検索するためにKey
オブジェクトを使用することもできます。実行時に、setCurrentRowWithKey
またはsetCurrentRowWithKeyValue
のいずれかの組込み操作がデータ・バインディング・レイヤーによって名前で起動されると、findByKey()
メソッドを使用して、パラメータとして渡された値に基づいて行が検索された後、検索された行が現在の行として設定されます。
setCurrentRowWithKey
操作およびsetCurrentRowWithKeyValue
操作ではいずれもrowKey
という名前のパラメータが予想されますが、実行時にそのrowKey
パラメータに予想される値はそれぞれで異なります。
setCurrentRowWithKey
では、rowKey
パラメータ値に、ビュー行キーのシリアライズされた文字列表現が想定されています。これは、次のような16進エンコード文字列です。
000200000002C20200000002C102000000010000010A5AB7DAD9
キーのシリアライズされた文字列表現により、ブラウザのURL文字列またはフォーム・パラメータで単一値として渡すことができる方法で、ビュー行のキーを構成する可能性のあるすべてのキー属性がエンコードされます。実行時に、有効なシリアライズされた文字列キーではないパラメータ値を不注意に渡すと、oracle.jbo.InvalidParamException
またはjava.io.EOFException
などの例外を結果として受信する場合があります。Webページでは、ADFコントロール・バインディングのrowKeyStr
プロパティ(#{bindings.SomeAttrName.rowKeyStr}
など)またはADF Faces表の行変数(#{row.rowKeyStr}
など)を参照すると、行のシリアライズされた文字列キーの値にアクセスできます。
setCurrentRowWithKeyValue
操作では、rowKey
パラメータ値がビュー行のキーを表すリテラル値であると想定しています。たとえば、製品番号201
を検索する場合、この値は単に201
になります。
注意:
アプリケーション・モジュール・クラスにカスタム・コードを記述し、クライアントから渡されたシリアライズされた文字列キーに基づいて行を検索する必要がある場合は、oracle.jbo.client
パッケージにあるJboUtil
クラスのgetRowFromKey()
メソッドを次のように使用できます。
static public Row getRowFromKey(RowSetIterator rsi, String sKey)
第1パラメータは、行を検索するビュー・オブジェクト・インスタンスです。第2パラメータは、キーのシリアライズされた文字列書式です。
CollectionModel
では行キー・パラメータを取るgetRowData
メソッドのバージョンがサポートされているため、現在の位置を変更することなく行データを取得できます。
たとえば、このコードを置き換えることができます。
CollectionModelInstance.setRowKey(RowKeyInstance); JUCtrlHierNodeBinding rowData = (JUCtrlHierNodeBinding) CollectionModelInstance.getRowData();
次のコードで置き換えることができます。
JUCtrlHierNodeBinding rowData = (JUCtrlHierNodeBinding) CollectionModelInstance.getRowData(RowKeyInstance);
これは、setRowKey
メソッドの使用を回避できるため、ビュー・オブジェクトで範囲ページ移動を使用する際には特に役立ちます。(setRowKey
を使用する場合、そのメソッドで指定する行が現在の行範囲内にあることを確認するため、カスタム・コードを提供する必要がある場合もあります。)
表コンポーネントをページに追加するとき、表のサイズ設定で、表示行数は、基礎となるビュー・オブジェクトで設定されたフェッチ・サイズよりも小さくするため、合計行数の一部分のみとなります。実行時、合計行数が表の行数よりも非常に多い場合、ユーザーが結果セットをスクロールするとき、ユーザーがスクロールを停止して、スクローラの最終位置が確定されるまで、対応する行のレンダリングを待機することが通常は適切です。このデフォルトの動作は、スクローラの位置が確定されるまで表の行が変更されないため、遅延スクロールと呼ばれます。これに対し、結果セット全体をスクロールするために必要となるフェッチの回数(基礎となるビュー・オブジェクトのフェッチ・サイズの倍数が行数に達する最小の回数が必要です)が少ない場合、スクローラの位置の変化に対応する表の行が表示される、スムーズ・スクロールが適切です。
表のイテレータ・バインディングのRowCountThreshold属性を使用して、必要な表スクロール動作を構成できます。デフォルトの属性値(0)では、表が最初にレンダリングされるときに推定行数が取得され、大規模な結果セットの遅延スクロールがサポートされます。この場合、最初にスクローラのサイズが決定され、ユーザーが結果セットをスクロールしても変更されません。
スムーズ・スクロールをサポートするには、表コンポーネントのイテレータ・バインディングのRowCountThreshold属性を0未満の値(-1など)に設定します。これにより、小さい結果セットのスムーズ・スクロールが実行され、最後の行セットがフェッチされるまで推定行数の取得が遅延されます。この場合、スクローラのサイズおよび位置は、表によってフェッチされる行数によって決定されるため、ユーザーが結果セットをスクロールするのに伴ってスクローラが小さくなります。
または、スムーズ・スクロールを開始するしきい値を構成する場合は、RowCountThreshold属性を0より大きい値に設定できます。表がレンダリングされるときに推定行カウントが実行され、行数が指定した値よりも小さい場合は、フレームワークによりデフォルトの動作(スクローラの位置が確定されるまで行のスクロールを遅延する)が実行されます。推定行数がしきい値を超えると、表でスムーズ・スクロール動作が実行されます。
ユーザーが表内の情報を編集し、その変更をデータ・ソースにコミットできるようにする表を作成できます。組込みデータ制御操作を使用して、データを変更するためのコマンド・ボタンを作成し、このボタンを表のツールバーに配置できます。たとえば、Delete
操作を使用して、ユーザーが現在のレンジからレコードを削除できるボタンを作成します。
重要なのは、コレクション固有の操作がADFキャッシュのオブジェクトに対してのみ実行されるという点です。ルート・データ・コントロール上でCommit
操作を使用して、任意の変更をデータソースに実際にコミットする必要があります。データ・コントロールのRollback
操作を使用して、キャッシュされたオブジェクトに対する任意の変更をロールバックします。ページが、バインド・タスク・フロー内のトランザクションの一部である場合、通常、タスク・フロー・リターン・アクティビティのトランザクションを解決するためにこの操作を使用します。詳細は、「タスク・フローのトランザクションの管理」を参照してください。
注意:
WebサービスやステートレスEJBセッションBeanに基づくデータ・コントロールなど、Commit
およびRollback
操作が使用できないデータ・コントロールの場合、データ・ソースにデータを保存するカスタム・メソッドを提供する必要があります。JPA-ベースのデータ・コントロールの場合、mergeEntity
またはpersistEntity
メソッドを使用して変更を保存できますが、これらのメソッドは単一行でのみ動作します。JPAベースのデータ・コントロールの使用の詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のEJBセッションBeanのコミット・モデルに関する項を参照してください。
編集可能なコンポーネントを使用してデータを表示することにした場合、ただちにすべての行を変更可能として表示する表か、ユーザーが行内をダブルクリックするまですべての行を読取り専用として表示する表という選択肢があります。図32-4 は、すべての行に編集可能フィールドがある表を示しています。ページは、ページに追加されたコンポーネント(inputText
およびinputDate
コンポーネントなど)を使用してレンダリングされます。
図32-4 編集可能フィールドがある表
図32-5 は、同じ表ですが、データを編集または入力するにはユーザーが行をダブルクリック(または行がすでに選択されている場合はシングルクリック)する必要があるように構成されています。図32-4
と同じ入力コンポーネントを使用してページは作成されていますが、outputText コンポーネントを使用して選択されていない行のデータが表示されることに注意してください。これらのコンポーネントを実際にレンダリングしている行は、編集のために選択された行のみです。
図32-5 行の編集のためにクリックする表
ADF Facesの表コンポーネントによる編集の処理方法の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の表、ツリーおよびツリー表のデータの編集に関する項を参照してください。
編集可能な表を作成するには、基本表の作成に類似した手順に従い、続いて操作にバインドされたコマンド・ボタンを追加します。ただし、表にツールバーを含めるには、表の作成に使用されたコレクションのアイテムとツールバーを関連付けるADF Facesコンポーネントを追加する必要があります。
始める前に:
編集可能なデータバインド表について理解しておくと役立ちます。詳細は、「編集可能な表の作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド表の追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
編集可能な表を作成するには:
ヒント:
データ・ストアに新規レコードを挿入できる表を作成するには、「入力表の作成」を参照してください。
編集可能な表の作成は、レコードの編集に使用するフォームの作成と類似しています。「データ・コントロール」パネルからドロップした操作に対してアクション・バインディングが作成されます。詳細は、「操作を使用したコマンド・コンポーネント作成時の処理」を参照してください。
ユーザーが表に新しく空白行を挿入し、各列に値を追加することのできる表を作成できます(対応するエンティティ・オブジェクトまたはビュー・オブジェクトに設定されたデフォルト値は自動的に移入されます)。
入力表を作成する際に、現在の行セット内の他の行のコンテキストにある新しい空白行をユーザーに表示する必要があります。この挿入を許可するには、CreateInsert
操作を使用します。Create
操作とは異なり、CreateInsert
操作は、実際にはキャッシュのみではなく行セット内に新しい行を作成します。また、ユーザー・アクションに対応するよう表を構成する必要があります。ページ全体をリフレッシュするのではなく、他のコンポーネントとの対話に基づいて1つのコンポーネントをリフレッシュするようにADF Facesコンポーネントを設定できます。これは、部分ページ・レンダリングと呼ばれます。
注意:
CreateInsert
操作は、WebサービスやJavaクラスに基づく操作など、アダプタベースのデータ・コントロールには利用できません。ただし、JPAベースのデータ・コントロールの場合、Create
操作により、新規行がアプリケーション・モジュールに基づくデータ・コントロール用のCreateInsert
などの行セットに追加されます。詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールの組込み操作に関する項を参照してください。
始める前に:
ADF Facesの入力表について理解しておくと役立ちます。詳細は、「入力表の作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド表の追加機能」を参照してください。
次のタスクを完了する必要があります。
「編集可能な表の作成」の説明に従い、編集可能な表を作成します。
表がバインド・タスク・フローの一部でない場合は、Commit
操作とRollback
操作にバインドされたボタンを含めます。
入力表を作成するには:
CreateInsert
操作を使用して入力表を作成すると、JDeveloperによって次の処理が行われます。
コレクションのイテレータ・バインディング、CreateInsert
操作のアクション・バインディング、および表の属性バインディングの作成。CreateInsert
操作は、行セットに新しい行を作成します。Commit
操作およびRollback
操作を使用してコマンド・ボタンまたはリンクを作成した場合、JDeveloperではこれらの操作のアクション・バインディングも作成されます。
ADF Faces table
コンポーネント、column
コンポーネント、inputText
コンポーネントおよび操作の場合はbutton
コンポーネントを使用した、JSFページへのコードの挿入。
次の例は、ProductVO1
コレクションから作成された入力表のページ定義ファイルを示しています(属性の中には、コレクションをドロップしたときに、「表の作成」ダイアログで削除されたものがあります)。
<executables> <iterator Binds="ProductVO1" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="ProductVO1Iterator"/> </executables> <tree IterBinding="ProductVO1Iterator" id="ProductVO1"> <nodeDefinition DefName="oracle.summit.model.views.ProductVO" Name="ProductVO10"> <AttrNames> <Item Value="Id"/> <Item Value="Name"/> <Item Value="ShortDesc"/> <Item Value="LongtextId"/> <Item Value="ImageId"/> <Item Value="SuggestedWhlslPrice"/> <Item Value="WhlslUnits"/> </AttrNames> </nodeDefinition> </tree> <action IterBinding="ProductVOIterator" id="CreateInsert" RequiresUpdateModel="true" Action="createInsertRow"/> <action id="Commit" RequiresUpdateModel="true" Action="commitTransaction" DataControl="BackOfficeAppModuleDataControl"/> <action id="Rollback" RequiresUpdateModel="false" Action="rollbackTransaction" DataControl="BackOfficeAppModuleDataControl"/> </bindings>
次の例は、表をリフレッシュするためのトリガーとしてCreateInsert
コマンド・ツールバー・ボタンを使用して、部分ページ・レンダリングを提供する、JSFページに追加されたコードを示しています。
<af:form> <af:panelCollection id="pc1"> <f:facet name="menus"/> <f:facet name="toolbar"> <af:toolbar id="tb1"> <af:button actionListener="#{bindings.CreateInsert.execute}" text="CreateInsert" disabled="#{!bindings.CreateInsert.enabled}" id="CreateInsert"/> <af:button actionListener="#{bindings.Commit.execute}" text="Commit" disabled="false" id="b2"/> <af:button actionListener="#{bindings.Rollback.execute}" text="Rollback" disabled="#{!bindings.Rollback.enabled}" immediate="true" id="b3"> <af:resetActionListener/> </af:button> </af:toolbar> </f:facet> <f:facet name="statusbar"/> <af:table value="#{bindings.ProductVO1.collectionModel}" var="row" rows="#{bindings.ProductVO1.rangeSize}" emptyText="#{bindings.ProductVO1.viewable ? \'No data to display.\' : \'Access Denied.\'}" fetchSize="#{bindings.ProductVO1.rangeSize}" rowSelection="single" partialTriggers="CreateInsert" id="t1"> <af:column sortProperty="Id" sortable="false" headerText="#{bindings.ProductVO1.hints.Id.label}" id="c1"> <af:inputText value="#{row.ProductId}" simple="true" required="#{bindings.ProductVO1.hints.Id.mandatory}" columns="#{bindings.ProductVO1.hints.Id.displayWidth}" maximuumLength="#{bindings.ProductVO1.hints.Id.precision}" id="it1"/> </af:column> . . . </af:table> </af:panelCollection> </af:form>
CreateInsert
操作にバインドされたボタンを起動すると、アクションが実行され、ページがレンダリングされることによりコレクションの新しいインスタンスが作成および挿入されます。ボタンは、表をリフレッシュするトリガーとして構成されているため、表の最上部に新しい空白行を表示して再描画されます。Commit
アクションにバインドされたボタンをユーザーがクリックすると、行セット内に作成された新しい行がデータベースに挿入されます。部分ページ・リフレッシュの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「部分ページ・コンテンツの再レンダリング」を参照してください。
表の列のソートが可能で、新規行を挿入する前にユーザーが列をソートした場合、新規行はソートされません。新規行を含めて列をソートするには、目的のソートとは逆の列ソートを行ってから再ソートする必要があります。これは、表で列がすでにソートされていると見なされるためで、最初から希望のソート順をクリックしても列には何の効果もあらわれません。
たとえば、ユーザーが列を昇順でソートし、その後行を新たに追加するとします。最初、その行は最上部に表示されます。もう一度昇順で列をソートするために最初から昇順をクリックすると、列がすでに昇順であると見なされ、表は再ソートされません。ユーザーは、降順でソートした後に昇順でソートする必要があります。
行を挿入すると、データが特定の列で特定の順に自動的にソートされるようにする場合、プログラムでコミット後にSortEvent
をキューに入れ、ソートを実行するハンドラを実装します。
ビュー・オブジェクト属性がカスタム・ドメイン・データ・タイプによって定義されている列でソートを許可する場合、表のソート・ボタン・クリック・イベントに対してcompareTo()
メソッドを実装する必要があります。
public int compareTo(Object theObject)
現在のオブジェクトがtheObject
より小さい場合は0
以下の値に対して0
を戻します。また現在のオブジェクトがそれより大きい場合は、0
より大きい値を戻します。属性のオブジェクト比較は文字列比較のように動作します。
Create
またはCreateInsert
操作を使用して新規行を宣言的に作成すると、次のコード行が実行されます。
// create a new row for the view object
Row newRow = yourViewObject
.createRow();
// mark the row as being "initialized", but not yet new
newRow.setNewRowState(Row.STATUS_INITIALIZED);
ただし、CreateInsert
操作を使用している場合は、行を行セットに挿入する追加のコード行も実行されます。
// insert the new row into the view object's default rowset
yourViewObject
.insertRow(newRow);
行をエンティティ・ベースのビュー・オブジェクトに作成すると、現在のアプリケーション・モジュールに関連付けられているTransaction
オブジェクトによって、その処理が即時に記録されます。ビュー行の後に作成された新規エンティティ行は、Transaction
の保留中の変更リストにすでに含まれています。作成された新規行は、初期化済状態であるとしてマーク付けされると、Transaction
の保留中の変更リストから削除され、エンド・ユーザーによるデータ値の入力がまだ行われていない空白行とみなされます。初期化済という用語が適切である理由は、基礎となるエンティティ・オブジェクトによって定義されたすべてのデフォルト値を使用して初期化された新規行がエンド・ユーザーに表示されるためです。初期化済の行のどの属性にもユーザーがデータを入力していない場合は、その行が存在していないかのように処理されます。トランザクションのコミット時には、その行がTransaction
の保留中の変更リストに含まれていないため、INSERT
文はその行に対して試行されません。
初期化済の行に1つ以上の属性が設定されると同時に、初期化済の状態から新規状態(Row.STATUS_NEW
)に自動的に遷移します。この時点で、基礎となるエンティティ行はTransaction
の保留中の変更リストに登録され、トランザクションの次回コミット時に新規行が永続的に保存されます。
注意:
多数の初期化済の行を作成してもその行にデータを移入しない手順をエンド・ユーザーが実行した場合、低速メモリー・リークが発生することがあります。ただし、新規状態に遷移しない初期化済の行で使用されるメモリーは、Java仮想マシンのガベージ・コレクタによって最終的に解放されます。
EJBデータ・コントロールおよびJPAベースのBeanデータ・コントロールには、使用可能な組込みCreateInsert
操作がありません。ただし、データ・コントロールのEagerPersist
プロパティをtrue
に設定して、これらのデータ・コントロールのCreate
操作とCreateInsert
の動作を置き換えることができます。このプロパティは、コンテナ管理トランザクションおよび明示的コミット・モデルを使用するステートフル・セッションBeanに基づくデータ・コントロールに対してデフォルトでtrue
に設定されます。詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のEJBセッションBeanのコミット・モデルに関する項を参照してください
リストにオブジェクトのコレクションを表示する必要がある場合は、listView
コンポーネントを使用できます。各オブジェクトの属性は、グループまたは単一行および単一列内のグリッドに表示されます。図32-8 に、listView
コンポーネントを使用して表示される製品のコレクションを示します。
図32-8 リストの単一列に表示されるコレクション
このlistView
では、子listItem
コンポーネントにはpanelGridLayout
コンポーネントが含まれ、このコンポーネントには、データおよびユーザーがアイテムを削除できるようにするボタン・コンポーネントを表示するoutputFormatted
コンポーネントが含まれます。listView
コンポーネントは、value
属性を使用して、表がコレクションにバインドされるのと同じ方法でコレクションにバインドされます。listItem
コンポーネントはlistView
コンポーネントの直接の子であり、列コンポーネントが表のデータ・コンポーネントを保持するのと同じ方法で、データを表示するコンポーネントのコンテナになります。
コレクションに別のコレクションとのマスター/ディテール関係がある場合、listView
コンポーネントのグループ化機能を使用して親コレクションの下で子コレクションをグループ化できます。詳細は、「リスト・ビューを使用したマスター/ディテール・オブジェクトの表示」を参照してください。
listView
およびlistItem
コンポーネントの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』のリストへのコレクションの表示に関する項を参照してください。(図32-8に示すように) panelGridLayout
コンポーネントを使用してリストのグリッドにアイテムをグループ化する方法の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』のグリッドでのコンテンツの配置に関する項を参照してください。panelGroupLayout
コンポーネントを使用して、グリッド・レイアウトが不要な場合にコンポーネントをグループ化することもできます。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の関連アイテムのグループ化に関する項を参照してください。
「リスト・ビューの作成」ウィザードを使用して、リストを作成します。ウィザードでは、panelGroupLayout
またはpanelGridLayout
コンポーネントを選択して、リスト・アイテムのコンポーネントを配置できます。マスター/ディテール関係の子のリストを作成している場合は、ウィザードを使用してリストのヘッダーを構成することもできます。
始める前に:
ADF Facesのリスト・ビューについて理解しておくと役立つことがあります。詳細は、「コレクションのリスト・ビューの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド表の追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
リスト・ビューを作成する手順:
ウィザードを使用してlistView
コンポーネントを作成する場合、JDeveloperでは、listView
、listItem
およびレイアウト・コンポーネントが作成および構成されます。バインディングは、表の場合と同じです。listView
コンポーネントは、「データ・コントロール」パネルから削除されたコレクションにバインドされています。このコンポーネントのvar
属性の値は、表の場合と同じ方法で、データにアクセスするためにoutputFormatted
コンポーネントによって使用されます。コレクションのページ定義コードとJSPコードの詳細は、「表の作成時の処理」を参照してください。
次の例は、図32-8に示した単純な表のページ・コードを示しています。
<af:listView value="#{bindings.SProductView1.collectionModel}" var="item" emptyText="#{bindings.SProductView1.viewable ? 'No data to display.' : 'Access Denied.'}" fetchSize="#{bindings.SProductView1.rangeSize}" id="lv1"> <af:listItem id="li1"> <af:panelGridLayout id="pgl2" dimensionsFrom="parent"> <af:gridRow marginTop="5px" height="15px" id="gr2"> <af:gridCell marginStart="5px" width="50%" id="gc2"> <af:panelLabelAndMessage label="Product:" id="plam1" inlineStyle="font-weight:bold;"> <af:outputFormatted value="#{item.bindings.Name.inputValue}" id="of1"/> </af:panelLabelAndMessage> </af:gridCell> <af:gridCell marginStart="5px" width="50%" marginEnd="5px" id="gc3"/> </af:gridRow> <af:gridRow marginTop="5px" height="15px" id="gr3"> <af:gridCell marginStart="5px" width="50%" id="gc4"> <af:panelLabelAndMessage label="ID:" id="plam2"> <af:outputFormatted value="#{item.bindings.Id.inputValue}" id="of2"> <af:convertNumber groupingUsed="false" pattern="#{bindings.SProductView1.hints.Id.format}"/> </af:outputFormatted> </af:panelLabelAndMessage> </af:gridCell> <af:gridCell marginStart="5px" width="50%" marginEnd="5px" id="gc5"> <af:button actionListener="#{bindings.Delete.execute}" text="Delete Product" disabled="#{!bindings.Delete.enabled}" id="b1"/> </af:gridCell> </af:gridRow> <af:gridRow marginTop="5px" height="15px" marginBottom="5px" id="gr4"> <af:gridCell marginStart="5px" width="50%" id="gc6"> <af:panelLabelAndMessage label="Suggested Wholesale:" id="plam3"> <af:outputFormatted value="#{item.bindings.SuggestedWhlslPrice.inputValue}" id="of3"> <af:convertNumber groupingUsed="false" pattern="#{bindings.SProductView1.hints.SuggestedWhlslPrice.format}"/> </af:outputFormatted> </af:panelLabelAndMessage> </af:gridCell> <af:gridCell marginStart="5px" width="50%" marginEnd="5px" id="gc7"/> </af:gridRow> </af:panelGridLayout> </af:listItem> </af:listView>
ページ内で直接各コンポーネントに対してタグを提供する静的データバインド・フォームを作成するのではなく、動的コンポーネントを使用して、バインディング・メタデータ、列およびバインド・コンテンツを表示するために使用されるコンポーネントが実行時に決定される表を作成します。
図32-9 は、CustomerVO
ビュー・オブジェクトで属性に対するUIヒントを設定し、動的表としてCustomers
データ・コントロール・コレクションをドロップすることによって作成された実行時の動的表を示しています。設定されたUIヒントにはLABEL
およびDISPLAYHINT
があります(後者は、動的フォームに指定された属性を含めないようにHide
に設定できます)。
図32-9 カテゴリ・ヒントに基づいた列グループを含む動的表
動的コンポーネントの詳細は、「動的コンポーネントについて」を参照してください。
動的表を作成するには、コレクションをADF表として「データ・コントロール」パネルからドロップして、フィールドが動的に生成されることを指定します。
始める前に:
動的コンポーネント機能および動的データバインド表について理解しておくと役立ちます。詳細は、「動的コンポーネントについて」および「動的コンポーネントを使用した表の作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド表の追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
動的表を作成するには:
コレクションをページに動的フォームとしてドロップする場合、次の処理が発生します。
ページ定義はvariableIterator
バインディング、イテレータへのiterator
バインディングおよびtree
値バインディングで移入されます。詳細は、「動的フォームに対して作成されるバインディング」を参照してください。
JSFページにはtable
タグおよび1つ以上のiterator
、column
およびdynamicComponent
タグが移入されます。また、「列グループを含める」オプションが選択されている場合は、switcher
およびgroup
タグが追加されます。
JSFページで、JDeveloperはtable
タグを挿入し、その内部で、コレクションの属性を反復処理するiterator
タグをネストします。そのiterator
タグ内で、dynamicComponent
タグを含むcolumn
タグがネストされます。また、dynamicComponent
に、実行時に決定される各列に対して適切なコンポーネントが表示されます。
次の例は、動的表としてCountries
データ・コントロール・オブジェクトをドロップした(ただし、「列グループを含める」オプションを選択していない)場合に生成されるコードを示しています。
<af:table value="#{bindings.Countries.collectionModel}" var="row" rows="#{bindings.Countries.rangeSize}" emptyText="#{bindings.Countries.viewable ? 'No data to display.' : 'Access Denied.'}" rowBandingInterval="0" fetchSize="#{bindings.Countries.rangeSize}" id="t1"> <af:iterator id="i1" value="#{bindings.Countries.attributesModel.attributes}" var="column"> <af:column headerText="#{column.label}" id="c1"> <af:dynamicComponent id="d2" attributeModel="#{column}" value="#{row.bindings[column.name].inputValue}"/> </af:column> </af:iterator> </af:table>
iterator
タグのvalue
属性では、コレクションのツリー・バインディングのattributesModel.attributes
プロパティに評価するEL式を使用します。attributesModel
プロパティは、コンポーネント・タイプ、ラベル、ツールチップ、レンダリングされる実際のコンポーネントの他のプロパティなど、データ・オブジェクトの属性およびそのメタデータを取得するために使用されます。attributesModel
のattributes
プロパティは、表示可能属性およびそのメタデータのフラット(非階層的)リストが提供されていることを示します。
dynamicComponent
タグのattributeModel
属性は、EL式#{column}にバインドされ、イテレータのvar
属性で定義される変数を参照し、データ・コントロール・コレクションおよびその対応するメタデータの現在の属性へのポインタとして機能します。dynamicComponent
のvalue
属性のEL式は、変数column
も参照します。
「表の作成」ダイアログの「列グループを含める」チェックボックスを選択している場合は、生成されたJSFページに、「グループ化しないで動的表に対して作成されるタグ」で説明されているタグに加え、switcher
とgroup
タグが含まれます。
switcher
タグは、column
タグ内で直接ネストされます。switcher
タグ内には、GROUP
およびATTRIBUTE
という名前のネストされたfacet
タグがあります。GROUP
ファセットにはgroup
タグが含まれ、その内部に、グループ名とiterator
タグを表示するoutputText
タグがあり、それにはdynamicComponent
タグを含むcolumn
タグが含まれます。ATTRIBUTE
ファセットにはdynamicComponent
タグのみが含まれます。
高レベルのiterator
が反復する各属性の場合、切替え機能により、グループまたは列をレンダリングするかどうかが動的に決定されます。グループをレンダリングする場合、グループ内のイテレータはそのグループ内の列をレンダリングするために使用されます。
次の例は、Countries
コレクションに基づいた動的フォームを作成し、列グループを含めるように選択した場合に生成されるコードを示しています。
<af:table value="#{bindings.Countries.collectionModel}" var="row" rows="#{bindings.Countries.rangeSize}" emptyText="#{bindings.Countries.viewable ? 'No data to display.' : 'Access Denied.'}" rowBandingInterval="0" fetchSize="#{bindings.Countries.rangeSize}" id="t1"> <af:iterator id="i1" value="#{bindings.Countries.attributesModel.hierarchicalAttributes}" var="column"> <af:column headerText="#{column.label}" id="c1"> <af:switcher id="sw1" facetName="#{column.descriptorType}" defaultFacet="ATTRIBUTE"> <f:facet name="GROUP"> <af:iterator id="gi1" value="#{column.descriptors}" var="nestedCol"> <af:column headerText="#{nestedCol.label}" id="c2"> <af:dynamicComponent id="gd1" attributeModel="#{nestedCol}" value="#{row.bindings[nestedCol.name].inputValue}"/> </af:column> </af:iterator> </f:facet> <f:facet name="ATTRIBUTE"> <af:dynamicComponent id="ad1" attributeModel="#{column}" value="#{row.bindings[column.name].inputValue}"/> </f:facet> </af:switcher> </af:column> </af:iterator> </af:table>
iterator
タグのvalue
属性では、コレクションのツリー・バインディングのattributesModel.hierarchicalAttributes
プロパティに評価されるEL式を使用します。attributesModel
プロパティは、コンポーネント・タイプ、ラベル、ツールチップ、レンダリングされる実際のコンポーネントの他のプロパティなど、データ・オブジェクトの属性およびそのメタデータを取得するために使用されます。hierarchicalAttributes
プロパティは、UIヒントの属性に対して設定されたカテゴリを含む、表示可能属性およびそのメタデータの階層リストが提供されることを示します。
dynamicComponent
タグのattributeModel
属性は、EL式#{column}に設定され、イテレータのvar
属性で定義される変数を参照し、データ・コントロール・コレクションおよびその対応するメタデータの現在の列(またはカテゴリ)へのポインタとして機能します。
動的コンポーネントを含むページがレンダリングされると、設計時に「データ・コントロール」パネルから項目をドロップしたときと同様に、バインディングが作成されます。ただし、バインディングは実行時に作成されます。詳細は、「実行時に行われる処理: 属性値の動的な決定方法」を参照してください。
また、マスター・コンテンツを表示し、ユーザーが指定されたレコードのディテールを表示できるdetailStamp
ファセットを含む動的表を作成できます。ディテール・コンテンツは、マスター・ビュー・オブジェクトでの動的コンポーネントのビュー・リンク・アクセッサへのバインディングから取得されます。図32-10 に、このようなディテール・ファセットを含む動的表の一部を示します。表のdetailStamp
ファセットの使用方法の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の表への非表示機能の追加に関する項を参照してください。
図32-10 detailStampファセットが表示された動的表
始める前に:
動的表について理解しておくと役立ちます。詳細は、「動的コンポーネントを使用した表の作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド表の追加機能」を参照してください。
次のタスクを完了する必要があります。
「ビュー・オブジェクトのみに基づくマスター/ディテール階層の作成方法」の説明に従って、必要なマスター/ディテール階層を確立するビュー・オブジェクトとビュー・リンクのインスタンスを含むアプリケーション・モジュールを作成します。
「動的表の作成方法」の説明に従って動的表を作成します。
detailStampファセットを使用して動的表を作成するには:
table
タグ内にfacet
タグを挿入します。 facet
タグ内に、panelFormLayout
タグを挿入します。 panelFormLayout
タグ内に、iterator
タグを挿入します。 value
属性をデータ・オブジェクトのattributesModel.getLinkedViewAttributes(
LinkedViewName
)
プロパティにバインドします。ここで、LinkedViewName
は、ディテール・コンテンツにアクセスするビュー・リンク・アクセッサの名前です。iterator
タグ内に、dynamicComponent
タグを挿入します。dynamicComponent
タグのattributeModel
属性をiterator
タグのvar
属性の値にバインドします。dynamicComponent
タグのvalue
属性を、選択した行のディテール・データを戻す式にバインドします。次の例は、ビュー・リンク・アクセッサを使用して取得されたデータを表示するためにdetailStamp
ファセットを使用する動的表のJSFページ・コードを示しています。
<af:table value="#{bindings.EmpVO3.collectionModel}" var="row" id="t1" ...> <f:facet name="detailStamp"> <af:panelForm id="pgl1" layout="vertical"> <af:iterator id="iter3" var="detail" value="#{bindings.EmpVO3.attributesModel.getLinkedViewAttributes('DeptView')}"> <af:dynamicComponent value="#{row['DeptView'].bindings[detail.name].inputValue}"/> attributeModel="#{detail}" id="dc1"/> </af:iterator> </af:panelForm> </f:facet> <af:iterator id="itr1" var="column" value="#{bindings.EmpVO3.attributesModel.attributes}"> <af:column headerText="#{column.label}" id="dcc1"> <af:dynamicComponent value="#{row.bindings[column.name].inputValue}" attributeModel="#{column}" id="dc1"/> </af:column> </af:iterator> </af:table>
「データ・コントロール」パネルを使用して表を作成したら、属性の削除、表示順序の変更、表示に使用されるコンポーネントの変更、コンポーネントの属性バインディングの変更ができます。新しい属性を追加したり、表を新規のデータ・コントロールに再バインドすることもできます。
「データ・コントロール」パネルを使用して作成された表は、次のような変更ができます。
行のラベルに対するバインディングの変更
属性にバインドされているUIコンポーネントの変更
属性を表す列の追加または削除
表内の列の並替え
選択とソート処理の有効化
始める前に:
データバインド表の変更について理解しておくと役立ちます。詳細は、「表に表示される属性の変更」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド表の追加機能」を参照してください。
次のタスクを完了する必要があります。
表の属性を変更するには:
バインディングを変更するかわりに、表がバインドされているオブジェクトを完全に変更することができます。
始める前に:
データバインド表の変更について理解しておくと役立ちます。詳細は、「表に表示される属性の変更」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド表の追加機能」を参照してください。
次のタスクを完了する必要があります。
「基本表の作成」の説明に従い、データバインドされた表を作成します。
表をリバインドするには:
ヒント:
既存の表の最上部に異なるビュー・オブジェクトをドラッグして表を再バインドすることもできます。