Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.2.1) E70030-02 |
|
前 |
次 |
この章の内容は次のとおりです。
ビジネス・サービス用に作成されたデータ・コントロールを使用して情報の表示および収集を実行するための、UIページを作成できます。たとえば、「データ・コントロール」パネルを使用して、項目の属性をドラッグし、出力テキストまたはラベル付き入力テキスト・フィールドとして、値を表示できます。関連データの表示および更新に必要なすべてのJSFタグとバインディング・コードがJDeveloperによって作成されます。「データ・コントロール」パネルおよび宣言的なバインディング機能の詳細は、「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。
個々の属性をドロップできる他、オブジェクトのすべての属性をフォーム、表または単一列リスト・ビューとして一度にドロップできます。この章には、値を表示するフォーム、ユーザーが値を編集できるフォームおよび値を収集するフォーム(入力フォーム)に関する情報が含まれます。表およびリスト・ビューの作成の詳細は、「ADFによるデータバインドされた表の作成」を参照してください。
UIコンポーネントをドロップすると、コレクション内のレコード間を移動できるようにしたり、ユーザーがデータを操作(レコードのコミット、削除、作成など)できるようにする組込み操作をコマンドUIコンポーネントとしてドロップできます。たとえば、フォームに表示されたデータ・オブジェクトをユーザーが削除できるようにするためのボタンを作成できます。また、必要に応じてデフォルトのコンポーネントを変更することもできます。
行データを収集または表示する必要がある場合、フォームを使用します。たとえば、図31-1に示すように、Oracle ADFのSummitサンプル・アプリケーションには、ユーザーが顧客に関する情報を更新できるパネルが含まれています。このフォームは「データ・コントロール」パネルからCustomers
コレクションをドラッグ・アンド・ドロップし、表示するフィールドを選択して作成されました。
図31-1 Summit ADFサンプル・アプリケーションの顧客一般情報フォーム
フォームを作成する場合、図31-2に示すように、ユーザーがレコード間を素早く移動できるように、ナビゲーションの追加を選択することもできます。
図31-2 フォーム内のレコード間の移動
フォームに表示される行への処理を実行するコマンド・ボタンを追加することもできます。たとえば、レコードの値を変更して、これらの変更を編集フォームに保存できます。または、ユーザーに新規レコードの作成を許可する入力フォームを作成できます。図31-3 は、ユーザーが新規注文を作成可能な入力フォームを示しています。
図31-3 入力フォーム
注意:
フォーム内に表示する属性が実行時にしか使用できない場合は、動的フォームを作成できます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。
データバインドされたページを実装する前に他のOracle ADF機能を理解することが役立つ場合があります。有用なその他の機能へのリンクは、次のとおりです。
ADFビュー・オブジェクト: フォーム内でのコンポーネントの表示方法および機能のほとんどは、対応するビュー・オブジェクトによって制御されます。詳細は、「ビュー・オブジェクトを使用したSQL問合せの定義」を参照してください。
ADFアプリケーション・モジュール: ページにデータバインドされたコンポーネントをドラッグする「データ・コントロール」パネルに、アプリケーション・モジュールに追加したビュー・オブジェクトの表示が移入されます。詳細は、「アプリケーション・モジュールによるビジネス・サービスの実装」を参照してください。
アダプタベースのデータ・コントロール: EJBコンポーネントやWebサービスなど他のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』で説明されるこれらのビジネス・サービス用データ・コントロールを作成できます。
ADFモデルとデータ・バインディング: ADF Webアプリケーション内でフォームを作成する場合は、ADFモデルおよびデータ・バインディングを使用します。詳細は、「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。
ADF Faces: ADF Faces UIコンポーネントも使用します。ADF Facesを使用した開発の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』を参照してください。
高度なUIコントロール: 基本的なフォームには、入出力コンポーネントを使用します。また、リスト、表、ツリー、検索フォーム、LOVコンポーネント、グラフ、ゲージ、ツリーマップなどの高度なコンポーネントを使用することもできます。詳細は、「データバインドされたWebユーザー・インタフェースの作成」の残りの各章を参照してください。
タスク・フロー: トランザクションに携わるフォームの場合は(入力フォームなど)、フォームのレンダリングの前または後に、ADFタスク・フローを使用して特定の操作を起動する必要があります。詳細は、「ADFタスク・フローの作成」を参照してください。
ページ・ライフサイクル: ページ・ライフサイクルでのフォームの処理の詳細は、「Fusionページ・ライフサイクルの理解」を参照してください。
検証: 特定のフィールドがデータ・ストアに送信される前に、このフィールドを検証する必要がある場合もあります。詳細は、「検証とビジネス・ルールの宣言的な定義」および「ADFモデル・レイヤーでの検証の使用」を参照してください。
アクティブ・データ: アプリケーションでアクティブ・データを使用する場合は、データ・ソースのデータが変更されるたびに、UIコンポーネント内のデータを自動的に更新できます。詳細は、「アクティブ・データ・サービスの使用」を参照してください。
JDeveloperでは、テキスト・フィールドを宣言的に作成可能な、JSFページ用の完全なWYSIWYG開発環境が用意されているため、ページのほとんどの内容をコードを見ずに設計できます。「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップすると、属性バインディングを使用してADF FacesテキストUIコンポーネントはデータ・コントロールの属性に宣言的にバインドされます。
属性を表示または更新できる個々のテキスト・フィールドを作成するには、「データ・コントロール」パネルからコレクションの属性をドラッグ・アンド・ドロップします。ADFビジネス・コンポーネントの場合、「データ・コントロール」パネルに、少なくとも1つのアプリケーション・モジュールで定義したデータ・モデルの要素が移入されます。
始める前に:
データ・コントロールを使用したテキスト・フィールドの作成に関する一般的な知識があると役立ちます。詳細は、「データ・コントロール属性を使用したテキスト・フィールドの作成」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
データバインド・テキスト・フィールドを作成するには:
JSFページに属性をドラッグしてUIコンポーネントとしてドロップすると、そのページのページ定義ファイル(すでに存在する場合を除く)などが作成されます。属性をページにドラッグしたときに行われる処理の完全な説明は、「「データ・コントロール」パネルの使用時の処理」を参照してください。イテレータと属性のバインディングが作成され、ページ定義ファイルに追加されます。また、UIコンポーネントに必要なJSPXまたはJSFページ・コードがJSFページに追加されます。
「データ・コントロール」パネルからコレクションの一部である項目をドロップして(またはコレクション全体をフォームまたは表としてドロップして)ページ上にUIコンポーネントを作成するたびに、イテレータ・バインディングが自動的に作成されます(すでに存在する場合を除く)。イテレータ・バインディングは、データ・コレクションのイテレータを参照し、この機能によりそのデータ・オブジェクトを反復処理します。また、コレクション内のデータ・オブジェクトの現在行および状態を管理します。イテレータ・バインディングは実際にはデータにアクセスしません。かわりに、データにアクセスできるオブジェクトを単純に公開し、コレクション内の現在のデータ・オブジェクトを指定します。その後、現在のオブジェクトのデータを戻したり、オブジェクトのデータに対してアクションを実行するために、他のバインディングがこのイテレータ・バインディングを参照します。イテレータ・バインディングはイテレータではないことに注意してください。これはイテレータへのバインディングです。ADFビジネス・コンポーネントの場合、実際のイテレータは、アプリケーション・モジュールのデータ・モデル内のビュー・オブジェクト・インスタンスのデフォルト行セットに対するデフォルト行セット・イテレータです。
たとえば、Customers
コレクションのLastName
属性をドロップした場合、Customers
コレクションのイテレータ・バインディングが作成されます。
ヒント:
各コレクションに対して1つのイテレータ・バインディングが作成されます。つまり、同じコレクションから2つの属性をドロップした場合(もしくは同じコレクションを2回ドロップした場合)は、同じバインディングが使用されます。この動作の1つの利点は、コンポーネントの現状が同期された状態で維持されることです。たとえば、ページに同じコレクションからドロップされた表とフォームがある場合、フォームには、表で選択された行のレコードが表示されます。コンポーネントごとに動作の異なるバインディングが必要な場合、手動で個別のイテレータ・バインディングを作成する必要があります。
イテレータ・バインディングのrangeSize
属性は、イテレータ・バインディングへのアクセスが行われるたびにデータ・コントロールからフェッチされるデータ行数を決定します。この属性により、行セット全体の中でいくつかの絶対開始位置に対して1-n行の相対セットが置かれます。属性またはコレクションをページ上にドラッグしてイテレータ・バインディングを作成する場合、属性は最初に25
に設定されます。この属性の使用の詳細は、「定義されるイテレータのRangeSize属性」を参照してください。次の例は、Customers
コレクションから属性をドロップすると作成されるイテレータ・バインディングを示しています。
<executables> <iterator Binds="Customers" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="Customers"/> </executables>
イテレータ・バインディング要素の属性の詳細は、「Oracle ADFバインディング・プロパティ」を参照してください。
このメタデータにより、ADFバインディング・コンテナは属性値にアクセスできます。実行可能ファイルであるイテレータ・バインディングは、デフォルトでページのロード時に起動されるため、これによってイテレータがCustomers
コレクションにアクセスし、反復処理を実行できます。これは、イテレータによって、コレクション内のすべてのCustomers
オブジェクトの管理(現在のCustomers
オブジェクトまたはCustomers
オブジェクト・レンジの判別など)が行われることを意味します。
「データ・コントロール」パネルから属性をドロップすると、UIコンポーネントを属性の値にバインドするための属性バインディングが作成されます。このタイプのバインディングは、コレクション内の現在行のシングル・オブジェクトに対する属性の値を提示します。値バインディングは、属性値の表示と収集の両方に使用できます。
たとえば、Customers
コレクションの下にあるLastName
属性を「ラベル付ADF出力テキスト」ウィジェットとしてページにドロップすると、JDeveloperによって、LastName
属性の属性バインディングが作成されます。これにより、バインディングが現在のレコードの属性値にアクセスできるようになります。次の例は、Customers
コレクションから属性をドロップすると作成される、LastName
に対する属性バインディングを示しています。この属性値は、CustomersIterator
という名前のイテレータを参照します。
<bindings> ... <attributeValues IterBinding="CustomersIterator" id=""LastName <AttrNames> <Item Value="LastName"> </AttrNames> </attributeValues> </bindings>
属性バインディング要素のプロパティの詳細は、「Oracle ADFバインディング・プロパティ」を参照してください。
「データ・コントロール」パネルから属性をドロップしてテキスト・フィールドを作成すると、対応するタグがJSFページに記述され、ドロップしたウィジェットに関連付けられているUIコンポーネントが作成されます。
たとえば、LastName
属性を「ラベル付出力テキスト」ウィジェットとしてドロップすると、JDeveloperによってpanelLabelAndMessage
コンポーネントとoutputText
コンポーネントのタグが挿入されます。また、panelLabelAndMessage
コンポーネントのlabel
属性を、LastName
のバインディングのために作成されたヒントのlabel
プロパティにバインドするEL式が作成されます。この式は、ビュー・オブジェクトに設定されたラベル・ヒントを評価します(ヒントの詳細は、「ビュー・オブジェクトのUIヒントの定義」を参照)。また、現在の行のLastName
属性の値に評価される、outputText
コンポーネントのvalue
属性をLastName
バインディングのinputValue
プロパティにバインドする、別の式が作成されます。両方のコンポーネントに対してIDも自動的に生成されます。
ヒント:
JDeveloperでは、すべてのADF FacesコンポーネントのIDが自動的に生成されます。これらの値を必要に応じてオーバーライドできます。
次の例は、LastName
属性を「ラベル付出力テキスト」ウィジェットとしてドロップしたときにJSFページで生成されるコードを示しています。
<af:panelLabelAndMessage label="#{bindings.LastName.hints.label}" id="plam1"> <af:outputText value="#{bindings.LastName.inputValue}" id="ot1"/> </af:panelLabelAndMessage>
かわりにLastName
属性を「ラベル付入力テキスト」ウィジェットとしてドロップすると、JDeveloperによってinputText
コンポーネントが作成されます。次の例に示すように、値はLastName
バインディングのinputValue
プロパティにバインドされます。さらに、次のプロパティも設定されます。
label
: オブジェクトのlabel
UIヒントにバインドされます。
required
: オブジェクトのmandatory
プロパティにバインドされます。
columns
: オブジェクトのdisplayWidth
UIヒントにバインドされます。テキスト・ボックスの幅を決定します。
maximumLength
: オブジェクトのprecision
プロパティにバインドされます。フィールドに入力できる1行当たりの最大文字数を決定します。
shortDesc
: tooltip
UIヒントにバインドされます。
また、JDeveloperはinputText
コンポーネント内にvalidator
タグをネストします。このタグを使用してクライアント側の検証規則を作成し、モデルまたはビジネス・サービス・レイヤーに存在する検証規則を補足できます。
<af:inputText value="#{bindings.LastName.inputValue}" label="#{bindings.LastName.hints.label}" required="#{bindings.LastName.hints.mandatory}" columns="#{bindings.LastName.hints.displayWidth}" maximumLength="#{bindings.LastName.hints.precision}"> shortDesc="#{bindings.LastName.hints.tooltip}" id="it1"> <f:validator binding="#{bindings.LastName.validator}"/> </af:inputText>
validator
およびconverter
タグの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「入力の検証および変換」を参照してください。
これらの値は必要に応じて変更できます。たとえば、ビュー・オブジェクトのmandatory
コントロール・ヒントはデフォルトでfalse
に設定されており、これは、コンポーネントのrequired
属性もfalse
と評価されることを意味します。コンポーネントのrequired
属性をtrue
に設定すると、この値をオーバーライドできます。属性のすべてのインスタンスを必須にする場合は、ビュー・オブジェクト内のコントロール・ヒントを変更して、すべてのインスタンスを必須にすることができます。これらのプロパティの詳細は、「Oracle ADFバインディング・プロパティ」を参照してください。エンティティ・オブジェクト・レベルでこれらのプロパティを変更する方法の詳細は、「属性プロパティの設定」を参照してください。ビュー・オブジェクト・レベルでこれらのプロパティを変更する方法の詳細は、「ビュー・オブジェクトの編集方法」を参照してください。
コレクションの各属性を個別にドロップしてフォームを作成するかわりに、コレクションの複数の属性からフォームを作成するコレクション・ノードをドロップできます。
たとえば、Customers
コレクションをドラッグ・アンド・ドロップすることによって、Summit ADFサンプル・アプリケーションの顧客に関する基本的な情報を表示するページを作成できます。
また、コレクションからデータを表示するだけでなく、多くの機能を提供するフォームの作成もできます。ユーザーによるデータ更新が可能なフォームの作成の詳細は、「既存レコードを編集するフォームの作成」を参照してください。ユーザーによるコレクションに対する新規オブジェクト作成が可能なフォームの作成の詳細は、「入力フォームの作成」を参照してください。また、検索フォームも作成できます。詳細は、「ADFによるデータバインドされた検索フォームの作成」を参照してください。
データ・コントロールを使用してフォームを作成する場合、UIコンポーネントをデータ・コントロールの対応するオブジェクトの属性にバインドします。JDeveloperでは、「データ・コントロール」パネルからコレクションをドラッグ・アンド・ドロップして、宣言的にこの処理を実行できます。
始める前に:
基本的なデータバインド・フォームについて理解しておくと役立ちます。詳細は、「データ・コントロールのコレクションを使用した基本的なフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
基本的なフォームを作成するには:
注意:
「フォームの作成」ダイアログで実行時に生成されるフィールドを選択する場合、表示する属性は、ビジネス・サービスの構成に基づいて実行時に決定されます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。
「データ・コントロール」パネルからオブジェクトをフォームとしてドロップすることは、単一の属性をドロップするのと同じ効果があります。ただし、複数の属性バインディングおよび関連するUIコンポーネントが作成され、すべてのUIコンポーネントがpanelFormLayout
コンポーネント内に配置される点が異なります。UIコンポーネントの属性(value
など)は、その属性のバインディング・オブジェクト(inputValue
など)のプロパティ、または対応するビジネス・オブジェクトで設定されるコントロール・ヒントの値にバインドされます。次の例は、Customers
コレクションをデフォルトADFフォームとしてドロップした場合にJSFページで生成されるコードの一部を示しています。
注意:
関連するビューまたはエンティティ・オブジェクトで属性が非表示としてマークされている場合、対応するUIは作成されません。
<af:panelFormLayout id="pfl1"> <af:inputText value="#{bindings.Id.inputValue}" label="#{bindings.Id.hints.label}" required="#{bindings.Id.hints.mandatory}" columns="#{bindings.Id.hints.displayWidth}" maximumLength="#{bindings.Id.hints.precision}" shortDesc="#{bindings.Id.hints.tooltip}" id="it1"> <f:validator binding="#{bindings.Id.validator}"/> <af:convertNumber groupingUsed="false" pattern="#{bindings.Id.format}"/> </af:inputText> <af:inputText value="#{bindings.Name.inputValue}" label="#{bindings.Name.hints.label}" required="#{bindings.Name.hints.mandatory}" columns="#{bindings.Name.hints.displayWidth}" maximumLength="#{bindings.Name.hints.precision}" shortDesc="#{bindings.Name.hints.tooltip}" id="it2"> <f:validator binding="#{bindings.Name.validator}"/> </af:inputText> <af:inputText value="#{bindings.Phone.inputValue}" label="#{bindings.Phone.hints.label}" required="#{bindings.Phone.hints.mandatory}" columns="#{bindings.Phone.hints.displayWidth}" maximumLength="#{bindings.Phone.hints.precision}" shortDesc="#{bindings.Phone.hints.tooltip}" id="it3"> <f:validator binding="#{bindings.Phone.validator}"/> </af:inputText> . . . </af:panelFormLayout>
「データ・コントロール」パネルからアイテムをドロップするときに生成されるコードの詳細は、「テキスト・フィールドの作成時の処理」を参照してください。
定義済の値リスト(LOV)を含むオブジェクトを使用して入力フォームを作成する場合、inputText
コンポーネントのかわりにselectOneChoice
コンポーネントが作成されます。たとえば、CustomerVO
ビュー・オブジェクトには、CountryId
およびCreditRatingId
属性の定義済LOVが含まれます。Customers
データ・コントロール・オブジェクトをADFフォームとしてドロップすると、(空の入力テキスト・フィールドのかわりに)すべての値を表示するドロップダウン・リストが各LOVに対して作成されます。このリストの動作の詳細は、「ビュー・オブジェクト属性の値リスト(LOV)での作業」を参照してください。アダプタベースのデータ・コントロールのこのリストの動作の詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』の値オブジェクトのリストの作成に関する項を参照してください。JSFページでのリストの使用の詳細は、「選択リストの作成」を参照してください。
注意:
オブジェクトに構造化属性(Javaのプリミティブ・タイプまたはコレクションのいずれでもない属性)が含まれる場合、その属性はダイアログには表示されず、また、フォームに対応するコンポーネントもありません。これらのフィールドは手動で作成する必要があります。
「データ・コントロール」パネルには、データ・オブジェクトの表示を提供するほか、フォームで使用するための標準操作を表すノードもあります。これらの組込み操作により、レコード間の移動やデータベースへの変更のコミットなど、通常のフォーム機能を宣言的に処理できます。大半の操作はデータ・コントロール内の個々のデータ・コレクションに対応しています。コミットおよびロールバック操作はデータ・コントロール全体に対して使用できます。「データ・コントロール」パネルからページに操作をドラッグする場合、ボタンやリンクなど、作成するコマンド・コンポーネントの種類を選択するよう求められます。
図31-8は、Summit ADFサンプル・アプリケーションのCountries
コレクションで使用可能な操作を示しています。
図31-8 データ・コントロール・コレクションの操作
この項では、組込みデータ・コントロール操作からコマンド・コンポーネントを作成する方法を示します。データバインドされたページでコマンド・コンポーネントを使用可能な他の方法の詳細は、「ビュー・レイヤーで各機能を起動するコマンド・コンポーネントの使用」を参照してください。
データ・コントロール操作に基づいてコマンド・コンポーネントを作成するには、「データ・コントロール」パネルからページに操作をドラッグ・アンド・ドロップします。
始める前に:
コマンド・コンポーネントを作成するためにデータ・コントロール操作を使用することを理解しておくと役立ちます。詳細は、「データ・コントロール操作を使用したコマンド・コンポーネントの作成」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
操作からコマンド・コンポーネントを作成するには:
操作をドロップしてコマンド・コンポーネントを作成する場合、JDeveloperによって次の処理が行われます。
関連付けられている操作について、ページ定義ファイルでアクション・バインディングが定義されます。
コレクションに部分ページ・レンダリングを使用するように、イテレータ・バインディングが構成されます。
コマンド・コンポーネント用のコードがJSFページに挿入されます。
アクション・バインディングは、ビジネス・ロジックを実行します。たとえば、アクション・バインディング・オブジェクト上で操作を起動できます。これらの操作は、イテレータまたはデータ・コントロール自体で機能します。
アクション・バインディングがNext
またはPrevious
などのイテレータレベル・アクションにバインドされている場合、操作のアクション・バインディングには、値バインディングと同様にイテレータ・バインディングへの参照が含まれます。これらのタイプのアクションはイテレータによって実行されます。イテレータは現在のオブジェクトを判別するため、ナビゲーション・ボタンがクリックされたときに表示するオブジェクトが正しく判別されます。イテレータ・レベルではないアクションへのアクション・バインディング(たとえば、アプリケーション・モジュールのカスタム・メソッドやコミット操作やロールバック操作の場合)には、この参照は含まれません。
アクション・バインディングはRequiresUpdateModel
プロパティを使用して、アクションを実行する前にモデルを更新する必要があるかどうかを判別します。ナビゲーション操作の場合、デフォルトではこのプロパティはtrue
に設定されています。つまり、ビュー・レイヤーでのすべての変更は、ナビゲーションを実行する前にモデルに移動する必要があります。
次の例は、ナビゲーション操作のアクション・バインディングを示しています。
<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"/>
イテレータ・バインディングにはrangeSize
属性が含まれ、バインディングではこの属性を使用して、反復ごとにページで使用できるようにするデータ・オブジェクト数が決定されます。この属性は、データソース内のオブジェクト数がきわめて多い場合に役立ちます。イテレータ・バインディングは、すべてのオブジェクトではなく、1つのセット番号のみを戻すため、他のバインディングでアクセスできるようになります。イテレータはレンジの最後に到達すると、次のセットにアクセスします。次の例は、Customers
イテレータのデフォルトのレンジ・サイズを示しています。
<iterator Binds="Customers" RangeSize="25"
DataControl="BackOfficeAppModuleDataControl"
id="CustomersIterator"
ChangeEventPolicy="ppr"/>
注意:
このrangeSize
属性は、表コンポーネントのrows
属性とは異なります。詳細については、表32-1 を参照してください。
イテレータ・バインディングが最初に生成されるときに、RangeSize
属性は25
に設定されます。つまり、ユーザーは、データソースにアクセスせずに、前後に移動しながら25個のオブジェクトを表示できます。イテレータは、現在のオブジェクトを追跡します。ユーザーが新しいレンジが要求されるボタンをクリックすると(たとえば、オブジェクト番号25で「次へ」ボタンをクリックすると)、バインディング・オブジェクトによってイテレータに対して関連するメソッドが実行され、イテレータによって別の25個のレコードのセットが取得されます。その後、取得されたセットがバインディングによって使用されます。この設定は、必要に応じて変更できます。完全なレコード・セットを戻すには、-1
に設定します。RangeSize
属性が指定されない場合、完全なレコード・セットが戻されます。
データ・コントロール操作を使用してコマンド・コンポーネントを作成すると、JDeveloperにより、コマンド・コンポーネントのactionListener
属性を、指定された操作のアクション・バインディングのexecute
プロパティにバインドするEL式が作成されます。
実行時、アクション・バインディングは、コアのJUCtrlActionBinding
実装クラスを拡張するFacesCtrlActionBinding
クラスのインスタンスです。FacesCtrlActionBinding
クラスにより、次のメソッドが追加されます。
public void execute(ActionEvent event)
: actionListener
プロパティで参照されるメソッドです(例: #{bindings.First.execute}
)。
ユーザーがボタンをクリックすると、この式によって、イテレータに対してバインディングの操作が起動されます。たとえば、Firstコマンド・ボタンのactionListener
属性は、First
アクション・バインディングのexecute
メソッドにバインドされます。
public String outcome()
: Action
プロパティで参照できます(例: #{bindings.Next.outcome}
)。
移動先となる次のページを決定するJSFナビゲーションの結果として、メソッド・アクション・バインディングの結果(String
に変換後)に使用できます。
注意:
アクション・バインディングでoutcomeメソッドを使用すると、ビューおよびコントローラのレイヤーとモデル・レイヤーとの分離が壊れるため、ほとんど使用されません。
操作の各アクション・バインディングには、enabled
ブール型プロパティが含まれます。このプロパティは、操作を起動しない場合には、Oracle ADFによってfalse
に設定されます。デフォルトでは、JDeveloperがこの値にUIコンポーネントのdisabled
属性をバインドして、コンポーネントを有効化するかどうかを指定します。たとえば、「先頭へ」ボタンのUIコンポーネントのdisabled
属性の値は、次のとおりです。
#{!bindings.First.enabled}
この式は、バインディングが有効でない場合、常にtrue
に評価されます。つまり、操作を起動しない場合に、ボタンが無効になります。この例では、最初のレコードが表示されている場合はいつでも、フレームワークがバインディングのenabled
プロパティをfalse
に設定するため、「先頭へ」ボタンが自動的に無効になります。これは、enabled
がFalse
の場合は、常にdisabled
属性がtrue
に設定されるためです。enabled
プロパティの詳細は、「Oracle ADFバインディング・プロパティ」を参照してください。
次の例は、Create
およびDelete
操作をページ上のボタンとしてドロップした後に生成されるコードを示しています。
<af:button actionListener="#{bindings.Create.execute}" text="Create" disabled="#{!bindings.Create.enabled}" id="b5"/> <af:button actionListener="#{bindings.Delete.execute}" text="Delete" disabled="#{!bindings.Delete.enabled}" id="b6"/>
ユーザーがコマンド・コンポーネントをクリックすると、フォームが送信され、続いてアクション・イベントが起動します。アクション・イベントは、ユーザー・インタフェースのみに影響する場合(たとえば、異なるフィールド・プロンプトを表示させる、ロケールを変更するためのリンク)と、なんらかのロジック処理を伴う場合(たとえば、次のレコードに移動するためのボタン)があります。次に、そのイベント・オブジェクトは、イテレータから現在のデータ・オブジェクトの情報を取得し、それをアクション・バインディングのメソッドに渡し、そのactionListener
属性からコマンド・コンポーネントにバインドされます。
注意:
アクション・リスナーは、コマンド・コンポーネントによってアクション・イベントが起動されたときに通知を受けるよう登録されているクラスです。アクション・リスナーには、コマンド・コンポーネントによって渡されるアクション・イベント・オブジェクトを処理する、アクション・リスナー・メソッドが含まれます。
たとえば、ユーザーがADF Delete
操作から作成された「削除」ボタンをクリックすると、アクション・イベントが起動されます。このイベント・オブジェクトは、イテレータから取得した現在のデータ・オブジェクトの現在行位置情報を格納します。コンポーネントのactionListener
属性がDelete
アクション・バインディングのexecute
メソッドにバインドされているため、イベントが起動されるとDelete
操作が起動します。このメソッドは、イベント・オブジェクトで渡された現在行位置情報を使用して、削除するデータ・オブジェクトを判別します。
通常、actionListener
プロパティの値はEL式の形式です。たとえば、actionListener
属性の値が{bindings.Delete.execute}
の場合、Delete
アクション・バインディングのexecute()
メソッドがコールされます。
操作またはメソッドをコマンド・ボタンとしてドロップすると、JDeveloperによって操作またはメソッドのexecuteメソッドにそのボタンがバインドされます。ただし、既存のロジックの前または後に、ロジックの追加が必要になる場合もあります。JDeveloperを使用すると、バインディング・コンテナにアクセスするマネージドBeanでメソッドおよびプロパティを新規作成することにより、宣言的操作にロジックを追加できます。デフォルトでは、この生成されたコードによって、操作またはメソッドが実行されます。その後、このコードの前か後にロジックを追加できます。元の操作またはメソッドのexecuteプロパティではなく、この新規メソッドにコマンド・コンポーネントが自動的にバインドされます。その後、ユーザーがボタンをクリックすると、新規メソッドが実行されます。詳細は、「宣言メソッドの上書き」を参照してください。
ADFフォームを作成する際、ナビゲーション・コントロールの組込みを選択すると、データ・コントロールの既存のナビゲーション・ロジックにバインドされているADF Facesコマンド・コンポーネントが組み込まれます。この組込みロジックによって、ユーザーは、コレクション内のすべてのデータ・オブジェクトを移動できるようになります。図31-9 の例は、Countries
コレクションをドラッグし、ナビゲーションを使用するADFフォームとしてドロップした場合に作成されるフォームを示しています。
図31-9 フォーム内のナビゲーション
表31-1に、データ・コントロールで提供される組込みナビゲーション操作と、操作にバインドされたイベントの実行または操作の起動の結果を示します。アクション・イベントの詳細は、「実行時に行われる処理: アクション・イベントおよびアクション・リスナーの動作方法」を参照してください。
表31-1 組込みナビゲーション操作
操作 | 関連イテレータ・バインディングによる起動時の処理 |
---|---|
First |
現在のポインタを結果セットの最初に移動します。 |
Last |
現在のポインタを結果セットの最後に移動します。 |
前 |
現在のポインタを結果セットの前のオブジェクトに移動します。このオブジェクトが現在のレンジの外にある場合は、レンジ・サイズと同じオブジェクト数だけレンジが戻るようにスクロールされます。 |
次 |
現在のポインタを結果セットの次のオブジェクトに移動します。このオブジェクトが現在のレンジの外にある場合は、レンジ・サイズと同じオブジェクト数だけレンジが進むようにスクロールされます。 |
Previous Set |
レンジ・サイズ属性と同じオブジェクト数だけ、レンジを戻すように移動します。 |
Next Set |
レンジ・サイズ属性と同じオブジェクト数だけ、レンジを進めるように移動します。 |
デフォルトでは、「データ・コントロール」パネルを使用してフォームを作成する際にナビゲーションの組込みを選択すると、「先頭へ」、「最後へ」、「前へ」および「次へ」の各ボタンが作成され、ユーザーがコレクション内を移動できるようになります。
また、既存のフォームにナビゲーション・ボタンを手動で追加できます。
始める前に:
ナビゲーション・コントロールについて理解しておくと役立ちます。詳細は、「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
ナビゲーション・ボタンを手動で追加するには:
ヒント:
「先頭へ」、「最後へ」、「前へ」および「次へ」のすべてのボタンを一度にドロップすることもできます。一度にドロップするには、対応するコレクションをドラッグし、ポップアップ・メニューから「移動」→「ADFナビゲーション・ボタン」を選択します。
「データ・コントロール」パネルからナビゲーション操作をドロップする場合、JDeveloperによって次の処理が行われます。
関連付けられている操作について、ページ定義ファイルでアクション・バインディングが定義されます。
コレクションに部分ページ・レンダリングを使用するように、イテレータ・バインディングが構成されます。
コマンド・コンポーネント用のコードがJSFページに挿入されます。
ボタンをクリックすると部分ページ・リクエストが起動されるように、JSFページにコンポーネントのpartialSubmit
属性を挿入し、それをtrue
に設定します。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の部分トリガーの使用に関する項を参照してください。
コマンド・コンポーネントに対して生成されたコードの詳細は、「操作を使用したコマンド・コンポーネント作成時の処理」を参照してください。
次の例は、ナビゲーション操作ボタンに対してJSFページで生成されたコードを示しています。
<f:facet name="footer"> <af:panelGroupLayout> <af:button actionListener="#{bindings.First.execute}" text="First" disabled="#{!bindings.First.enabled}" partialSubmit="true" id="cb1"/> <af:button actionListener="#{bindings.Previous.execute}" text="Previous" disabled="#{!bindings.Previous.enabled}" partialSubmit="true" id="cb2"/> <af:button actionListener="#{bindings.Next.execute}" text="Next" disabled="#{!bindings.Next.enabled}" partialSubmit="true" id="cb3"/> <af:button actionListener="#{bindings.Last.execute}" text="Last" disabled="#{!bindings.Last.enabled}" partialSubmit="true" id="cb4"/> </af:panelGroupLayoutr> </f:facet>
ユーザーがナビゲーション・コントロール・ボタンをクリックすると、アクション・イベントが起動します。次に、そのイベント・オブジェクトは、イテレータから現在のデータ・オブジェクトの情報を取得し、それを操作のメソッドに渡し、そのactionListener
属性からボタンにバインドされます。
詳細は、「実行時に行われる処理: アクション・イベントおよびアクション・リスナーの動作方法」を参照してください。
また、ユーザーがナビゲーション・ボタンをクリックすると、ボタンのアクション・バインディングと同じイテレータに関連付けられたコンポーネントのみがライフサイクルを通して処理されます。詳細は、「部分ページ・レンダリングおよびイテレータ・バインディングに関する必知事項」を参照してください。
フォームに表示されるレコード間でのナビゲートには、ナビゲーション・ボタンを使用する必要があり、ブラウザの「戻る」または「進む」ボタンは使用できません。ナビゲーション・フォームでは自動的にPPRが使用されるため、ライフサイクルを通過するのはページの一部のみです(つまり、ユーザーがナビゲーション・ボタンをクリックすると、データを表示するコンポーネントがリフレッシュされて新しいデータが表示されますが、ユーザーは実際には同じページにとどまっています)。したがって、ブラウザの「戻る」ボタンをクリックすると、そのフォームに表示された前のレコードではなく、そのフォームを使用したページの前にレンダリングされたページに戻ります。
たとえば、現在の注文をすべて表示するためのリンクを含むページが表示されているとします。このリンクをクリックすると、フォームを使用したページに移動し、最初の注文であるOrder #101が表示されます。次に「次へ」をクリックすると、Order #102が表示されます。再び「次へ」をクリックすると、Order #103が表示されます。ブラウザの「戻る」ボタンをクリックした場合、Order #102は表示されません。かわりに、現在のすべての注文を表示するためのリンクを含むページに戻ります。
ユーザーが現在のデータを編集し、その変更をデータ・ソースにコミットするためのフォームを作成できます。フォームを作成するには、コレクションまたはデータ・コントロール自身に関連付けられたデータ・レコードを変更するための操作を使用して、コマンド・ボタンを作成します。たとえば、Delete
操作を使用して、ユーザーが現在のレンジからレコードを削除できるボタンを作成できます。
ADFビジネス・コンポーネントまたは明示的コミット・モデルを持つEJBセッションBeanに基づいたデータ・コントロールの場合、重要なのは、これらの操作がADFキャッシュのオブジェクトに対してのみ実行されるという点です。ルート・データ・コントロール上でCommit
操作を使用して、任意の変更をデータソースに実際にコミットする必要があります。データ・コントロールのRollback
操作を使用して、キャッシュされたオブジェクトに対する任意の変更をロールバックします。ページが、バインド・タスク・フロー内のトランザクションの一部である場合、通常、タスク・フロー・リターン・アクティビティのトランザクションを解決するためにこの操作を使用します。詳細は、「タスク・フローのトランザクションの管理」を参照してください。
編集フォームを作成するには、コレクションをフォームとしてページにドロップし、適切な操作をコマンド・コンポーネントとしてドロップします。
始める前に:
編集フォームの作成について理解しておくと役立ちます。詳細は、「既存レコードを編集するフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
編集フォームの作成方法:
ヒント:
編集フォームを作成する同じページにフォームと同じコレクションから作成された表がある場合にも、表およびフォームは同じイテレータ・バインディングを使用し、これにより、表で行を選択することによってユーザーがフォームで編集するレコードを選択できるようになります。データバインドされた表を作成する方法の詳細は、「基本表の作成」を参照してください。
ページにコレクションをドロップする場合の処理の詳細は、「データ・コントロール・コレクションを使用したフォームの作成時の処理」を参照してください。
コマンド・ボタンとして任意のデータ・コントロール操作をドロップすると、ナビゲーション操作をドロップするときと同様のコードが生成されます。詳細は、「操作を使用したコマンド・コンポーネント作成時の処理」を参照してください。
イテレータとは異なり、Commit
操作とRollback
操作はアプリケーション・モジュール(データ・コントロール自身)でメソッドを実行するため、これらの操作のアクション・バインディングがイテレータへの参照を必要としないことが、唯一の相違点です。Rollback
アクションのRequiresUpdateModel
プロパティはfalse
に設定されています。これは、すべての変更は破棄する必要があるので、操作の実行前にモデルは更新されないためです。次の例は、これらの操作に対するページ定義ファイルに生成されたアクション・バインディングを示しています。
<action id="Commit" RequiresUpdateModel="true" Action="commitTransaction" DataControl="BackOfficeAppModuleDataControl"/> <action id="Rollback" RequiresUpdateModel="false" Action="rollbackTransaction" DataControl="BackOfficeAppModuleDataControl"/>
表31-2に、データ・コントロールおよびデータ・コントロール・オブジェクトで提供されるナビゲーション以外の組込み操作と、操作の起動または操作にバインドされたイベントの実行の結果を示します。アクション・イベントの詳細は、「実行時に行われる処理: アクション・イベントおよびアクション・リスナーの動作方法」を参照してください。
表31-2 追加の組込み操作
操作 | 関連イテレータ・バインディングによる起動時の処理 |
---|---|
|
現在の行の直前に行を作成し、行セットに新しいレコードを挿入して、現在行ポインタを新しい行に移動します。レンジは移動しないため、レンジの最後の行が結果的にレンジから除外される可能性があります。 注意: |
|
現在の行の直前に行を作成し、現在行ポインタを新しい行に移動します。レンジは移動しないため、レンジの最後の行が結果的にレンジから除外される可能性があります。 アプリケーション・モジュールおよびほとんどの他のビジネス・サービスに基づいたデータ・コントロールの場合、ユーザーが実際にデータを作成することなく移動した場合の空白行を避けるため、行セットにレコードは挿入されません。新しい行は、ユーザーがデータを送信すると作成されます。詳細は、「CreateおよびCreateInsertに関する必知事項」を参照してください。ただし、JPAベースのデータ・コントロールの場合、 |
|
注意: |
|
現在の行をキャッシュから削除し、現在行ポインタを結果セットの次の行に移動します。レンジは移動しないため、レンジの最後に行が追加される可能性があります。最後の行が削除された場合、現在行ポインタはその前の行に移動します。コレクション内の行がなくなると、有効な属性が |
|
入力フィールドによって指定された値から変換された |
|
行キーを、入力フィールドで指定された値から変換された |
|
キーの値を使用して、イテレータの現在のオブジェクトを設定します。詳細は、「表での現在行の設定に関する必知事項」を参照してください。 |
|
パラメータとして渡された名前付きのバインド変数に新しい値を割り当てた後で、ビュー・オブジェクトの問合せを(再)実行することにより、データ・コレクションをリフレッシュします。この操作は、 この操作は、設計時に1つ以上の名前付きバインド変数が定義されているビュー・オブジェクトの場合のみ表示されます。詳細は、「バインド変数の使用」を参照してください。 EJBおよびBeanデータ・コントロールの場合、この操作はパラメータ使用の問合せに基づくデータ・コントロール・コレクション・オブジェクトでのみ使用可能です。 |
|
現在キャッシュ内にあるすべての項目をデータベースにコミットします。 |
|
キャッシュをクリアして、トランザクションおよびイテレータを初期状態に戻します。 |
|
これらの操作は、検索フォームでのみ使用されます。詳細は、「ADFによるデータバインドされた検索フォームの作成」を参照してください。 |
ADFビジネス・コンポーネント・サービスに基づいてユーザー・インタフェースを作成する場合は、ユーザーが行うどのデータ変更もユーザーがコマンド・コンポーネントを使用してCommit
操作を行うまで基本のデータベースに伝搬されません。
ステートレスEJBセッションBeanまたはRESTful Webサービスなど、ステートレス・ビジネス・サービスのデータ・コントロールに基づくユーザー・インタフェースの場合、Commit
およびRollback
操作が使用できません。そのような場合は、基本のデータベースとの対話を処理するカスタム・メソッドを使用できます。EJBデータ・コントロールの場合、セッションBeanのpersistEntity
およびmergeEntity
メソッドは、「データ・コントロール」パネルを使用して公開され、それらからコマンド・コンポーネントを作成できます。詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のEJBセッションBeanのコミット・モデルに関する項を参照してください。
Oracle ADFでは、表示されるレコードが入力パラメータによって決定されるフォームを作成できる方法がいくつかあります。これらのメカニズムは次のとおりです。
データ・コントロールのExecuteWithParams
操作またはパラメータをとるカスタム・メソッドに基づいてADFパラメータ・フォームを作成します。
パラメータをタスク・フローからフォームに渡します。
コマンド・コンポーネント内でsetPropertyListener
タグをネストして、パラメータにアクセスし、必要なロジックを起動するためにマネージドBean内にアプリケーション・ロジックを提供します。
この項では、ExecuteWithParams
操作に基づいたADFパラメータ・フォームの作成について説明します。パラメータをタスク・フローからフォームに渡す方法の詳細は、「タスク・フローのパラメータの使用」および「ADFリージョンのパラメータの指定」を参照してください。setPropertyListener
タグの使用方法の詳細は、「コマンド・コンポーネントを使用したパラメータ値の設定」を参照してください。
ExecuteWithParams
操作は、バインド変数を含むビュー・オブジェクトに基づくものやパラメータとともに名前付き問合せを含むJPAベースのBeanに基づくものなど、パラメータを含むデータ・コントロール・オブジェクトに対してのみ使用可能です。たとえば、Summit ADFサンプル・アプリケーションには、バインド変数TitleIdBind
を含む、EmpVO
ビュー・オブジェクトに基づくSalesPeople
と呼ばれるビュー・オブジェクト・インスタンスが含まれます。そのため、図31-12 に示すように、SalesPeople
オブジェクトには、TitleIdBind
パラメータのサブノードとともにExecuteWithParams
操作が含まれます。
図31-12 「データ・コントロール」パネルのExecuteWithParams操作
ビュー・オブジェクト・バインド変数およびJPAパラメータ付き問合せを使用すると、実行時にビュー・オブジェクトまたはビュー基準に属性値を組み込むことができます。ExecuteWithParams
操作により、パラメータとして渡された名前付きのバインド変数に新しい値を割り当てた後で、ビュー・オブジェクトの問合せを(再)実行することにより、データ・コレクションがリフレッシュされます。ビュー・オブジェクトのバインド変数の詳細は、「バインド変数の使用」を参照してください。JPA問合せの名前付きパラメータの詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のEJBデータ・コントロールの前提条件と考慮事項に関する項を参照してください。
パラメータを使用するフォームを作成するには、ADFパラメータ・フォームとしてページにコレクションのExecuteWithParams
操作をドロップし、ADFフォームとしてコレクション自体をドロップします。
始める前に:
パラメータ・フォームの作成について理解しておくと役立ちます。詳細は、「フォームを作成するためのパラメータの使用」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。
または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「ビュー・オブジェクト定義にWHERE句のバインド変数を追加する方法」に従ってビュー基準の定義にバインド変数を追加します。
JPAベースのデータ・コントロールの場合、名前付きパラメータを指定するセッションBeanまたはサービス・ファサードに名前付き問合せを作成できます。詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のEJBデータ・コントロールの前提条件と考慮事項に関する項を参照してください。
「Webページの作成」の説明に従って、JSFページを作成します。
ExecuteWithParams操作に基づいたパラメータ・フォームを作成するには:
ExecuteWithParams
操作をドラッグし、ポップアップ・メニューから「ADFパラメータ・フォーム」を選択します。注意:
選択リストをパラメータ・フォームに宣言的に組み込むこともできます。選択リストを作成するには、フォームにExecuteWithParams
操作の子であるパラメータ・ノードをドラッグします。次にExecuteWithParams
操作をドラッグして、それをボタンとしてドロップします。
ExecuteWithParams
操作をパラメータ・フォームとしてドロップすると、JDeveloperによって次の処理が行われます。
属性バインディングにバインドされているinputText
コンポーネントおよびExecuteWithParams
操作にバインドされているbutton
コンポーネントを使用して、JSFページにフォームのコードが挿入されます。
ページ定義ファイルに次のものを定義します。
変数にアクセスするために使用する属性の変数イテレータ(他のフォームに対して使用されるコレクションのイテレータとは異なります)。
データ値を保持するための各パラメータに対するvariableUsage
変数。これらの変数は、バインドされるビュー・オブジェクトの名前付きバインド変数からデフォルト値やUIコントロール・ヒントを継承します。変数はローカルであり、単一リクエスト中にのみ存続します。同じフォームに後続のポストバック間で運ばれるが、ユーザーが他のいくつかのページに移動する場合は無視されます(再度初期化されます)。
各パラメータのNamedData
要素を含む操作のアクション・バインディング。各NamedData
要素は、対応する変数にバインドされます。これらのバインディングにより、操作は、実行時にパラメータに対する値にアクセスできます。
関連付けられた属性の属性バインディング。
次の例は、ページ上にSalesPeople
コレクションのExecuteWithParams
操作をドロップすることによって作成されるページ定義ファイル内の実行可能ファイルおよびバインディングを示しています。
<executables> <variableIterator id="variables"> <variableUsage DataControl="BackOfficeAppModuleDataControl" Binds="SalesPeople.variablesMap.TitleIdBind" Name="ExecuteWithParams_TitleIdBind" IsQueriable="false"/> </variableIterator> <iterator Binds="SalesPeople" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="SalesPeopleIterator"/> </executables> <bindings> <action IterBinding="SalesPeopleIterator" id="ExecuteWithParams" RequiresUpdateModel="true" Action="executeWithParams"> <NamedData NDName="TitleIdBind" NDType="java.lang.Integer" NDValue="${bindings.ExecuteWithParams_TitleIdBind}"/> </action> <attributeValues IterBinding="variables" id="TitleIdBind"> <AttrNames> <Item Value="ExecuteWithParams_TitleIdBind"/> </AttrNames> </attributeValues> </bindings>
パラメータ・フォームの結果を表示するために使用されるコレクションをドロップすると、「データ・コントロール・コレクションを使用したフォームの作成時の処理」で説明しているように、基本フォーム用のコードが生成されます。また、表を使用して結果を表示した場合は、表のpartialTriggers
プロパティがパラメータ・フォームのコマンド・ボタンに設定されます。
ユーザーが新規レコードの情報を入力し、そのレコードをデータ・ソースにコミットするためのフォームを作成できます。基本的な入力フォームの作成は、入力フォームにCreateInsert
操作も含まれるということを除いて、編集フォームの作成と同じであり、ユーザーがフォームを使用して移入できる行セットに空白行が挿入されます。
「データ・コントロール」パネルからページにコレクションおよび適切な操作をドラッグ・アンド・ドロップすることにより、単純な入力フォームを作成できます。ただし、ユーザー・ワークフローを制御し、他のフォームの処理ロジックを挿入するために、他の手法を選択する必要がある場合があります。このような手法は次のとおりです。
ADFタスク・フローのパラメータを使用して、新しいレコードの指定された属性を事前移入する値を渡します。詳細は、「ビュー・アクティビティへのパラメータ渡し」を参照してください。
「タスク・フロー・リターン・アクティビティの使用」の説明に従って、タスク・フロー・リターン・アクティビティを使用して、UIにトランザクション境界を設定します。
「バインド・タスク・フローへのパラメータ渡し」の説明に従って、タスク・フロー・メソッド・コールで操作を埋め込みます。
「宣言メソッドのオーバーライド」の説明に従って、マネージドBeanを使用して、いくつかの操作を実行します。
「リージョンとしてのタスク・フローの使用」の説明に従って、フォームをタスク・フローのリージョンに組み入れます。
「バインド・タスク・フローでのトレイン・コンポーネントの使用」の説明に従ってフォームをマルチステップ・フローに組み入れます。
「モーダル・ダイアログ内でのバインド・タスク・フローの実行」の説明に従って、ダイアログ内にフォームを配置します。
「タスク・フローのトランザクションの管理」の説明に従って、セーブポイントを使用します。
次のセクションでは、基本的な入力フォームの作成方法について説明し、またいくつかのバリアントに関する情報を提供します。
基本的な入力フォームの作成には、編集フォームの作成および新規レコードを作成するためのコマンド・コンポーネントの追加が含まれます。
始める前に:
入力フォームについて理解しておくと役立ちます。詳細は、「入力フォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
入力フォームの作成方法:
CreateInsert
操作を編集フォームにドラッグします。注意:
CreateInsert
操作はADFビジネス・コンポーネント・アプリケーション・モジュールに基づいたデータ・コントロールでのみ使用可能です。データ・コントロールが別のビジネス・サービスに基づく場合は、かわりにCreate
操作を使用します。2つの間の相違の詳細は、表31-2を参照してください。
入力フォームのワークフローを提供するタスク・フローを使用できます。コマンド・コンポーネントを使用して新規オブジェクトを作成するのではなく、タスク・フロー内でメソッド・コール・アクティビティを使用するか、マネージドBeanのメソッドを使用します。コマンド・コンポーネントを使用して変更をコミットするのではなく、タスク・フロー・リターン・アクティビティを使用します。
たとえば、タスク・フローのメソッド・コール・アクティビティを使用して、データ・コントロール・オブジェクトのCreateInsert
操作をコールして、ユーザーがデータを入力可能なフォームを表示するビュー・アクティビティにコントロールを渡すことができます。
バインド・タスク・フロー内で入力フォームを作成するには:
通常、Commit
操作をコールするには、リターン・アクティビティを使用する必要があります。ただし、タスク・フローに複数のデータ・コントロールによって管理されるデータが含まれる場合や、フローの終了前にデータをコミットする必要がある場合など、Commit
操作にコマンド・コンポーネントを使用する必要がある場合があります。
フォーム内に「コミット」ボタンを持つ入力フォームを作成するには:
データベースにコミットする前に、ユーザーが複数のエントリを作成できるようにする場合、次のようにします。
単一トランザクションでの複数エントリを許可する入力フォームを有効にするには:
from-outcome
メソッドの値を入力します。たとえば、createAnother
と入力します。action
属性を、先ほど作成したfrom-outcome
に設定します。これによって、タスク・フローはメソッド・アクティビティに戻り、CreateInsert
操作を再起動します。ADFフォームを使用して入力フォームを作成すると、JDeveloperによって次の処理が行われます。
メソッド・アクティビティのページ定義でコレクションのイテレータ・バインディングおよびCreateInsert
操作のアクション・バインディングが作成されます。CreateInsert
操作は、行を行セットに作成し、データ・ソースに入力されたデータを移入します。その他のフォームに関しては、ページのページ定義で、コレクションのイテレータ・バインディングと、コレクション内のオブジェクトの各属性について属性バインディングが作成されます。Commit
操作およびRollback
操作を使用してコマンド・ボタンまたはリンクを作成した場合、JDeveloperではこれらの操作のアクション・バインディングも作成されます。
ADF Faces inputText
コンポーネントおよび操作の場合はbutton
コンポーネントを使用して、JSFページにフォームのコードが挿入されます。
CreateInsert
ボタンをクリックする(またはその操作に対応するメソッドをコールする)と、CreateInsert
アクション・バインディングが起動され、CreateInsertRow
操作が実行されてコレクション用に空白の新規インスタンスが作成されます。
注意:
CreateInsert
操作をコールするタスク・フロー・メソッド・アクティビティを使用する場合、メソッド・アクティビティからビュー・アクティビティへのルーティング中、メソッド・アクティビティのバインディング・コンテナは必須属性の検証をスキップするため、空白のインスタンスがページ上のフォームに表示できます。
ページが表示される前にCreate
アクションが実行されるため、順序を使用して主キーを移入する場合は、空である他のフィールドとは異なり、次の順序番号が入力テキスト・フィールドに表示されます。順序番号が表示されるのは、関連するエンティティ・クラスに、Eagerフェッチを使用して主キー属性の番号の順序を生成するメソッドが含まれるためです。Eagerフェッチにより、行が作成される際に値が移入されます。そのため、順序を使用すると想定どおりに入力フォームが動作します。
ただし、かわりに属性のタイプをDBSequence
(データベース・トリガーを使用して順序を生成する)に構成した場合、オブジェクトがデータベースにコミットされるまで番号は移入されません。この場合は、プレースホルダとして負の数が表示されます。この状態を回避するには、入力テキスト・フィールドのRendered
属性に次のEL式を使用できます。
#{bindings.EmployeeId.inputValue.value > 0}
この式では、値がゼロより大きい場合のみコンポーネントが表示されますが、これはコミット前には発生しません。同様に、Rendered
属性を単純にfalse
に設定することもできます。ただし、その場合は主キーの入力テキスト・フィールドのコンポーネントがページに表示されることはありません。
入力フォームのベースとなるデータ・コントロールがステートレス・ビジネス・サービスのデータ・コントロールである場合、データ・ソースに変更を保存するために使用する組込みCommit
操作はありません。
かわりに、カスタム・メソッドを使用して、データベースに保存する必要があります。詳細は、「ステートレス・ビジネス・サービスのデータ・コントロールに関する必知事項」を参照してください。
ページ内で直接各コンポーネントにタグを提供する静的データバインド・フォームを作成するかわりに、動的コンポーネントを使用して、バインディング・メタデータおよびバインド・コンテンツを表示するために使用されるコンポーネントが実行時に決定されるフォームを作成できます。
この項では、データバインドされた動的フォームの作成について説明します。動的コンポーネントを使用して、データバインドされた表を作成することもできます。詳細は、「動的コンポーネントを使用した表の作成」を参照してください。
動的フォーム・コンポーネントの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の実行時のコンポーネントの決定に関する項を参照してください。
ADF Facesでは、バインディング・メタデータおよびバインド・コンテンツを表示するために使用されるタグが実行時に決定される、モデルドリブン・フォームおよび表の作成に使用可能なdynamicComponent
タグが提供されます。
バインディングのこの動的作成では、次の機能が提供されます。
表示されるフィールドおよびこれらのフィールドを表示するために使用されるADF Facesをデータ・モデルによって決定するページを作成できます。追加列や変更されたUIヒントなどのデータ・モデルへの変更は、ページを再設計する必要なしに、ページに反映されます。ビュー・オブジェクトのUIヒントの詳細は、「ビュー・オブジェクトのUIヒントの定義」を参照してください。
多相ビュー・オブジェクトに基づいてページを作成できます。これらのビュー・オブジェクトでは、指定されたレコードに対して使用可能なフィールドがレコードのベース・エンティティ・オブジェクトによって異なる場合があります。表示するフィールドは実行時に決定されるため、特定のレコードに適用されない可能性のあるページにこれらのフィールドを含めたり、指定されたレコードに対して表示されるフィールドを調整するためにビュー・レイヤーでコーディングを行う必要はありません。複数の行タイプを処理するビジネス・コンポーネントの構築の詳細は、「多相ビュー・オブジェクトの定義」を参照してください。
コントロールをページにドロップする際に「フォームの作成」または「表の作成」ダイアログで情報を構成するのではなく、ビュー・オブジェクトのUIヒントを使用して表示情報を設定します。その結果、データの表示方法を変更する場合に、ビュー・オブジェクトで表示方法を変更するだけで、そのビュー・オブジェクトにバインドされているすべての動的コンポーネントの表示はそれに従って変更されます。
図31-13 は、CustomerVO
ビュー・オブジェクトで属性に対するUIヒントを設定し、動的フォームとしてCustomers
データ・コントロール・コレクションをドロップすることにより設計された実行時の動的フォームを示しています。設定されたUIヒントにはLABEL
およびDISPLAYHINT
があります(後者は、動的フォームに指定された属性を含めないようにHide
に設定できます)。
図31-13 ビュー・オブジェクトに設定されたヒントに基づいた動的フォームの表示
次のADF Facesコンポーネントは、設計時にaf:dynamicComponent
を使用する場合に、実行時にレンダリングできます。
af:inputText
af:inputDate
af:inputListOfValues
af:selectOneChoice
af:selectManyChoice
af:selectOneListbox
af:selectManyListbox
af:selectOneRadio
af:selectBooleanRadio
af:selectBooleanCheckbox
af:selectManyCheckbox
動的フォームを作成するには、コレクションをADFフォームとして「データ・コントロール」パネルからドロップして、フィールドが動的に生成されるように指定します。
始める前に:
動的フォームについて理解しておくと役立ちます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。
様々な属性を含むレコードの表示に動的フォームを利用する場合は、最初にその機能を含むデータ・オブジェクトが必要です。この機能を含むビュー・オブジェクトの作成の詳細は、「多相ビュー・オブジェクトの定義」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
動的フォームを作成するには:
コレクションをページに動的フォームとしてドロップする場合、次の処理が発生します。
ページ定義はvariableIterator
バインディング、イテレータへのiterator
バインディングおよびtree
値バインディングで移入されます。
JSFページは1つ以上のiterator
およびdynamicComponent
タグで移入されます。また、「フィールド・グループを含める」オプションが選択されている場合は、switcher
およびgroup
タグが追加されます。
動的フォームのページ定義ファイルには次の実行可能ファイルおよびバインディングが含まれます。
variableIterator: バインディング・コンテナに対して宣言された変数を格納する内部イテレータ。
iterator: コレクションに対するイテレータ・バインディング。イテレータ・バインディングの詳細は、「ページ定義ファイルに作成されるイテレータ・バインディング」を参照してください。
tree: コレクションの属性に対する値バインディング。設計時に各属性に対する個々の値バインディングがある標準フォームとは異なり、動的フォームは、実行時に公開される属性値を含むように単一ツリー値バインディングを使用します。
また、ツリー値バインディングは、データバインドされた表(標準および動的の両方)にも使用されます。詳細は、「表のイテレータと値バインディング」を参照してください。
次の例は、Customers
コレクションに基づく動的フォーム・コンポーネントを含むページのバインディングを示しています。
<executables> <variableIterator id="variables"/> <iterator Binds="SummitAppModuleDataControl.dataProvider.BackOfficeAM.Customers" DataControl="SummitAppModuleDataControl" RangeSize="25" id="CustomersIterator"/> </executables> <bindings> <tree IterBinding="CustomersIterator" id="Customers"> <nodeDefinition DefName="oracle.summit.model.views.CustomerVO" Name="Customers0"/> </tree> </bindings>
JSFページで、JDeveloperによってiterator
タグが挿入され、その内部で、dynamicComponent
タグがネストされます。iterator
タグは、実行時にコレクションによって公開される属性のすべてをループし、dynamicComponent
タグを使用してページ上の各属性に対する適切なコンポーネントをレンダリングします。
次の例は、動的フォームとしてCustomers
データ・コントロール・オブジェクトをドロップした(「フィールド・グループを含める」オプションは選択していない)場合に生成されるコードを示しています。
<af:panelFormLayout id="pfl1"> <af:iterator id="i1" value="#{bindings.Customers.attributesModel.attributes}" var="attr"> <af:dynamicComponent id="d2" attributeModel="#{attr}"/> value="#{bindings[attr.containerName][attr.name].inputValue}"/> </af:iterator> </af:panelFormLayout>
iterator
タグのvalue
属性では、コレクションのツリー・バインディングのattributesModel.attributes
プロパティに評価するEL式を使用します。attributesModel
プロパティは、コンポーネント・タイプ、ラベル、ツールチップ、レンダリングされる実際のコンポーネントの他のプロパティなど、データ・オブジェクトの属性およびそのメタデータを取得するために使用されます。attributesModel
のattributes
プロパティは、表示可能属性およびそのメタデータのフラット(非階層的)リストが提供されていることを示します。
dynamicComponent
タグのattributeModel
属性は、EL式#{attr}
にバインドされ、イテレータのvar
属性で定義される変数を参照し、データ・コントロール・コレクションおよびその対応するメタデータの現在の属性へのポインタとして機能します。dynamicComponent
のvalue
属性のEL式は、変数attr
も参照します。
「フォームの作成」ダイアログの「フィールド・グループを含める」を選択している場合、生成されたJSFページには、「グループ化しないで動的フォームに対して作成されるタグ」で説明するタグ以外に、switcher
タグとgroup
タグが含まれます。
switcher
タグには、iterator
タグ内で直接ネストされます。switcher
タグ内には、GROUP
およびATTRIBUTE
という名前のネストされたfacet
タグがあります。GROUP
ファセットにはgroup
タグが含まれ、その内部に、グループ名とiterator
タグを表示するoutputText
タグがあり、それにはdynamicComponent
タグが含まれます。ATTRIBUTE
ファセットにはdynamicComponent
タグのみが含まれます。
高レベルのiterator
が反復する各属性の場合、切替え機能により、グループまたは列をレンダリングするかどうかが動的に決定されます。グループをレンダリングする場合、グループ内のイテレータはそのグループ内の属性のコンポーネントをレンダリングするために使用されます。
次の例は、Customers
コレクションに基づいた動的フォームを作成し、フィールド・グループを含むように選択した場合に生成されるコードを示しています。
<af:panelFormLayout id="pfl1"> <af:iterator id="i1" value="#{bindings.Customers.attributesModel.hierarchicalAttributes}" var="attr"> <af:switcher id="sw1" facetName="#{attr.descriptorType}" defaultFacet="ATTRIBUTE"> <f:facet name="GROUP"> <af:group title="#{attr.label}" id="g1"> <af:outputText value="#{attr.name}" id="ot1"/> <af:iterator id="gi1" value="#{attr.descriptors}" var="nestedAttr"> <af:dynamicComponent id="gd1" attributeModel="#{nestedAttr}"/> </af:iterator> </af:group> </f:facet> <f:facet name="ATTRIBUTE"> <af:dynamicComponent id="ad1" attributeModel="#{attr}"/> </f:facet> </af:switcher> </af:iterator> </af:panelFormLayout>
iterator
タグのvalue
属性では、コレクションのツリー・バインディングのattributesModel.hierarchicalAttributes
プロパティに評価されるEL式を使用します。attributesModel
プロパティは、コンポーネント・タイプ、ラベル、ツールチップ、レンダリングされる実際のコンポーネントの他のプロパティなど、データ・オブジェクトの属性およびそのメタデータを取得するために使用されます。hierarchicalAttributes
プロパティは、UIヒントの属性に対して設定されたカテゴリを含む、表示可能属性およびそのメタデータの階層リストが提供されることを示します。
dynamicComponent
タグのattributeModel
属性は、EL式#{attr}に設定され、イテレータのvar
属性で定義される変数を参照し、データ・コントロール・コレクションおよびその対応するメタデータの現在の属性(またはカテゴリ)へのポインタとして機能します。
動的コンポーネントを含むページがレンダリングされると、設計時に「データ・コントロール」パネルから項目をドロップしたときと同様に、バインディングが作成されます。ただし、バインディングは実行時に作成されます。
実行時に、iterator
は、属性のセットを反復処理し、各属性のdynamicComponent
をインスタンス化します。動的コンポーネントは、そのattributeModel
プロパティを使用して、ラベルやコントロール・タイプなど、現在の属性に関するイテレータからの情報を取得します。次に各dynamicComponent
は属性に対して戻されるメタデータに基づいてコンポーネントをレンダリングします。
属性のDISPLAYHINT
UIヒントがHide
に設定される場合、属性のコンポーネントはレンダリングされません。
動的フォームが多相ビュー・オブジェクトに基づくデータ・コントロール・オブジェクトから作成される場合、レンダリングされるコンポーネントは、現在選択されているレコードの行タイプによって異なります。
デフォルトで、標準のADF Facesコンバータおよびバリデータは、動的コンポーネントを使用している場合に実行時に生成されるコンポーネントに適用されます。たとえば、converterDateTime
コンバータは、TimeStamp
タイプの属性に基づくコンポーネントに適用されます。
特定の検証または変換をコンポーネントに追加する必要がある場合は、ADF Facesバリデータおよびコンバータ・タグを動的コンポーネントのソースに追加することでこれを行い、タグのdisabled
属性を使用してバリデータおよびコンバータが適用される属性を決定できます。
始める前に:
動的フォームについて理解しておくと役立ちます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
ADF Facesバリデータまたはコンバータを動的フォームに手動で挿入するには:
次の例は、2つのバリデータおよび2つのコンバータが適用されている動的コンポーネントを示しています。
<af:panelFormLayout id="pfl1"> <af:iterator id="i1" value="#{bindings.EmpVO1.attributesModel.attributes}" var="attr"> <af:dynamicComponent value="#{bindings[attr.containerName][attr.name].inputValue}" attributeModel="#{attr}" id="dc1"/> <af:convertDateTime disabled="#{attr.name == 'Hiredate' ? false : true}" pattern="yyyy/MM/dd"/> <af:convertNumber disabled="#{attr.name == 'Sal' ? false : true}" pattern="#,###,###" /> <af:validateLength disabled="#{attr.name == 'Job' ? false : true}" maximum="10" hintMaximum="maxmum length is 10"/> <af:validateLongRange disabled="#{attr.name == 'Sal' ? false : true}" minimum="1000"/> </af:dynamicComponent> </af:iterator> </af:panelFormLayout>
動的フォームを作成する場合は、基本的に、動的にレンダリングされるコンポーネントのブロックを作成します。そのコンポーネント・ブロックの前後に静的コンポーネントを配置できますが、そのブロック内に静的コンポーネントを分散させることはできません。
次の例は、可能な静的コンポーネントと動的コンポーネントの混在の粒度を示しています。3つのgroup
タグから構成されます。その最初と3番目には静的コンテンツが含まれ、その2番目にはネストされたdynamicComponent
タグとともにiterator
タグが含まれます。
<af:group title="static before dynamic" id="g1"> <af:separator id="sp2"/> <af:inputText value="#{bindings.Empno.inputValue}" label="Static Empno" required="#{bindings.Empno.hints.mandatory}" columns="#{bindings.Empno.hints.displayWidth}" maximumLength="#{bindings.Empno.hints.precision}" shortDesc="#{bindings.Empno.hints.tooltip}" id="it1"> <f:validator binding="#{bindings.Empno.validator}"/> <af:convertNumber groupingUsed="false" pattern="#{bindings.Empno.format}"/> </af:inputText> </af:group> <af:group title="dynamic part" id="g2"> <af:separator id="sp3"/> <af:panelFormLayout id="pfl1"> <af:iterator id="i1" value="#{bindings.EmpVO1.attributesModel.attributes}" var="attr"> <af:dynamicComponent value="#{bindings[attr.containerName][attr.name].inputValue}" id="dc1" attributeModel="#{attr}"/> </af:iterator> </af:panelFormLayout> </af:group> <af:group title="static after dynamic" id="g3"> <af:separator id="sp4"/> <af:inputText value="#{bindings.Ename.inputValue}" label="Static Ename" required="#{bindings.Ename.hints.mandatory}" columns="#{bindings.Ename.hints.displayWidth}" maximumLength="#{bindings.Ename.hints.precision}" shortDesc="#{bindings.Ename.hints.tooltip}" id="it2"> <f:validator binding="#{bindings.Ename.validator}"/> </af:inputText> </af:group> <af:button text="Back" id="cbb1" action="back"/>
動的コンポーネントがレンダリングされる方法を決定する必要があるカスタム処理がある場合は、マネージドBeanでこれを行い、動的コンポーネントのattributeModel
プロパティを適切なBeanメソッドにバインドできます。
始める前に:
動的フォームについて理解しておくと役立ちます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
動的コンポーネントの動作をプログラム的に設定するには:
ユーザー・アクションに基づいて変更を行うために、動的コンポーネント・インスタンスにプログラム的にアクセスする必要がある場合は、マネージドBeanを使用して行うことができます。
始める前に:
動的フォームについて理解しておくと役立ちます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
動的コンポーネントのバインディング・インスタンスにプログラム的に設定するには:
次の例は、動的コンポーネントのラベル・スタイルを変更するマネージドBeanメソッドを示しています。
public void changeLabelColor (ActionEvent event) { UIComponent component = event.getComponent().getParent(); component = component.findComponent("pfl1"); while(component != null) { if(component.getId().equals("it1")) { RichDynamicComponent rdc = (RichDynamicComponent)component; rdc.setLabelStyle("color:red"); break; } else component = component.getChildren().get(0); } }
動的コンポーネントの実行時バインディング・インスタンスにプログラム的にアクセスする必要がある場合は、マネージドBeanを使用してこれを行うことができます。
始める前に:
動的フォームについて理解しておくと役立ちます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
動的コンポーネントのバインディング・インスタンスにプログラム的にアクセスするには:
次の例は、現在行のDeptNo
の値を9999に設定するマネージドBeanメソッドを示しています。
public void setValueThroughBinding(ActionEvent event) { // get binding container FacesContext facesContext = FacesContext.getCurrentInstance(); ELContext elContext = facesContext.getELContext(); ValueExpression valueExpression = createValueExpression("bindings", DCBindingContainer.class); DCBindingContainer binding = (DCBindingContainer) valueExpression.getValue(elContext); // get AttributesModel and attribute metadata list valueExpression = createValueExpression("bindings.EmpVO1.attributesModel", AttributesModel.class); AttributesModel attributesModel = (AttributesModel) valueExpression.getValue(elContext); List<BaseAttributeDescriptor> attrList = attributesModel.getAttributes(); // get AttributeMetadata for "Empno" BaseAttributeDescriptor deptNoAttributeBase = null; FacesAttributeDescriptor deptNoAttribute = null; for (BaseAttributeDescriptor attrDescriptor: attrList) { if ("Comm".equals(attrDescriptor.getName())) { deptNoAttributeBase = attrDescriptor; break; } } deptNoAttribute = (FacesAttributeDescriptor)deptNoAttributeBase; if (deptNoAttribute == null || deptNoAttribute.getContainerName() == null) { System.out.println("AttributesModel of Empno or its model name"); System.out.println("can not be found."); return; } // get Deptno attribute value binding, set input value JUFormBinding fb = (JUFormBinding) binding.findExecutableBinding((String) deptNoAttribute.getContainerName()); JUCtrlValueBinding valueBinding = (JUCtrlValueBinding) fb.getControlBinding(deptNoAttribute.getName()); valueBinding.setInputValue(Integer.valueOf(9999)); System.out.println("Found JUCtrlValueBinding " + deptNoAttribute.getName()"); System.out.println("set its value to 9999."); }
「データ・コントロール」パネルを使用してフォーム(動的フォームを除く)を作成すると、属性の削除、表示順序の変更、データの表示に使用するコンポーネントの変更、およびコンポーネントのバインド先の属性の変更を実行できます。
注意:
次の手順では、動的フォームの表示方法は変更できません。表示情報は、ビュー・オブジェクトまたはエンティティ・オブジェクトで変更する必要があります。
「データ・コントロール」パネルからドロップしたデフォルト・コンポーネントについて、一部の内容を変更できます。「構造」ウィンドウを使用して、コンポーネントの表示順序の変更、新規コンポーネントの追加や既存のコンポーネントの変更、またはコンポーネントの削除を行えます。「プロパティ」ウィンドウを使用すると、バインディングの変更や削除またはコンポーネントに対して表示されるラベルの変更が行えます。
始める前に:
生成された後の、UIコンポーネントでの作業について理解しておくと役立ちます。詳細は、「フォーム上のUIコンポーネントおよびバインディングの変更」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
デフォルト・コンポーネントおよびバインディングを変更するには: