Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.1.3) E59441-03 |
|
![]() 前 |
![]() 次 |
この章では、ADFデータ・コントロールおよびADF Facesコンポーネントを使用して、ADFビジネス・コンポーネントからデータがモデル化されたFusion Webアプリケーションでデータバインドされたフォームを作成する方法について説明します。テキスト・フィールドを個々の属性から作成する方法、新規レコードを編集および作成するためにコレクションからフォーム全体を生成する方法および動的フォームを作成する方法について説明します。
この章の内容は次のとおりです。
ビジネス・サービス用に作成されたデータ・コントロールを使用して情報の表示および収集を実行するための、UIページを作成できます。たとえば、「データ・コントロール」パネルを使用して、項目の属性をドラッグし、出力テキストまたはラベル付き入力テキスト・フィールドとして、値を表示できます。関連データの表示および更新に必要なすべてのJSFタグとバインディング・コードがJDeveloperによって作成されます。「データ・コントロール」パネルおよび宣言的なバインディング機能の詳細は、第17章「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。
個々の属性をドロップできる他、オブジェクトのすべての属性をフォーム、表または単一列リスト・ビューとして一度にドロップできます。この章には、値を表示するフォーム、ユーザーが値を編集できるフォームおよび値を収集するフォーム(入力フォーム)に関する情報が含まれます。表およびリスト・ビューの作成の詳細は、第29章「ADFによるデータバインドされた表の作成」を参照してください。
UIコンポーネントをドロップすると、コレクション内のレコード間を移動できるようにしたり、ユーザーがデータを操作(レコードのコミット、削除、作成など)できるようにする組込み操作をコマンドUIコンポーネントとしてドロップできます。たとえば、フォームに表示されたデータ・オブジェクトをユーザーが削除できるようにするためのボタンを作成できます。また、必要に応じてデフォルトのコンポーネントを変更することもできます。
行データを収集または表示する必要がある場合、フォームを使用します。たとえば、図28-1に示すように、Oracle ADFのSummitサンプル・アプリケーションには、ユーザーが顧客に関する情報を更新できるパネルが含まれています。このフォームは「データ・コントロール」パネルからCustomers
コレクションをドラッグ・アンド・ドロップし、表示するフィールドを選択して作成されました。
フォームを作成する場合、図28-2に示すように、ユーザーがレコード間を素早く移動できるように、ナビゲーションの追加を選択することもできます。
フォームに表示される行への処理を実行するコマンド・ボタンを追加することもできます。たとえば、レコードの値を変更して、これらの変更を編集フォームに保存できます。または、ユーザーに新規レコードの作成を許可する入力フォームを作成できます。図28-3は、ユーザーが新規注文を作成可能な入力フォームを示しています。
データバインドされたページを実装する前に他のOracle ADF機能を理解することが役立つ場合があります。有用なその他の機能へのリンクは、次のとおりです。
ADFビュー・オブジェクト: フォーム内でのコンポーネントの表示方法および機能のほとんどは、対応するビュー・オブジェクトによって制御されます。詳細は、第5章「ビュー・オブジェクトを使用したSQL問合せの定義」を参照してください。
ADFアプリケーション・モジュール: ページにデータバインドされたコンポーネントをドラッグする「データ・コントロール」パネルに、アプリケーション・モジュールに追加したビュー・オブジェクトの表示が移入されます。詳細は、第13章「アプリケーション・モジュールによるビジネス・サービスの実装」を参照してください。
アダプタベースのデータ・コントロール: EJBコンポーネントやWebサービスなど他のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』で説明されるこれらのビジネス・サービス用データ・コントロールを作成できます。
ADFモデルとデータ・バインディング: ADF Webアプリケーション内でフォームを作成する場合は、ADFモデルおよびデータ・バインディングを使用します。詳細は、第17章「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。
ADF Faces: ADF Faces UIコンポーネントも使用します。ADF Facesを使用した開発の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』を参照してください。
高度なUIコントロール: 基本的なフォームには、入出力コンポーネントを使用します。また、リスト、表、ツリー、検索フォーム、LOVコンポーネント、グラフ、ゲージ、ツリーマップなどの高度なコンポーネントを使用することもできます。詳細は、第V部「データバインドされたWebユーザー・インタフェースの作成」の残りの各章を参照してください。
タスク・フロー: トランザクションに携わるフォームの場合は(入力フォームなど)、フォームのレンダリングの前または後に、ADFタスク・フローを使用して特定の操作を起動する必要があります。詳細は、第V部「ADFタスク・フローの作成」を参照してください。
ページ・ライフサイクル: ページ・ライフサイクルでのフォームの処理の詳細は、第27章「Fusionページ・ライフサイクルの理解」を参照してください。
検証: 特定のフィールドがデータ・ストアに送信される前に、このフィールドを検証する必要がある場合もあります。詳細は、第11章「検証とビジネス・ルールの宣言的な定義」および第18章「ADFモデル・レイヤーでの検証の使用」を参照してください。
アクティブ・データ: アプリケーションでアクティブ・データを使用する場合は、データ・ソースのデータが変更されるたびに、UIコンポーネント内のデータを自動的に更新できます。詳細は、第47章「アクティブ・データ・サービスの使用」を参照してください。
JDeveloperでは、テキスト・フィールドを宣言的に作成可能な、JSFページ用の完全なWYSIWYG開発環境が用意されているため、ページのほとんどの内容をコードを見ずに設計できます。「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップすると、属性バインディングを使用してADF FacesテキストUIコンポーネントはデータ・コントロールの属性に宣言的にバインドされます。
属性を表示または更新できる個々のテキスト・フィールドを作成するには、「データ・コントロール」パネルからコレクションの属性をドラッグ・アンド・ドロップします。ADFビジネス・コンポーネントの場合、「データ・コントロール」パネルに、少なくとも1つのアプリケーション・モジュールで定義したデータ・モデルの要素が移入されます。
始める前に:
データ・コントロールを使用したテキスト・フィールドの作成に関する一般的な知識があると役立ちます。詳細は、第28章内の「データ・コントロール属性を使用したテキスト・フィールドの作成」を参照してください。
次のタスクを完了する必要があります。
13.2項「アプリケーション・モジュールの作成と変更」で説明する手順に従って、データ・モデルに含めたいビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別の種類のビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項を参照してください。
26.3項「Webページの作成」の説明に従って、JSFページを作成します。
データバインド・テキスト・フィールドを作成するには:
「データ・コントロール」パネルから、コレクションの属性を選択します。属性およびその他のオブジェクトを表す「データ・コントロール」パネルのアイコンの説明は、17.4項「「データ・コントロール」パネルの使用」を参照してください。
たとえば、図28-4は、Summit ADFサンプル・アプリケーションのBackOfficeAppModuleDataControl
データ・コントロールのCustomers
コレクション下のLastName
属性を示しています。これは、顧客の姓を表示、更新または挿入するためにドロップする属性です。
ページに属性をドラッグし、図28-5に示すように、ポップアップ・メニューから、属性値を表示または収集するUIコンポーネントのタイプを選択します。
各属性について、次の選択肢があります。
テキスト:
ラベル付ADF入力テキスト: label
属性が移入されADF Faces inputText
コンポーネントが作成されます。また、クライアント側検証を追加するために使用可能なネストされたvalidator
コンポーネントが作成されます。
ヒント: inputText コンポーネントの様々な属性の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「入力コンポーネントの使用およびフォームの定義」の章を参照してください。 |
ADF入力テキスト: ラベルなしADF Faces inputText
コンポーネントが作成されます。また、クライアント側検証に対して使用可能なネストされたvalidator
コンポーネントが生成されます。
ラベル付ADF出力テキスト: ADF Faces outputText
コンポーネントを保持するpanelLabelAndMessage
コンポーネントを作成します。panelLabelAndMessage
コンポーネントのlabel
属性が移入されます。
ADF出力テキスト: ADF Faces outputText
コンポーネントを作成します。
ラベル付ADF出力フォーマット済: 「ラベル付ADF出力テキスト」と同様ですが、outputText
コンポーネントのかわりにoutputFormatted
コンポーネントを使用します。outputFormatted
コンポーネントでは、制限された分量のHTML書式設定を追加できます。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の出力テキストおよび書式設定された出力テキストの表示に関する項を参照してください。
ADF出力フォーマット済: 「ラベル付ADF出力フォーマット済」と同様ですが、ラベルはありません。
ADFラベル: ADF Faces outputLabel
コンポーネント。
値リスト: ADF LOVリストを作成します。ビジネス・コンポーネントのこれらのリストでの作業方法の詳細は、5.12項「ビュー・オブジェクト属性の値リスト(LOV)での作業」を参照してください。アダプタベースのデータ・コントロールのこれらのリストでの作業方法の詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』の値リスト・オブジェクトの作成に関する項を参照してください。JSFページでのリストの使用の詳細は、32.3項「選択リストの作成」を参照してください。
単一選択: 単一選択リストを作成します。JSFページでのリストの作成に関する詳細は、32.3項「選択リストの作成」を参照してください。
注意: これらの選択は、デフォルトではユーザーが選択します。ただし、属性で使用可能なコンポーネントのリストは、関連するエンティティまたはビュー・オブジェクトのコントロール・ヒントとして構成できます。詳細は、4.6項「エンティティ・オブジェクトの属性のコントロール・ヒントの定義」および5.13項「ビュー・オブジェクトのUIヒントの定義」を参照してください。アダプタベースのデータ・コントロールのコントロール・ヒントを追加する方法の詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』の属性にUIヒントを設定する方法に関する項を参照してください。 |
この章の目的にあわせて、ここではテキスト・コンポーネントのみ(リストは除く)について説明します。
JSFページに属性をドラッグしてUIコンポーネントとしてドロップすると、そのページのページ定義ファイル(すでに存在する場合を除く)などが作成されます。属性をページにドラッグすると行われるすべての処理の説明は、17.4.2項「「データ・コントロール」パネルの使用時の処理」を参照してください。イテレータと属性のバインディングが作成され、ページ定義ファイルに追加されます。また、UIコンポーネントに必要なJSPXまたはJSFページ・コードがJSFページに追加されます。
「データ・コントロール」パネルからコレクションの一部である項目をドロップして(またはコレクション全体をフォームまたは表としてドロップして)ページ上にUIコンポーネントを作成するたびに、イテレータ・バインディングが自動的に作成されます(すでに存在する場合を除く)。イテレータ・バインディングは、データ・コレクションのイテレータを参照し、この機能によりそのデータ・オブジェクトを反復処理します。また、コレクション内のデータ・オブジェクトの現在行および状態を管理します。イテレータ・バインディングは実際にはデータにアクセスしません。かわりに、データにアクセスできるオブジェクトを単純に公開し、コレクション内の現在のデータ・オブジェクトを指定します。その後、現在のオブジェクトのデータを戻したり、オブジェクトのデータに対してアクションを実行するために、他のバインディングがこのイテレータ・バインディングを参照します。イテレータ・バインディングはイテレータではないことに注意してください。これはイテレータへのバインディングです。ADFビジネス・コンポーネントの場合、実際のイテレータは、アプリケーション・モジュールのデータ・モデル内のビュー・オブジェクト・インスタンスのデフォルト行セットに対するデフォルト行セット・イテレータです。
たとえば、Customers
コレクションのLastName
属性をドロップした場合、Customers
コレクションのイテレータ・バインディングが作成されます。
ヒント: 各コレクションに対して1つのイテレータ・バインディングが作成されます。つまり、同じコレクションから2つの属性をドロップした場合(もしくは同じコレクションを2回ドロップした場合)は、同じバインディングが使用されます。この動作の1つの利点は、コンポーネントの現状が同期された状態で維持されることです。たとえば、ページに同じコレクションからドロップされた表とフォームがある場合、フォームには、表で選択された行のレコードが表示されます。コンポーネントごとに動作の異なるバインディングが必要な場合、手動で個別のイテレータ・バインディングを作成する必要があります。 |
イテレータ・バインディングのrangeSize
属性は、イテレータ・バインディングへのアクセスが行われるたびにデータ・コントロールからフェッチされるデータ行数を決定します。この属性により、行セット全体の中でいくつかの絶対開始位置に対して1-n行の相対セットが置かれます。属性またはコレクションをページ上にドラッグしてイテレータ・バインディングを作成する場合、属性は最初に25
に設定されます。この属性の使用の詳細は、28.4.2.2項「定義されるイテレータのRangeSize属性」を参照してください。例28-1は、Customers
コレクションから属性をドロップした場合に作成されるイテレータ・バインディングを示します。
例28-1 コレクションからドロップされた属性用のイテレータ・バインディングのページ定義コード
<executables> <iterator Binds="Customers" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="Customers"/> </executables>
イテレータ・バインディング要素の属性の詳細は、付録B「Oracle ADFバインディング・プロパティ」を参照してください。
このメタデータにより、ADFバインディング・コンテナは属性値にアクセスできます。実行可能ファイルであるイテレータ・バインディングは、デフォルトでページのロード時に起動されるため、これによってイテレータがCustomers
コレクションにアクセスし、反復処理を実行できます。これは、イテレータによって、コレクション内のすべてのCustomers
オブジェクトの管理(現在のCustomers
オブジェクトまたはCustomers
オブジェクト・レンジの判別など)が行われることを意味します。
「データ・コントロール」パネルから属性をドロップすると、UIコンポーネントを属性の値にバインドするための属性バインディングが作成されます。このタイプのバインディングは、コレクション内の現在行のシングル・オブジェクトに対する属性の値を提示します。値バインディングは、属性値の表示と収集の両方に使用できます。
たとえば、Customers
コレクションの下にあるLastName
属性を「ラベル付ADF出力テキスト」ウィジェットとしてページにドロップすると、JDeveloperによって、LastName
属性の属性バインディングが作成されます。これにより、バインディングが現在のレコードの属性値にアクセスできるようになります。例28-2に、Customers
コレクションから属性をドロップすると作成される、LastName
に対する属性バインディングを示します。この属性値は、CustomersIterator
という名前のイテレータを参照します。
例28-2 属性バインディングのページ定義コード
<bindings> ... <attributeValues IterBinding="CustomersIterator" id=""LastName <AttrNames> <Item Value="LastName"> </AttrNames> </attributeValues> </bindings>
属性バインディング要素のプロパティの詳細は、付録B「Oracle ADFバインディング・プロパティ」を参照してください。
「データ・コントロール」パネルから属性をドロップしてテキスト・フィールドを作成すると、対応するタグがJSFページに記述され、ドロップしたウィジェットに関連付けられているUIコンポーネントが作成されます。
たとえば、LastName
属性を「ラベル付出力テキスト」ウィジェットとしてドロップすると、JDeveloperによってpanelLabelAndMessage
コンポーネントとoutputText
コンポーネントのタグが挿入されます。また、panelLabelAndMessage
コンポーネントのlabel
属性を、LastName
のバインディングのために作成されたヒントのlabel
プロパティにバインドするEL式が作成されます。この式は、ビュー・オブジェクトに設定されたラベル・ヒントを評価します(ヒントの詳細は、5.13項「ビュー・オブジェクトのUIヒントの定義」を参照)。また、現在の行のLastName
属性の値に評価される、outputText
コンポーネントのvalue
属性をLastName
バインディングのinputValue
プロパティにバインドする、別の式が作成されます。両方のコンポーネントに対してIDも自動的に生成されます。
ヒント: JDeveloperでは、すべてのADF FacesコンポーネントのIDが自動的に生成されます。これらの値を必要に応じてオーバーライドできます。 |
例28-3に、LastName
属性を「ラベル付出力テキスト」ウィジェットとしてドロップしたときにJSFページで生成されるコードを示します。
例28-3 「ラベル付き出力テキスト」としてドロップされた属性のJSFページ・コード
<af:panelLabelAndMessage label="#{bindings.LastName.hints.label}" id="plam1"> <af:outputText value="#{bindings.LastName.inputValue}" id="ot1"/> </af:panelLabelAndMessage>
かわりにLastName
属性を「ラベル付入力テキスト」ウィジェットとしてドロップすると、JDeveloperによってinputText
コンポーネントが作成されます。例28-4に示すように、値はLastName
バインディングのinputValue
プロパティにバインドされます。さらに、次のプロパティも設定されます。
label
: オブジェクトのlabel
UIヒントにバインドされます。
required
: オブジェクトのmandatory
プロパティにバインドされます。
columns
: オブジェクトのdisplayWidth
UIヒントにバインドされます。テキスト・ボックスの幅を決定します。
maximumLength
: オブジェクトのprecision
プロパティにバインドされます。フィールドに入力できる1行当たりの最大文字数を決定します。
shortDesc
: tooltip
UIヒントにバインドされます。
また、JDeveloperはinputText
コンポーネント内にvalidator
タグをネストします。このタグを使用してクライアント側の検証規則を作成し、モデルまたはビジネス・サービス・レイヤーに存在する検証規則を補足できます。
validator
およびconverter
タグの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「入力の検証および変換」の章を参照してください。
例28-4 「ラベル付き入力テキスト」としてドロップされた属性のJSFページ・コード
<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>
これらの値は必要に応じて変更できます。たとえば、ビュー・オブジェクトのmandatory
コントロール・ヒントはデフォルトでfalse
に設定されており、これは、コンポーネントのrequired
属性もfalse
と評価されることを意味します。コンポーネントのrequired
属性をtrue
に設定すると、この値をオーバーライドできます。属性のすべてのインスタンスを必須にする場合は、ビュー・オブジェクト内のコントロール・ヒントを変更して、すべてのインスタンスを必須にすることができます。これらのプロパティの詳細は、付録B「Oracle ADFバインディング・プロパティ」を参照してください。エンティティ・オブジェクト・レベルでのこれらのプロパティ変更の詳細は、4.10項「属性プロパティの設定」を参照してください。ビュー・オブジェクト・レベルでのこれらのプロパティ変更の詳細は、5.2.4項「ビュー・オブジェクトの編集方法」を参照してください。
コレクションの各属性を個別にドロップしてフォームを作成するかわりに、コレクションの複数の属性からフォームを作成するコレクション・ノードをドロップできます。
たとえば、Customers
コレクションをドラッグ・アンド・ドロップすることによって、Summit ADFサンプル・アプリケーションの顧客に関する基本的な情報を表示するページを作成できます。
また、コレクションからデータを表示するだけでなく、多くの機能を提供するフォームの作成もできます。ユーザーがデータを更新できるフォームの作成に関する詳細は、28.6項「既存レコードを編集するフォームの作成」を参照してください。 ユーザーがコレクションの新規オブジェクトを作成できるフォームの作成に関する詳細は、28.8項「入力フォームの作成」を参照してください。また、検索フォームも作成できます。詳細は、第33章「ADFでデータバインドされた検索フォームの作成」を参照してください。
データ・コントロールを使用してフォームを作成する場合、UIコンポーネントをデータ・コントロールの対応するオブジェクトの属性にバインドします。JDeveloperでは、「データ・コントロール」パネルからコレクションをドラッグ・アンド・ドロップして、宣言的にこの処理を実行できます。
始める前に:
基本的なデータバインド・フォームについて理解しておくと役立ちます。詳細は、28.3項「データ・コントロールのコレクションを使用した基本的なフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
13.2項「アプリケーション・モジュールの作成と変更」で説明する手順に従って、データ・モデルに含めたいビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別の種類のビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項を参照してください。
26.3項「Webページの作成」の説明に従って、JSFページを作成します。
基本的なフォームを作成するには:
「データ・コントロール」パネルから、表示するデータを表すコレクションを選択します。図28-6に、BackOfficeAppModuleDataControl
データ・コントロールのCustomers
コレクションを示します。
コレクションをページにドラッグし、ポップアップ・メニューから「ADFフォーム」を選択します。
「フォームの作成」ダイアログで、フォームを構成します。
属性がフォームに表示できないようにすることができます。
「読取り専用フォーム」チェック・ボックスを選択しない場合、ADF inputText
コンポーネントがほとんどの属性に対して使用されます。inputText
コンポーネントごとにlabel
属性が移入されます。デフォルトで、ラベルは、関連付けられているバインディング・オブジェクトのlabel
プロパティにバインディングからその値を取得します。
日付である属性ではInputDate
コンポーネントが使用されます。
属性にコントロール・タイプのコントロール・ヒントが作成されている場合、または属性がリストとして構成されている場合、ヒントにより設定されたコンポーネントが使用されます。
InputText
コンポーネントには、属性のクライアント側検証を設定するためのvalidator
タグが含まれます。属性が数値または日付の場合、converter
も含まれます。
ヒント: inputText コンポーネントの様々な属性の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「入力コンポーネントの使用およびフォームの定義」の章を参照してください。 |
「読取り専用フォーム」チェック・ボックスを選択する場合、読取り専用outputText
コンポーネントが使用されます。このフォームはデータの表示を目的としているため、validator
タグは追加されません(コンバータは含まれます)。タイプDate
の属性は、読取り専用フォームではoutputText
コンポーネントを使用します。すべてのコンポーネントは、label
属性を含むpanelLabelAndMessage
コンポーネント内に配置され、panelFormLayout
コンポーネントに格納されます。これにより、実行時にラベルがoutputText
コンポーネントと適切に位置合せされるようになります。
ユーザーがコレクション内の全データ・オブジェクト間を移動できるようにする、ナビゲーション・コントロールを含めることもできます。詳細は、28.5項「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。
HTMLフォームを送信する「送信」ボタンが含まれ、フォームのデータをJSF/ADFページ・ライフサイクルの一部としてバインディングに適用することもできます。このダイアログの使用方法に関する追加のヘルプを表示するには、「ヘルプ」をクリックします。
ユーザーがデータを更新できるようにするためのフォームを作成する場合は、ここで、レコードを更新するために変更をコミットする操作をドラッグ・アンド・ドロップする必要があります。詳細は、28.6項「既存レコードを編集するフォームの作成」を参照してください。
注意: 「フォームの作成」ダイアログで実行時に生成されるフィールドを選択する場合、表示する属性は、ビジネス・サービスの構成に基づいて実行時に決定されます。詳細は、28.9項「動的コンポーネントを使用したフォームの作成」を参照してください。 |
「データ・コントロール」パネルからオブジェクトをフォームとしてドロップすることは、単一の属性をドロップするのと同じ効果があります。ただし、複数の属性バインディングおよび関連するUIコンポーネントが作成され、すべてのUIコンポーネントがpanelFormLayout
コンポーネント内に配置される点が異なります。UIコンポーネントの属性(value
など)は、その属性のバインディング・オブジェクト(inputValue
など)のプロパティ、または対応するビジネス・オブジェクトで設定されるコントロール・ヒントの値にバインドされます。例28-5に、Customers
コレクションをデフォルトADFフォームとしてドロップした場合にJSFページで生成されるコードの一部を示します。
注意: 関連するビューまたはエンティティ・オブジェクトで属性が非表示としてマークされている場合、対応するUIは作成されません。 |
例28-5 入力フォームのJSFページのコード
<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>
「データ・コントロール」パネルから項目をドロップするときに生成されるコードの詳細は、28.2.2項「テキスト・フィールドの作成時の処理」を参照してください。
定義済の値リスト(LOV)を含むオブジェクトを使用して入力フォームを作成する場合、inputText
コンポーネントのかわりにselectOneChoice
コンポーネントが作成されます。たとえば、CustomerVO
ビュー・オブジェクトには、CountryId
およびCreditRatingId
属性の定義済LOVが含まれます。Customers
データ・コントロール・オブジェクトをADFフォームとしてドロップすると、(空の入力テキスト・フィールドのかわりに)すべての値を表示するドロップダウン・リストが各LOVに対して作成されます。これらのリストでの作業方法の詳細は、5.12項「ビュー・オブジェクト属性の値リスト(LOV)での作業」を参照してください。アダプタベースのデータ・コントロールのこれらのリストでの作業方法の詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』の値リスト・オブジェクトの作成に関する項を参照してください。JSFページでのリストの使用の詳細は、32.3項「選択リストの作成」を参照してください。
注意: オブジェクトに構造化属性(Javaのプリミティブ・タイプまたはコレクションのいずれでもない属性)が含まれる場合、その属性はダイアログには表示されず、また、フォームに対応するコンポーネントもありません。これらのフィールドは手動で作成する必要があります。 |
「データ・コントロール」パネルには、データ・オブジェクトの表示を提供するほか、フォームで使用するための標準操作を表すノードもあります。これらの組込み操作により、レコード間の移動やデータベースへの変更のコミットなど、通常のフォーム機能を宣言的に処理できます。大半の操作はデータ・コントロール内の個々のデータ・コレクションに対応しています。コミットおよびロールバック操作はデータ・コントロール全体に対して使用できます。「データ・コントロール」パネルからページに操作をドラッグする場合、ボタンやリンクなど、作成するコマンド・コンポーネントの種類を選択するよう求められます。
図28-8は、Summit ADFサンプル・アプリケーションのCountries
コレクションで使用可能な操作を示しています。
この項では、組込みデータ・コントロール操作からコマンド・コンポーネントを作成する方法を示します。データバインドされたページでコマンド・コンポーネントを使用可能な他の方法の詳細は、第30章「ビュー・レイヤーで各機能を起動するコマンド・コンポーネントの使用」を参照してください。
データ・コントロール操作に基づいてコマンド・コンポーネントを作成するには、「データ・コントロール」パネルからページに操作をドラッグ・アンド・ドロップします。
始める前に:
コマンド・コンポーネントを作成するためにデータ・コントロール操作を使用することを理解しておくと役立ちます。詳細は、第28章内の「データ・コントロール操作を使用したコマンド・コンポーネントの作成」を参照してください。
次のタスクを完了する必要があります。
13.2項「アプリケーション・モジュールの作成と変更」で説明する手順に従って、データ・モデルに含めたいビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別の種類のビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項を参照してください。
26.3項「Webページの作成」の説明に従って、JSFページを作成します。
操作からコマンド・コンポーネントを作成するには:
「データ・コントロール」パネルから、操作をページにドラッグします。
次に表示されるポップアップ・メニューから「ADFボタン」または「ADFリンク」を選択します。
操作をドロップしてコマンド・コンポーネントを作成する場合、JDeveloperによって次の処理が行われます。
関連付けられている操作について、ページ定義ファイルでアクション・バインディングが定義されます。
コレクションに部分ページ・レンダリングを使用するように、イテレータ・バインディングが構成されます。
コマンド・コンポーネント用のコードがJSFページに挿入されます。
アクション・バインディングは、ビジネス・ロジックを実行します。たとえば、アクション・バインディング・オブジェクト上で操作を起動できます。これらの操作は、イテレータまたはデータ・コントロール自体で機能します。
アクション・バインディングがNext
またはPrevious
などのイテレータレベル・アクションにバインドされている場合、操作のアクション・バインディングには、値バインディングと同様にイテレータ・バインディングへの参照が含まれます。これらのタイプのアクションはイテレータによって実行されます。イテレータは現在のオブジェクトを判別するため、ナビゲーション・ボタンがクリックされたときに表示するオブジェクトが正しく判別されます。イテレータ・レベルではないアクションへのアクション・バインディング(たとえば、アプリケーション・モジュールのカスタム・メソッドやコミット操作やロールバック操作の場合)には、この参照は含まれません。
アクション・バインディングはRequiresUpdateModel
プロパティを使用して、アクションを実行する前にモデルを更新する必要があるかどうかを判別します。ナビゲーション操作の場合、デフォルトではこのプロパティはtrue
に設定されています。つまり、ビュー・レイヤーでのすべての変更は、ナビゲーションを実行する前にモデルに移動する必要があります。
例28-6に、ナビゲーション操作のアクション・バインディングを示します。
例28-6 操作アクション・バインディングのページ定義コード
<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つのセット番号のみを戻すため、他のバインディングでアクセスできるようになります。イテレータはレンジの最後に到達すると、次のセットにアクセスします。例28-7に、Customers
イテレータのデフォルトのレンジ・サイズを示します。
例28-7 イテレータのRangeSize属性
<iterator Binds="Customers" RangeSize="25"
DataControl="BackOfficeAppModuleDataControl"
id="CustomersIterator"
ChangeEventPolicy="ppr"/>
イテレータ・バインディングが最初に生成されるときに、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
プロパティの詳細は、付録B「Oracle ADFバインディング・プロパティ」を参照してください。
例28-8に、Create
およびDelete
操作をページ上のボタンとしてドロップした後に生成されるコードを示します。
ユーザーがコマンド・コンポーネントをクリックすると、フォームが送信され、続いてアクション・イベントが起動します。アクション・イベントは、ユーザー・インタフェースのみに影響する場合(たとえば、異なるフィールド・プロンプトを表示させる、ロケールを変更するためのリンク)と、なんらかのロジック処理を伴う場合(たとえば、次のレコードに移動するためのボタン)があります。次に、そのイベント・オブジェクトは、イテレータから現在のデータ・オブジェクトの情報を取得し、それをアクション・バインディングのメソッドに渡し、そのactionListener
属性からコマンド・コンポーネントにバインドされます。
注意: アクション・リスナーは、コマンド・コンポーネントによってアクション・イベントが起動されたときに通知を受けるよう登録されているクラスです。アクション・リスナーには、コマンド・コンポーネントによって渡されるアクション・イベント・オブジェクトを処理する、アクション・リスナー・メソッドが含まれます。 |
たとえば、ユーザーがADF Delete操作から作成された「削除」
ボタンをクリックすると、アクション・イベントが起動されます。このイベント・オブジェクトは、イテレータから取得した現在のデータ・オブジェクトの現在行位置情報を格納します。コンポーネントのactionListener
属性がDelete
アクション・バインディングのexecute
メソッドにバインドされているため、イベントが起動されるとDelete
操作が起動します。このメソッドは、イベント・オブジェクトで渡された現在行位置情報を使用して、削除するデータ・オブジェクトを判別します。
通常、actionListener
プロパティの値はEL式の形式です。たとえば、actionListener
属性の値が{bindings.Delete.execute}
の場合、Delete
アクション・バインディングのexecute()
メソッドがコールされます。
操作またはメソッドをコマンド・ボタンとしてドロップすると、JDeveloperによって操作またはメソッドのexecuteメソッドにそのボタンがバインドされます。ただし、既存のロジックの前または後に、ロジックの追加が必要になる場合もあります。JDeveloperを使用すると、バインディング・コンテナにアクセスするマネージドBeanでメソッドおよびプロパティを新規作成することにより、宣言的操作にロジックを追加できます。デフォルトでは、この生成されたコードによって、操作またはメソッドが実行されます。その後、このコードの前か後にロジックを追加できます。元の操作またはメソッドのexecuteプロパティではなく、この新規メソッドにコマンド・コンポーネントが自動的にバインドされます。その後、ユーザーがボタンをクリックすると、新規メソッドが実行されます。詳細は、30.4項「宣言メソッドのオーバーライド」を参照してください。
ADFフォームを作成する際、ナビゲーション・コントロールの組込みを選択すると、データ・コントロールの既存のナビゲーション・ロジックにバインドされているADF Facesコマンド・コンポーネントが組み込まれます。この組込みロジックによって、ユーザーは、コレクション内のすべてのデータ・オブジェクトを移動できるようになります。図28-9の例は、Countries
コレクションをドラッグし、ナビゲーションを使用するADFフォームとしてドロップした場合に作成されるフォームを示しています。
表28-1に、データ・コントロールで提供される組込みナビゲーション操作と、操作にバインドされたイベントの実行または操作の起動の結果を示します。アクション・イベントの詳細は、28.4.3項「実行時に行われる処理: アクション・イベントおよびアクション・リスナーの動作方法」を参照してください。
表28-1 組込みナビゲーション操作
操作 | 関連イテレータ・バインディングによる起動時の処理 |
---|---|
最初へ |
現在のポインタを結果セットの最初に移動します。 |
最後へ |
現在のポインタを結果セットの最後に移動します。 |
前 |
現在のポインタを結果セットの前のオブジェクトに移動します。このオブジェクトが現在のレンジの外にある場合は、レンジ・サイズと同じオブジェクト数だけレンジが戻るようにスクロールされます。 |
次 |
現在のポインタを結果セットの次のオブジェクトに移動します。このオブジェクトが現在のレンジの外にある場合は、レンジ・サイズと同じオブジェクト数だけレンジが進むようにスクロールされます。 |
Previous Set |
レンジ・サイズ属性と同じオブジェクト数だけ、レンジを戻すように移動します。 |
Next Set |
レンジ・サイズ属性と同じオブジェクト数だけ、レンジを進めるように移動します。 |
デフォルトでは、「データ・コントロール」パネルを使用してフォームを作成する際にナビゲーションの組込みを選択すると、「先頭へ」、「最後へ」、「前へ」および「次へ」の各ボタンが作成され、ユーザーがコレクション内を移動できるようになります。
また、既存のフォームにナビゲーション・ボタンを手動で追加できます。
始める前に:
ナビゲーション・コントロールについて理解しておくと役立ちます。詳細は、28.5項「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
13.2項「アプリケーション・モジュールの作成と変更」で説明する手順に従って、データ・モデルに含めたいビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別の種類のビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項を参照してください。
26.3項「Webページの作成」の説明に従って、JSFページを作成します。
ナビゲーション・ボタンを手動で追加するには:
操作の実行対象となるオブジェクトのコレクションに関連付けられている操作を「データ・コントロール」パネルから選択し、JSFページ上にドラッグします。
たとえば、国のコレクション全体を移動できるようにする場合は、Countriesコレクションに関連付けられている「次へ」
操作をドラッグします。図28-8に、Countries
コレクションに関連付けられている操作を示します。
次に表示されるポップアップ・メニューから「ADFボタン」または「ADFリンク」を選択します。
ヒント: 「先頭へ」、「最後へ」、「前へ」および「次へ」のすべてのボタンを一度にドロップすることもできます。一度にドロップするには、対応するコレクションをドラッグし、ポップアップ・メニューから「移動」→「ADFナビゲーション・ボタン」を選択します。 |
「データ・コントロール」パネルからナビゲーション操作をドロップする場合、JDeveloperによって次の処理が行われます。
関連付けられている操作について、ページ定義ファイルでアクション・バインディングが定義されます。
コレクションに部分ページ・レンダリングを使用するように、イテレータ・バインディングが構成されます。
コマンド・コンポーネント用のコードがJSFページに挿入されます。
ボタンをクリックすると部分ページ・リクエストが起動されるように、JSFページにコンポーネントのpartialSubmit
属性を挿入し、それをtrue
に設定します。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の部分トリガーの使用に関する項を参照してください。
コマンド・コンポーネントに対して生成されたコードの詳細は、28.4.2項「操作を使用したコマンド・コンポーネント作成時の処理」を参照してください。
例28-9に、ナビゲーション操作ボタンに対してJSFページで生成されたコードを示します。
例28-9 ADF操作にバインドされているナビゲーション・ボタンの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
属性からボタンにバインドされます。
詳細は、28.4.3項「実行時に行われる処理: アクション・イベントおよびアクション・リスナーの動作方法」を参照してください。
また、ユーザーがナビゲーション・ボタンをクリックすると、ボタンのアクション・バインディングと同じイテレータに関連付けられたコンポーネントのみがライフサイクルを通して処理されます。詳細は、27.2.1項「部分ページ・レンダリングおよびイテレータ・バインディングに関する必知事項」を参照してください。
フォームに表示されるレコード間でのナビゲートには、ナビゲーション・ボタンを使用する必要があり、ブラウザの「戻る」または「進む」ボタンは使用できません。ナビゲーション・フォームでは自動的にPPRが使用されるため、ライフサイクルを通過するのはページの一部のみです(つまり、ユーザーがナビゲーション・ボタンをクリックすると、データを表示するコンポーネントがリフレッシュされて新しいデータが表示されますが、ユーザーは実際には同じページにとどまっています)。したがって、ブラウザの「戻る」ボタンをクリックすると、そのフォームに表示された前のレコードではなく、そのフォームを使用したページの前にレンダリングされたページに戻ります。
たとえば、現在の注文をすべて表示するためのリンクを含むページが表示されているとします。このリンクをクリックすると、フォームを使用したページに移動し、最初の注文であるOrder #101が表示されます。次に「次へ」をクリックすると、Order #102が表示されます。再び「次へ」をクリックすると、Order #103が表示されます。ブラウザの「戻る」ボタンをクリックした場合、Order #102は表示されません。かわりに、現在のすべての注文を表示するためのリンクを含むページに戻ります。
ユーザーが現在のデータを編集し、その変更をデータ・ソースにコミットするためのフォームを作成できます。フォームを作成するには、コレクションまたはデータ・コントロール自身に関連付けられたデータ・レコードを変更するための操作を使用して、コマンド・ボタンを作成します。たとえば、Delete
操作を使用して、ユーザーが現在のレンジからレコードを削除できるボタンを作成できます。
ADFビジネス・コンポーネントまたは明示的コミット・モデルを持つEJBセッションBeanに基づいたデータ・コントロールの場合、重要なのは、これらの操作がADFキャッシュのオブジェクトに対してのみ実行されるという点です。ルート・データ・コントロール上でCommit
操作を使用して、任意の変更をデータソースに実際にコミットする必要があります。データ・コントロールのRollback
操作を使用して、キャッシュされたオブジェクトに対する任意の変更をロールバックします。ページが、バインド・タスク・フロー内のトランザクションの一部である場合、通常、タスク・フロー・リターン・アクティビティのトランザクションを解決するためにこの操作を使用します。詳細は、24.3項「タスク・フローのトランザクションの管理」を参照してください。
編集フォームを作成するには、コレクションをフォームとしてページにドロップし、適切な操作をコマンド・コンポーネントとしてドロップします。
始める前に:
編集フォームの作成について理解しておくと役立ちます。詳細は、28.6項「既存レコードを編集するフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
13.2項「アプリケーション・モジュールの作成と変更」で説明する手順に従って、データ・モデルに含めたいビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別の種類のビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項を参照してください。
26.3項「Webページの作成」の説明に従って、JSFページを作成します。
編集フォームの作成方法:
「データ・コントロール」パネルから、フォームを作成するコレクションをドラッグし、ポップアップ・メニューから「ADFフォーム」を選択します。
これにより、inputText
コンポーネントを使用し、フィールドのデータを編集可能なフォームが作成されます。
「フォームの作成」ダイアログで、追加するフィールドとボタンをフォームに設定し、「OK」をクリックします。
必要に応じて、「データ・コントロール」パネルから、フォームに追加するコレクションに関連付けられている追加操作を選択し、ポップアップ・メニューから「ADFボタン」または「ADFリンク」を選択します。
たとえば、国を削除できるようにする場合は、Countries
コレクションに関連付けられているDelete
操作を選択します。図28-10に、Countries
コレクションに関連付けられている操作を示します。
変更内容を保存するかキャンセルする場合はページに操作を追加します。
ページが、バインド・タスク・フロー内のトランザクションの一部でない場合、ユーザーが変更をコミットまたはロールバックできるようにするためのボタンを作成する必要があります。「データ・コントロール」パネルから、ルートレベル・データ・コントロールに関連付けられたCommit操作とRollback操作をドラッグし、コマンド・ボタンまたはコマンド・リンクのいずれかとしてドロップします。図28-11に、BackOfficeAppModuleDataControl
データ・コントロールのコミット操作とロールバック操作を示します。
ページが、バインド・タスク・フロー内のトランザクションの一部である場合、タスク・フロー・リターン・アクティビティを作成する際のトランザクションを解決する値としてCommit
またはRollback
を入力します。詳細は、24.3項「タスク・フローのトランザクションの管理」を参照してください。
ADFビジネス・コンポーネント以外のビジネス・サービスに基づいたデータ・コントロールにフォームを作成する場合は、Commit
およびRollback
操作を使用できない場合があります。詳細は、28.6.3項「ステートレス・ビジネス・サービスのデータ・コントロールに関する必知事項」を参照してください。
必要に応じて、各編集可能なフィールドのautoSubmit
プロパティをtrue
に変更します。
これを行うことにより、フィールドを変更してボタンをクリックするなど、別のイベント・シーケンスによってCommit
およびRollback
操作が有効になっていない場合に、フィールドからタブアウトし、これらを有効にしたときに、ユーザーの変更をページに送信できるようになります。
フィールドを選択し、「プロパティ」ウィンドウの「動作」
セクションにスクロールして、フィールドのautoSubmitプロパティにアクセスできます。
ヒント: 編集フォームを作成する同じページにフォームと同じコレクションから作成された表がある場合にも、表およびフォームは同じイテレータ・バインディングを使用し、これにより、表で行を選択することによってユーザーがフォームで編集するレコードを選択できるようになります。データバインドされた表の作成の詳細は、29.2項「基本表の作成」を参照してください。 |
ページにコレクションをドロップする場合の処理の詳細は、28.3.2項「データ・コントロール・コレクションを使用したフォームの作成時の処理」を参照してください。
コマンド・ボタンとして任意のデータ・コントロール操作をドロップすると、ナビゲーション操作をドロップするときと同様のコードが生成されます。詳細は、28.4.2項「操作を使用したコマンド・コンポーネント作成時の処理」を参照してください。
イテレータとは異なり、Commit
操作とRollback
操作はアプリケーション・モジュール(データ・コントロール自身)でメソッドを実行するため、これらの操作のアクション・バインディングがイテレータへの参照を必要としないことが、唯一の相違点です。Rollback
アクションのRequiresUpdateModel
プロパティはfalse
に設定されています。これは、すべての変更は破棄する必要があるので、操作の実行前にモデルは更新されないためです。例28-10に、これらの操作に対するページ定義ファイルに生成されたアクション・バインディングを示します。
例28-10 Commit操作とRollback操作のアクション・バインディング
<action id="Commit" RequiresUpdateModel="true" Action="commitTransaction" DataControl="BackOfficeAppModuleDataControl"/> <action id="Rollback" RequiresUpdateModel="false" Action="rollbackTransaction" DataControl="BackOfficeAppModuleDataControl"/>
表28-2に、データ・コントロールおよびデータ・コントロール・オブジェクトで提供されるナビゲーション以外の組込み操作と、操作にバインドされたイベントの実行の結果または操作の起動を示します。アクション・イベントの詳細は、28.4.3項「実行時に行われる処理: アクション・イベントおよびアクション・リスナーの動作方法」を参照してください。
表28-2 追加の組込み操作
操作 | 関連イテレータ・バインディングによる起動時の処理 |
---|---|
|
現在の行の直前に行を作成し、行セットに新しいレコードを挿入して、現在行ポインタを新しい行に移動します。レンジは移動しないため、レンジの最後の行が結果的にレンジから除外される可能性があります。 注意: |
|
現在の行の直前に行を作成し、現在行ポインタを新しい行に移動します。レンジは移動しないため、レンジの最後の行が結果的にレンジから除外される可能性があります。 アプリケーション・モジュールおよびほとんどの他のビジネス・サービスに基づいたデータ・コントロールの場合、ユーザーが実際にデータを作成することなく移動した場合の空白行を避けるため、行セットにレコードは挿入されません。新しい行は、ユーザーがデータを送信すると作成されます。詳細は、29.4.5項「CreateおよびCreateInsertに関する必知事項」を参照してください。ただし、JPAベースのデータ・コントロールの場合は、 |
|
注意: |
|
現在の行をキャッシュから削除し、現在行ポインタを結果セットの次の行に移動します。レンジは移動しないため、レンジの最後に行が追加される可能性があります。最後の行が削除された場合、現在行ポインタはその前の行に移動します。コレクション内の行がなくなると、有効な属性が |
|
入力フィールドによって指定された値から変換された |
|
行キーを、入力フィールドで指定された値から変換された |
|
キーの値を使用して、イテレータの現在のオブジェクトを設定します。詳細は、29.2.3項「表での現在行の設定に関する必知事項」を参照してください。 |
|
パラメータとして渡された名前付きのバインド変数に新しい値を割り当てた後で、ビュー・オブジェクトの問合せを(再)実行することにより、データ・コレクションをリフレッシュします。この操作は、 この操作は、設計時に1つ以上の名前付きバインド変数が定義されているビュー・オブジェクトの場合のみ表示されます。詳細は、5.10項「バインド変数の使用」を参照してください。 EJBおよびBeanデータ・コントロールの場合、この操作はパラメータ使用の問合せに基づくデータ・コントロール・コレクション・オブジェクトでのみ使用可能です。 |
|
現在キャッシュ内にあるすべての項目をデータベースにコミットします。 |
|
キャッシュをクリアして、トランザクションおよびイテレータを初期状態に戻します。 |
|
これらの操作は、検索フォームでのみ使用されます。詳細は、第33章「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パラメータ・フォームの作成について説明します。コンテンツ・タスク・フローを介してフォームにパラメータを渡す方法の詳細は、第22章「タスク・フローのパラメータの使用」および23.3項「ADFリージョンのパラメータの指定」を参照してください。setPropertyListener
タグの使用方法の詳細は、30.3項「コマンド・コンポーネントを使用したパラメータ値の設定」を参照してください。
ExecuteWithParams
操作は、バインド変数を含むビュー・オブジェクトに基づくものやパラメータとともに名前付き問合せを含むJPAベースのBeanに基づくものなど、パラメータを含むデータ・コントロール・オブジェクトに対してのみ使用可能です。たとえば、Summit ADFサンプル・アプリケーションには、バインド変数TitleIdBind
を含む、EmpVO
ビュー・オブジェクトに基づくSalesPeople
と呼ばれるビュー・オブジェクト・インスタンスが含まれます。そのため、図28-12に示すように、SalesPeople
オブジェクトには、TitleIdBind
パラメータのサブノードとともにExecuteWithParams
操作が含まれます。
ビュー・オブジェクト・バインド変数およびJPAパラメータ付き問合せを使用すると、実行時にビュー・オブジェクトまたはビュー基準に属性値を組み込むことができます。ExecuteWithParams
操作により、パラメータとして渡された名前付きのバインド変数に新しい値を割り当てた後で、ビュー・オブジェクトの問合せを(再)実行することにより、データ・コレクションがリフレッシュされます。ビュー・オブジェクトのバインド変数の詳細は、5.10項「バインド変数の使用」を参照してください。JPA問合せの名前付きパラメータの詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のEJBデータ・コントロールの前提条件と考慮事項に関する項を参照してください。
パラメータを使用するフォームを作成するには、ADFパラメータ・フォームとしてページにコレクションのExecuteWithParams
操作をドロップし、ADFフォームとしてコレクション自体をドロップします。
始める前に:
パラメータ・フォームの作成について理解しておくと役立ちます。詳細は、28.7,項「フォームを作成するためのパラメータの使用」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
13.2項「アプリケーション・モジュールの作成と変更」の手順に従い、データ・モデルで必要なビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。
または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
5.10.2項「ビュー・オブジェクト定義にWHERE句のバインド変数を追加する方法」に従ってビュー基準の定義にバインド変数を追加します。
JPAベースのデータ・コントロールの場合、名前付きパラメータを指定するセッションBeanまたはサービス・ファサードに名前付き問合せを作成できます。詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のEJBデータ・コントロールの前提条件と考慮事項に関する項を参照してください。
26.3項「Webページの作成」の説明に従って、JSFページを作成します。
ExecuteWithParams操作に基づいたパラメータ・フォームを作成するには:
「データ・コントロール」パネルから、フォームを作成するコレクションのExecuteWithParams
操作をドラッグし、ポップアップ・メニューから「ADFパラメータ・フォーム」を選択します。
「フォームの作成」ダイアログで、ユーザーが問い合せることができるパラメータを選択し、「OK」をクリックします。
「データ・コントロール」パネルから、対応するコレクションをドラッグし、ユーザー入力に基づいて問合せ結果を表示したい表またはフォームのタイプとしてそれをドロップします。
注意: 選択リストをパラメータ・フォームに宣言的に組み込むこともできます。選択リストを作成するには、フォームにExecuteWithParams 操作の子であるパラメータ・ノードをドラッグします。次にExecuteWithParams 操作をドラッグして、それをボタンとしてドロップします。 |
ExecuteWithParams
操作をパラメータ・フォームとしてドロップすると、JDeveloperによって次の処理が行われます。
属性バインディングにバインドされているinputText
コンポーネントおよびExecuteWithParams
操作にバインドされているbutton
コンポーネントを使用して、JSFページにフォームのコードが挿入されます。
ページ定義ファイルに次のものを定義します。
変数にアクセスするために使用する属性の変数イテレータ(他のフォームに対して使用されるコレクションのイテレータとは異なります)。
データ値を保持するための各パラメータに対するvariableUsage
変数。これらの変数は、バインドされるビュー・オブジェクトの名前付きバインド変数からデフォルト値やUIコントロール・ヒントを継承します。変数はローカルであり、単一リクエスト中にのみ存続します。同じフォームに後続のポストバック間で運ばれるが、ユーザーが他のいくつかのページに移動する場合は無視されます(再度初期化されます)。
各パラメータのNamedData
要素を含む操作のアクション・バインディング。各NamedData
要素は、対応する変数にバインドされます。これらのバインディングにより、操作は、実行時にパラメータに対する値にアクセスできます。
関連付けられた属性の属性バインディング。
例28-11に、ページ上にSalesPeople
コレクションのExecuteWithParams
操作をドロップすることによって作成されるページ定義ファイルの内の実行可能ファイルおよびバインディングを示します。
例28-11 パラメータ・フォームの実行可能ファイルおよびバインディング・プロパティ
<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>
パラメータ・フォームの結果を表示するために使用されるコレクションをドロップする場合、28.3.2項「データ・コントロール・コレクションを使用したフォームの作成時の処理」で説明されるように、コードが基本フォーム用に生成されます。また、結果を表示する表を使用する場合、表のpartialTriggers
プロパティは、パラメータ・フォームのコマンド・ボタンに設定されます。
ユーザーが新規レコードの情報を入力し、そのレコードをデータ・ソースにコミットするためのフォームを作成できます。基本的な入力フォームの作成は、入力フォームにCreateInsert
操作も含まれるということを除いて、編集フォームの作成と同じであり、ユーザーがフォームを使用して移入できる行セットに空白行が挿入されます。
「データ・コントロール」パネルからページにコレクションおよび適切な操作をドラッグ・アンド・ドロップすることにより、単純な入力フォームを作成できます。ただし、ユーザー・ワークフローを制御し、他のフォームの処理ロジックを挿入するために、他の手法を選択する必要がある場合があります。このような手法は次のとおりです。
ADFタスク・フローのパラメータを使用して、新しいレコードの指定された属性を事前移入する値を渡します。詳細は、第22章「ビュー・アクティビティへのパラメータ渡し」を参照してください。
21.7項「タスク・フロー・リターン・アクティビティの使用」の説明に従って、タスク・フロー・リターン・アクティビティを使用して、UIにトランザクション境界を設定します。
22.3,項「バインド・タスク・フローへのパラメータ渡し」の説明に従って、タスク・フロー・メソッド・コールで操作を埋め込みます。
30.4項「宣言メソッドのオーバーライド」の説明に従って、マネージドBeanを使用して、いくつかの操作を実行します。
第23章「タスク・フローのリージョンとしての使用」の説明に従って、フォームをタスク・フローのリージョンに組み入れます。
24.9項「バインド・タスク・フローでのトレイン・コンポーネントの使用」の説明に従ってフォームをマルチステップ・フローに組み入れます。
25.2項「モーダル・ダイアログ内でのバインド・タスク・フローの実行」の説明に従って、ダイアログ内にフォームを配置します。
24.3項「タスク・フローのトランザクションの管理」の説明に従って、セーブポイントを使用します。
次のセクションでは、基本的な入力フォームの作成方法について説明し、またいくつかのバリアントに関する情報を提供します。
基本的な入力フォームの作成には、編集フォームの作成および新規レコードを作成するためのコマンド・コンポーネントの追加が含まれます。
始める前に:
入力フォームについて理解しておくと役立ちます。詳細は、28.8項「入力フォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
入力フォームの作成方法:
「データ・コントロール」パネルで、フォームがベースとするコレクション・オブジェクトのノードを開きます。
コレクションの「操作」ノードを開き、CreateInsert
操作を編集フォームにドラッグします。
注意: CreateInsert 操作はADFビジネス・コンポーネント・アプリケーション・モジュールに基づいたデータ・コントロールでのみ使用可能です。データ・コントロールが別のビジネス・サービスに基づく場合は、かわりにCreate 操作を使用します。2つの間の相違の詳細は、表28-2を参照してください。 |
入力フォームのワークフローを提供するタスク・フローを使用できます。コマンド・コンポーネントを使用して新規オブジェクトを作成するのではなく、タスク・フロー内でメソッド・コール・アクティビティを使用するか、マネージドBeanのメソッドを使用します。コマンド・コンポーネントを使用して変更をコミットするのではなく、タスク・フロー・リターン・アクティビティを使用します。
たとえば、タスク・フローのメソッド・コール・アクティビティを使用して、データ・コントロール・オブジェクトのCreateInsert
操作をコールして、ユーザーがデータを入力可能なフォームを表示するビュー・アクティビティにコントロールを渡すことができます。
バインド・タスク・フロー内で入力フォームを作成するには:
20.2項「タスク・フローの作成」の説明に従って、バインド・タスク・フローを作成します。
「プロパティ」ウィンドウの「トランザクション」プロパティを「常に新規トランザクションを開始」に設定します。
詳細は、24.3項「タスク・フローのトランザクションの管理」を参照してください。
バインド・タスク・フローで、メソッド・コール・アクティビティを追加します。
詳細は、21.5項「メソッド・コール・アクティビティの使用」を参照してください。
「データ・コントロール」パネルから、フォームを作成しているコレクションに関連付けられているCreateInsert
操作をドラッグし、それをメソッド・アクティビティにドロップします。
メソッド・コール・アクティビティを選択したままにして、「プロパティ」ウィンドウで、fixed-outcome
プロパティの文字列を入力します。CreateInsert
操作をメソッド・コール・アクティビティにドロップした後で、この値はCreateInsert
に設定されますが、さらに具体的なものに変更できます。
タスク・フローの概要エディタで、入力フォームのページを表すビュー・アクティビティを追加します。ビュー・アクティビティの追加の詳細は、20.3項「タスク・フローへのアクティビティの追加」を参照してください。
制御フロー・ケースをメソッド・アクティビティからビュー・アクティビティに追加します。
設計エディタでコントロール・フロー・ケースを選択した状態にして、「プロパティ」ウィンドウで、制御フロー・ケースのfrom-outcome
プロパティが手順5
で設定したメソッド・アクティビティのfixed-outcomeプロパティの値と同じであることを確認します。
設計エディタでビュー・アクティビティのページを開き、「データ・コントロール」パネルから、新しいレコードの作成にフォームを使用するコレクションをドラッグし、ポップアップ・メニューから「ADFフォーム」を選択します。
タスク・フローに、リターン・アクティビティを追加します。このリターン・アクティビティでは、データ・コントロールに対してcommit
操作を実行する必要があります。これらの手順については、21.7項「タスク・フロー・リターン・アクティビティの使用」を参照してください。
通常、Commit
操作をコールするには、リターン・アクティビティを使用する必要があります。ただし、タスク・フローに複数のデータ・コントロールによって管理されるデータが含まれる場合や、フローの終了前にデータをコミットする必要がある場合など、Commit
操作にコマンド・コンポーネントを使用する必要がある場合があります。
フォーム内に「コミット」ボタンを持つ入力フォームを作成するには:
28.8.1.1項「バインド・タスク・フローを使用した入力フォームの作成」の説明に従って、入力フォームを作成します。
「データ・コントロール」パネルで、入力フォームに関連付けられたコレクションを含むデータ・コントロールのCommit
操作をドラッグし、コマンド・ボタンとしてドロップします。
構造ウィンドウで、commit
操作のコマンド・ボタンを選択します。
「プロパティ」ウィンドウで、メソッド・アクティビティに戻る結果文字列にaction
を設定します。同じoutcome値を使用して、ページからアクティビティに戻る制御フロー・ケースを追加する必要があります。
コマンド・ボタンのdisabled
プロパティをfalse
に設定します。
デフォルトでは、ボタンのdisabled
属性がバインディングのenabled
プロパティにバインドされ、その結果、enabled
プロパティがfalse
に設定された場合にボタンが無効になります。このバインディングでは、enabled
プロパティは更新がポストされるまでfalse
です。変更がポストされるには、その前にユーザーが新しいオブジェクトを作成する必要があるため、入力フォームの目的上、ボタンは常に有効にする必要があります。
データベースにコミットする前に、ユーザーが複数のエントリを作成できるようにする場合、次のようにします。
単一トランザクションでの複数エントリを許可する入力フォームを有効にするには:
28.8.1.1項「バインド・タスク・フローを使用した入力フォームの作成」の説明に従って、入力フォームを作成します。
タスク・フローで、ビュー・アクティビティからメソッド・アクティビティに戻る別の制御フロー・ケースを追加し、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
操作はありません。
かわりに、カスタム・メソッドを使用して、データベースに保存する必要があります。詳細は、28.6.3項「ステートレス・ビジネス・サービスのデータ・コントロールに関する必知事項」を参照してください。
ページ内で直接各コンポーネントにタグを提供する静的データバインド・フォームを作成するかわりに、動的コンポーネントを使用して、バインディング・メタデータおよびバインド・コンテンツを表示するために使用されるコンポーネントが実行時に決定されるフォームを作成できます。
この項では、データバインドされた動的フォームの作成について説明します。動的コンポーネントを使用して、データバインドされた表を作成することもできます。詳細は、29.6項「動的コンポーネントを使用した表の作成」を参照してください。
動的フォーム・コンポーネントの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の実行時のコンポーネントの決定に関する項を参照してください。
ADF Facesでは、バインディング・メタデータおよびバインド・コンテンツを表示するために使用されるタグが実行時に決定される、モデルドリブン・フォームおよび表の作成に使用可能なdynamicComponent
タグが提供されます。
バインディングのこの動的作成では、次の機能が提供されます。
表示されるフィールドおよびこれらのフィールドを表示するために使用されるADF Facesをデータ・モデルによって決定するページを作成できます。追加列や変更されたUIヒントなどのデータ・モデルへの変更は、ページを再設計する必要なしに、ページに反映されます。ビュー・オブジェクトのUIヒントの詳細は、5.13項「ビュー・オブジェクトのUIヒントの定義」を参照してください。
多相ビュー・オブジェクトに基づいてページを作成できます。これらのビュー・オブジェクトでは、指定されたレコードに対して使用可能なフィールドがレコードのベース・エンティティ・オブジェクトによって異なる場合があります。表示するフィールドは実行時に決定されるため、特定のレコードに適用されない可能性のあるページにこれらのフィールドを含めたり、指定されたレコードに対して表示されるフィールドを調整するためにビュー・レイヤーでコーディングを行う必要はありません。複数の行タイプを処理するビジネス・コンポーネントの構築の詳細は、第7章「多相ビュー・オブジェクトの定義」を参照してください。
コントロールをページにドロップする際に「フォームの作成」または「表の作成」ダイアログで情報を構成するのではなく、ビュー・オブジェクトのUIヒントを使用して表示情報を設定します。その結果、データの表示方法を変更する場合に、ビュー・オブジェクトで表示方法を変更するだけで、そのビュー・オブジェクトにバインドされているすべての動的コンポーネントの表示はそれに従って変更されます。
図28-13は、CustomerVO
ビュー・オブジェクトで属性に対するUIヒントを設定し、動的フォームとしてCustomers
データ・コントロール・コレクションをドロップすることにより設計された実行時の動的フォームを示しています。設定されたUIヒントにはLABEL
およびDISPLAYHINT
があります(後者は、動的フォームに指定された属性を含めないようにHide
に設定できます)。
次の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フォームとして「データ・コントロール」パネルからドロップして、フィールドが動的に生成されるように指定します。
始める前に:
動的フォームについて理解しておくと役立ちます。詳細は、28.9項「動的コンポーネントを使用したフォームの作成」を参照してください。
様々な属性を含むレコードの表示に動的フォームを利用する場合は、最初にその機能を含むデータ・オブジェクトが必要です。この機能を含むビュー・オブジェクトの作成の詳細は、第7章「多相ビュー・オブジェクトの定義」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
13.2項「アプリケーション・モジュールの作成と変更」で説明する手順に従って、データ・モデルに含めたいビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別の種類のビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項を参照してください。
26.3項「Webページの作成」の説明に従って、JSFページを作成します。
動的フォームを作成するには:
動的フォームを作成しているコレクションに対応するビュー・オブジェクトまたはデータ・コントロール構造にUIヒントを設定します。
UIヒントにより、属性、ラベル、ツールチップ、フィールドを自動的に送信する必要があるかどうかなどを表示するために使用するUIコンポーネントのタイプなどが決定されます。UIヒントの作成手順は、5.13項「ビュー・オブジェクトのUIヒントの定義」を参照してください。
必要に応じて、各ビュー・オブジェクト属性のCategory
ヒントに対して、カテゴリを指定するか、「新規カテゴリ」アイコンをクリックして、新規カテゴリを作成します。
同じカテゴリを持つ属性は、そのビュー・オブジェクトに基づいて作成する動的フォームでまとめることができます。
必要に応じて、手順2で作成したカテゴリに対して、カテゴリのラベルおよびツールチップ用にUIヒントを設定します。これらはビュー・オブジェクトの概要エディタの「UIカテゴリ」タブで設定できます。
「データ・コントロール」パネルから、ビュー・オブジェクトを表すコレクションを選択します。
コレクションをページにドラッグし、ポップアップ・メニューから「ADFフォーム」を選択します。
「フォームの作成」ダイアログで、「実行時に生成されるフィールド」チェック・ボックスを選択します。
手順2で属性のカテゴリを指定した場合は、これらのカテゴリに従ってフォームで属性をグループ化するために「フィールド・グループを含める」チェック・ボックスを選択します。
コレクションをページに動的フォームとしてドロップする場合、次の処理が発生します。
ページ定義はvariableIterator
バインディング、イテレータへのiterator
バインディングおよびtree
値バインディングで移入されます。
JSFページは1つ以上のiterator
およびdynamicComponent
タグで移入されます。また、「フィールド・グループを含める」オプションが選択されている場合は、switcher
およびgroup
タグが追加されます。
動的フォームのページ定義ファイルには次の実行可能ファイルおよびバインディングが含まれます。
variableIterator: バインディング・コンテナに対して宣言された変数を格納する内部イテレータ。
iterator: コレクションに対するイテレータ・バインディング。イテレータ・バインディングの詳細は、28.2.2.1項「ページ定義ファイルに作成されるイテレータ・バインディング」を参照してください。
tree: コレクションの属性に対する値バインディング。設計時に各属性に対する個々の値バインディングがある標準フォームとは異なり、動的フォームは、実行時に公開される属性値を含むように単一ツリー値バインディングを使用します。
また、ツリー値バインディングは、データバインドされた表(標準および動的の両方)にも使用されます。詳細は、29.2.2.1項「表のイテレータと値バインディング」を参照してください。
例28-12は、Customers
コレクションに基づく動的フォーム・コンポーネントを含むページのバインディングを示しています。
例28-12 動的コンポーネントのページ定義コード
<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
タグを使用してページ上の各属性に対する適切なコンポーネントをレンダリングします。
例28-13は、動的フォームとしてCustomers
データ・コントロール・オブジェクトをドロップした(「フィールド・グループを含める」オプションは選択していない)場合に生成されるコードを示しています。
例28-13 動的フォームのJSFページ・コード
<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
も参照します。
「フォームの作成」ダイアログの「フィールド・グループを含める」を選択している場合は、28.9.3.2項「グループ化しないで動的フォームに対して作成されるタグ」
で説明されるタグのほか、生成されたJSFページにはswitcher
とgroupタグが含まれます。
switcher
タグには、iterator
タグ内で直接ネストされます。switcher
タグ内には、GROUP
およびATTRIBUTE
という名前のネストされたfacet
タグがあります。GROUP
ファセットにはgroup
タグが含まれ、その内部に、グループ名とiterator
タグを表示するoutputText
タグがあり、それにはdynamicComponent
タグが含まれます。ATTRIBUTE
ファセットにはdynamicComponent
タグのみが含まれます。
高レベルのiterator
が反復する各属性の場合、切替え機能により、グループまたは列をレンダリングするかどうかが動的に決定されます。グループをレンダリングする場合、グループ内のイテレータはそのグループ内の属性のコンポーネントをレンダリングするために使用されます。
例28-14は、Customers
コレクションに基づいた動的フォームを作成し、フィールド・グループを含むように選択した場合に生成されるコードを示したものです。
例28-14 属性グループを使用した動的フォームのJSFページ・コード
<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
属性を使用してバリデータおよびコンバータが適用される属性を決定できます。
始める前に:
動的フォームについて理解しておくと役立ちます。詳細は、28.9項「動的コンポーネントを使用したフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
ADF Facesバリデータまたはコンバータを動的フォームに手動で挿入するには:
ソース・エディタで動的コンポーネントを含むページを開きます。
<af:dynamicComponent>
タグ内に、使用するバリデータ・コンポーネントとコンバータ・コンポーネントを挿入します。
各バリデータおよびコンバータ・タグ内で、disabled
属性を挿入し、適用するものを除いてすべての属性のタグを無効にするEL式にそれをバインドします。
たとえば、次の式では、Hiredate
属性に対してのみバリデータを有効にします。
#{attr.name == 'Hiredate' ? false : true}
例28-15に、2つのバリデータおよび2つのコンバータが適用されている動的コンポーネントを示します。
例28-15 動的コンポーネントに適用されるバリデータおよびコンバータ
<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>
動的フォームを作成する場合は、基本的に、動的にレンダリングされるコンポーネントのブロックを作成します。そのコンポーネント・ブロックの前後に静的コンポーネントを配置できますが、そのブロック内に静的コンポーネントを分散させることはできません。
例28-16は、可能な静的コンポーネントと動的コンポーネントの混在の粒度を示しています。3つのgroup
タグから構成されます。その最初と3番目には静的コンテンツが含まれ、その2番目にはネストされたdynamicComponent
タグとともにiterator
タグが含まれます。
例28-16 静的コンテンツと動的コンテンツの混在
<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メソッドにバインドできます。
始める前に:
動的フォームについて理解しておくと役立ちます。詳細は、28.9項「動的コンポーネントを使用したフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
動的コンポーネントの動作をプログラム的に設定するには:
動的コンポーネントを含むUIプロジェクトで、oracle.adf.view.rich.model.BaseAttributeDescriptor
クラスを拡張するJavaクラスを作成します。
例28-17に、Sal
属性のラベルにカスタム・スタイルを適用するメソッドを追加するサンプル・クラスを示します。
例28-17 BaseAttributeDescriptorのカスタムの実装
public class CustomizedDescriptor extends BaseAttributeDescriptor { public CustomizedDescriptor(BaseAttributeDescriptor base) { _base = base; } public Object getLabelStyle() { if (getName().equals("Sal")) return "color:red; font-weight:bold"; else return null; }
ページのマネージドBeanを作成します。詳細は、26.4項「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。
マネージドBeanで、手順1で作成したカスタム・ディスクリプタのインスタンスを戻すメソッドを作成します。例28-18に、このようなメソッドを示します。
例28-18 カスタム属性ディスクリプタを戻すマネージドBeanメソッド
public CustomizedDescriptor getCustomizedAttributes(String attrName) { // create value expression for "#{attrName}" and evaluate it to get object // of "attr" BaseAttributeDescriptor attrMetadata = null; Class klass = null; try { klass = ClassLoaderUtils.loadClass("oracle.adf.view.rich.model.BaseAttributeDescriptor"); } catch (ClassNotFoundException e) { throw new RuntimeException("Can not find class oracle.adf.view.rich.model.BaseAttributeDescriptor"); } FacesContext facesContext = FacesContext.getCurrentInstance(); ELContext elContext = facesContext.getELContext(); ValueExpression valueExpression = createValueExpression(attrName, klass); if (valueExpression != null) attrMetadata = (BaseAttributeDescriptor)valueExpression.getValue(elContext); return new CustomizedDescriptor(attrMetadata); }
動的コンポーネントを含むページのソース・エディタで、動的コンポーネントのattributeModel
プロパティをカスタマイズされた属性ディスクリプタを戻すマネージドBeanメソッドにバインドします。
例28-19は、attributeModel
属性がattributeCustomBean
マネージドBeanのgetCustomizedAttributes
メソッドを参照するEL式に設定されるdynamicComponent
タグを示しています。
例28-19 マネージドBeanにバインドされたattributeModel属性
<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="#{attributeCustomBean.getCustomizedAttributes
('attr')}" />
</af:iterator>
</af:panelFormLayout>
ユーザー・アクションに基づいて変更を行うために、動的コンポーネント・インスタンスにプログラム的にアクセスする必要がある場合は、マネージドBeanを使用して行うことができます。
始める前に:
動的フォームについて理解しておくと役立ちます。詳細は、28.9項「動的コンポーネントを使用したフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
動的コンポーネントのバインディング・インスタンスにプログラム的に設定するには:
動的コンポーネントを識別するマネージドBeanメソッドを作成して、RichDynamicComponent
にコンポーネントをキャストし、変更を適用します。
詳細は、26.4項「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。
動的コンポーネントを含むページでは、コマンド・コンポーネントをページに追加して、そのactionListener
プロパティをマネージドBeanメソッドにパインドします。
例28-20に、動的コンポーネントのラベル・スタイルを変更するマネージドBeanメソッドを示します。
例28-20 動的コンポーネントのバインディング・インスタンスにアクセスするマネージド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を使用してこれを行うことができます。
始める前に:
動的フォームについて理解しておくと役立ちます。詳細は、28.9項「動的コンポーネントを使用したフォームの作成」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
動的コンポーネントのバインディング・インスタンスにプログラム的にアクセスするには:
FacesContext
を使用してバインディング・コンテナにアクセスするマネージドBeanメソッドを作成して、AttributesModel
を取得し、必要なビジネス・ロジックを適用します。
詳細は、26.4項「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。
動的コンポーネントを含むページでは、コマンド・コンポーネントをページに追加して、そのactionListener
プロパティをマネージドBeanメソッドにパインドします。
例28-21に、現在行のDeptNo
の値を9999に設定するマネージドBeanメソッドを示します。
例28-21 動的コンポーネントのバインディング・コンテキストにアクセスするマネージド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コンポーネントでの作業について理解しておくと役立ちます。詳細は、28.10項「フォーム上のUIコンポーネントおよびバインディングの変更」を参照してください。
また、その他のADF機能について理解しておくと役立ちます。詳細は、28.1.2項「データバインド・ページの追加機能」を参照してください。
次のタスクを完了する必要があります。
13.2項「アプリケーション・モジュールの作成と変更」で説明する手順に従って、データ・モデルに含めたいビュー・オブジェクトのインスタンスを含むアプリケーション・モジュールを作成します。または、別の種類のビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項を参照してください。
26.3項「Webページの作成」の説明に従って、JSFページを作成します。
デフォルト・コンポーネントおよびバインディングを変更するには:
構造ウィンドウを使用して、次の処理を行います。
UIコンポーネントをツリー内で上下にドラッグして、順序を変更します。黒線の矢印は、UIコンポーネントの配置先を示します。
UIコンポーネントの追加。「構造」ウィンドウで既存のUIコンポーネントを右クリックし、新規コンポーネントの配置場所として、選択したコンポーネントの前、後ろ、内部のいずれかを選択します。その後、リストからUIコンポーネントを選択します。
UIコンポーネントのバインド。「構造」ウィンドウで既存のUIコンポーネントを右クリックし、「ADFコントロールにバインド」を選択します。その後、コンポーネントをバインドするオブジェクトを選択できます。
UIコンポーネントの再バインド。「構造」ウィンドウで既存のUIコンポーネントを右クリックし、「別のADFコントロールに再バインド」を選択します。その後、コンポーネントをバインドする新しいコントロール・オブジェクトを選択できます。
UIコンポーネントの削除。コンポーネントを右クリックして、「削除」を選択します。コンポーネントを保持するが、バインディングを削除する場合は、「プロパティ」ウィンドウを使用する必要があります。手順2の2番目の箇条書きを参照してください。
「構造」ウィンドウで選択されたUIコンポーネントを使用して、「プロパティ」ウィンドウで次の操作を実行できます。
UIコンポーネントのADF以外のバインディングの追加。「値」フィールドにEL式を入力するか、ドロップダウン・メニューを使用して「編集」を選択します。
UIコンポーネントのバインディングの削除。EL式を削除します。
UIコンポーネントのラベルの変更。デフォルトでは、ラベルはバインディングのヒントのlabel
プロパティにバインドされます。このプロパティにより、エンティティ・オブジェクト属性またはビュー・オブジェクト属性に対して定義したラベルのUIコントロール・ヒントをページで使用できるようになります。UIヒントを使用すると、値の一度の変更で、ラベルを表示するすべてのページに同じ値を表示できます。
現在のページのラベルのみを変更できます。その場合は、label
属性を選択します。ラベル値を別のもの(たとえば、プロパティ・ファイルやリソース・ファイルのキー)にバインドするために、テキストまたはEL式を入力します。
たとえば、製品名の表示に使用するinputText
コンポーネントでは、Label
属性に対して次のようなコードが含まれます。
#{bindings.ProductName.hints.label}
この式を変更して、プロパティ・ファイルのキーにバインドすることもできます。次に例を示します。
#{properties['productName']}
この例のproperties
は、プロパティ・ファイルのロードに使用する、JSFページで定義された変数です。