Oracle® Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド 11gリリース2(11.1.2.3.0) B66160-03 |
|
![]() 前 |
![]() 次 |
この章では、「データ・コントロール」パネルでADF Facesコンポーネントを使用してデータバインドされたフォームを作成する方法について説明します。テキスト・フィールドを個々の属性から作成する方法、アクセッサによって返されるコレクションからフォーム全体を生成する方法、および既存レコードを編集したり新規レコードを作成するためのフォームを作成する方法についても説明します。
この章には、次の項が含まれます:
ビジネス・サービス用に作成されたデータ・コントロールを使用して情報の表示および収集を実行するための、UIページを作成できます。たとえば、「データ・コントロール」パネルを使用して、項目の属性をドラッグし、読取り専用テキストまたはラベル付き入力テキスト・フィールドとして、値を表示できます。関連データの表示および更新に必要なすべてのJSFタグとバインディング・コードがJDeveloperによって作成されます。「データ・コントロール」パネルおよび宣言的なバインディング機能の詳細は、第2章「Java EE WebアプリケーションでのADFモデル・データ・バインディングの使用」を参照してください。
JDeveloperでは、属性を個別にドロップするのではなく、オブジェクトのすべての属性をフォームとして一度にドロップできます。フォームを構成する実際のUIコンポーネントは、ドロップしたフォームのタイプによって異なります。値を表示するフォーム、ユーザーが値を編集できるフォームおよび値を収集するフォーム(入力フォーム)を作成できます。
たとえば、Summitデモ・アプリケーションは、図4-1に示すような、ユーザーが注文に関する情報を表示および編集できるページが含まれています。このフォームは、「データ・コントロール」パネルからSOrdList
アクセッサ・コレクションをドラッグ・アンド・ドロップして作成されました。(SOrdList
ノードはcustomerFindAll
ノード内にネストされています。)
UIコンポーネントを作成すると、コレクション内のレコード間を移動できるようにしたり、ユーザーがデータを操作できるようにする組込み操作をコマンドUIコンポーネントとしてドロップできます。たとえば、フォームに表示されたデータ・オブジェクトをユーザーが削除できるようにするためのボタンを作成できます。また、必要に応じてデフォルトのコンポーネントを変更することもできます。
JDeveloperでは、テキスト・フィールドを宣言的に作成可能な、JSFページ用の完全なWYSIWYG開発環境が用意されているため、ページのほとんどの内容をコードを見ずに設計できます。「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップすると、属性バインディングを使用してADF FacesテキストUIコンポーネントがデータ・コントロールの属性に宣言的にバインドされます。
属性を表示または更新できるテキスト・フィールドを作成するには、「データ・コントロール」パネルからコレクションの属性をドラッグ・アンド・ドロップします。
始める前に:
データ・コントロールを使用したテキスト・フィールドの作成に関する一般的な知識があると役立ちます。詳細は、4.2項「属性を使用したテキスト・フィールドの作成方法」を参照してください。
次のタスクを完了する必要があります。
バインドされたテキスト・フィールドの作成手順:
「データ・コントロール」パネルから、コレクションの属性を選択します。属性およびその他のオブジェクトを表す「データ・コントロール」パネルのアイコンの説明は、表2-1を参照してください。
たとえば、図4-2は、Summitデモ・アプリケーションのOrdersSessionEJBLocal
データ・コントロールのcustomerFindAll
アクセッサ・コレクション下のaddress
属性を示しています。この属性は、住所の最初の部分を表示または入力する場合にドロップします。
ページに属性をドラッグし、ポップアップ・メニューから、属性値を表示または収集するウィジェットのタイプを選択します。各属性について、次の選択肢があります。
テキスト:
ラベル付ADF入力テキスト: ネストされたvalidator
コンポーネントを伴うADF Faces inputText
コンポーネントが作成されます。label
属性に値が移入されます。
ヒント:
|
ADF入力テキスト: ネストされたvalidator
コンポーネントを伴うADF Faces inputText
コンポーネントが作成されます。label
属性は移入されません。
ラベル付ADF出力テキスト: ADF Faces outputText
コンポーネントを保持するpanelLabelAndMessage
コンポーネントを作成します。panelLabelAndMessage
コンポーネントのlabel
属性が移入されます。
ADF出力テキスト: ADF Faces outputText
コンポーネントを作成します。ラベルは作成されません。
ラベル付ADF出力フォーマット済: 「ラベル付ADF出力テキスト」と同様ですが、outputText
コンポーネントのかわりにoutputFormatted
コンポーネントを使用します。outputFormatted
コンポーネントでは、制限された分量のHTML書式設定を追加できます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド 』の出力テキストおよびフォーマット済の出力テキストの表示に関する項を参照してください。
ADF出力フォーマット済: 「ラベル付ADF出力フォーマット済」と同様ですが、ラベルはありません。
ADFラベル: ADF Faces outputLabel
コンポーネント。
単一選択: 単一選択リストを作成します。JSFページでのリストの作成の詳細は、第7章「データバインドされた選択リストの作成」を参照してください。
この章の目的に合せて、ここではテキスト・コンポーネントのみ(リストは除く)について説明します。
JSFページに属性をドラッグしてUIコンポーネントとしてドロップすると、そのページのページ定義ファイル(すでに存在する場合を除く)などが作成されます。属性をページにドラッグした場合の詳細な説明は、第2.3.2項「「データ・コントロール」パネルを使用したUIコンポーネントの作成時の処理」を参照してください。イテレータと属性のバインディングが作成されてページ定義ファイルに追加されます。また、UIコンポーネントに必要なJSPXページのコードがJSFページに追加されます。
「データ・コントロール」パネルからコレクションの一部である項目をドロップして(またはコレクション全体をフォームまたは表としてドロップして)ページ上にUIコンポーネントを作成するたびに、イテレータ・バインディングが自動的に作成されます(すでに存在する場合を除く)。イテレータ・バインディングは、データ・コレクションのイテレータを参照し、この機能によりそのデータ・オブジェクトを反復処理します。また、コレクション内のデータ・オブジェクトの現在行および状態を管理します。イテレータ・バインディングは実際にはデータにアクセスしません。かわりに、データにアクセスできるオブジェクトを単純に公開し、コレクション内の現在のデータ・オブジェクトを指定します。その後、現在のオブジェクトのデータを戻したり、オブジェクトのデータに対してアクションを実行するために、他のバインディングがこのイテレータ・バインディングを参照します。イテレータ・バインディングはイテレータではないことに注意してください。これはイテレータへのバインディングです。
たとえば、customerFindAll
コレクションからaddress
属性をドロップすると、JDeveloperによって、OrdersSessionEJBLocal
データ・コントロールに対するイテレータ・バインディングとcustomerFindAll
コレクションに対するaccessorIterator
バインディングが作成され、OrdersSessionEJBLocal
イテレータがマスター・バインディングになります。
ヒント: アクセッサから返されるコレクションごとにアクセッサ・イテレータ・バインディングが1つ作成されます。つまり、同じアクセッサから2つの属性を個別にドロップした場合(もしくは同じ属性を2回ドロップした場合)は、同じバインディングが使用されます。コンポーネントごとに動作の異なるバインディングが必要な場合を除き、同じバインディングが使用されても問題はありません。その場合は、別個のイテレータ・バインディングを手動で作成する必要があります。 |
イテレータ・バインディングのrangeSize
属性は、イテレータ・バインディングへのアクセスが行われるたびにデータ・コントロールからフェッチされるデータ行数を決定します。この属性により、行セット全体の中でいくつかの絶対開始位置に対して1-n行の相対セットが置かれます。デフォルトでは、属性は25
に設定されています。
例4-1に、customerFindAll
アクセッサ・コレクションから属性をドロップすると作成されるイテレータ・バインディングを示します。
例4-1 イテレータ・アクセッサ・バインディングのページ定義コード
<executables> <variableIterator id="variables"/> <iterator Binds="root" RangeSize="25" DataControl="OrdersSessionEJBLocal" id="OrdersSessionEJBLocalIterator"/> <accessorIterator MasterBinding="OrdersSessionEJBLocalIterator" Binds="customerFindAll" RangeSize="25" DataControl="OrdersSessionEJBLocal" BeanClass="model.Customer" id="customerFindAllIterator"/> </executables>
このメタデータにより、ADFバインディング・コンテナは属性値にアクセスできます。イテレータ・バインディングは実行可能ファイルで、デフォルトではページのロード時に起動されるため、これによってイテレータがcustomerFindAll
アクセッサによって返されるコレクションにアクセスし、反復処理を実行できます。つまり、イテレータによって、コレクション内のすべてのオブジェクトの管理(コレクション内の現在の行の決定や住所オブジェクトのレンジの決定など)が行われるということです。
「データ・コントロール」パネルから属性をドロップすると、UIコンポーネントを属性の値にバインドするための属性バインディングが作成されます。このタイプのバインディングは、コレクション内の現在行のシングル・オブジェクトに対する属性の値を提示します。値バインディングは、属性値の表示と収集の両方に使用できます。
たとえば、customerFindAll
アクセッサの下にあるaddress
属性を「ラベル付ADF出力テキスト」ウィジェットとしてページにドロップすると、JDeveloperによって、address
属性の属性バインディングが作成されます。これにより、バインディングが現在のレコードの属性値にアクセスできるようになります。例4-2は、customerFindAll
アクセッサから属性をドロップした場合に作成されるaddress
の属性バインディングを示しています。この属性値は、customerFindAllIterator
という名前のイテレータを参照します。
例4-2 属性バインディングのページ定義コード
<bindings> <attributeValues IterBinding="customerFindAllIterator" id="address"> <AttrNames> <Item Value="address"/> </AttrNames> </attributeValues </bindings>
属性バインディング要素のプロパティの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のOracle ADFバインディング・プロパティに関する付録を参照してください。
「データ・コントロール」パネルから属性をドロップしてテキスト・フィールドを作成すると、対応するタグがJSFページに記述され、ドロップしたウィジェットに関連付けられているUIコンポーネントが作成されます。
たとえば、address
属性を「ラベル付出力テキスト」ウィジェットとしてドロップすると、JDeveloperによってpanelLabelAndMessage
コンポーネントとoutputText
コンポーネントのタグが挿入されます。また、panelLabelAndMessage
コンポーネントのlabel
属性を、address
のバインディングのために作成されたヒントのlabel
プロパティにバインドするEL式が作成されます。この式は、Beanのデータ・コントロールで設定されているラベルのUIヒントとして評価されます。また、現在の行のaddress
属性の値に評価される、outputText
コンポーネントのvalue
属性をaddress
バインディングのinputValue
プロパティにバインドする、別の式が作成されます。両方のコンポーネントに対してIDも自動的に生成されます。
ヒント: JDeveloperでは、すべてのADF FacesコンポーネントのIDが自動的に生成されます。これらの値を必要に応じてオーバーライドできます。 |
例4-3に、address
属性を「ラベル付出力テキスト」ウィジェットとしてドロップしたときにJSFページで生成されるコードを示します。
例4-3 「ラベル付き出力テキスト」としてドロップされた属性のJSFページ・コード
<af:panelLabelAndMessage label="#{bindings.address.hints.label}" id="plam1"> <af:outputText value="#{bindings.address.inputValue}" id="ot1"/> </af:panelLabelAndMessage>
かわりにaddress
属性を「ラベル付入力テキスト」ウィジェットとしてドロップすると、JDeveloperによってinputText
コンポーネントが作成されます。例4-4に示すように、出力テキスト・コンポーネントと同様、値はaddress
バインディングのinputValue
プロパティにバインドされます。また、次のプロパティも設定されます。
label
: 属性のlabel
UIヒントにバインドされます。
required
: mandatory
プロパティにバインドされ、これは属性のisNotNull
プロパティを参照します(これはBeanのデータ・コントロール構造ファイルの概要エディタで属性の「詳細」セクションの「必須」オプションとして表されます)。
columns
: 属性のdisplayWidth
UIヒントにバインドされます。テキスト・ボックスの幅を決定します。
maximumLength
: 属性の「精度」オプションにバインドされます。このプロパティは、フィールドに入力できる1行当たりの最大文字数を決定します。
shortDesc
: ツールチップのUIヒントにバインドされます。
さらに、JDeveloperはバリデータ・コンポーネントを追加します。
例4-4 「ラベル付入力テキスト」としてドロップされた属性のJSFページ・コード
<af:inputText value="#{bindings.address.inputValue}" label="#{bindings.address.hints.label}" required="#{bindings.address.hints.mandatory}" columns="#{bindings.address.hints.displayWidth}" maximumLength="#{bindings.address.hints.precision}"> shortDesc="#{bindings.address.hints.tooltip}" id="it1"> <f:validator binding="#{bindings.address.validator}"/> </af:inputText>
これらの値は必要に応じて変更できます。たとえば、データ・コントロールの属性のisNotNull
プロパティはデフォルトではfalse
に設定されています。つまり、コンポーネントのrequired
属性もfalse
と評価されるということです。コンポーネントのrequired
属性をtrue
に設定すると、この値を上書きできます。属性のすべてのインスタンスを必須にする場合、データ・コントロール構造ファイル内の「必須」オプションを変更することにより、すべてのインスタンスが必須となります。データ・コントロールの属性の編集方法の詳細は、3.3項「属性の使用」を参照してください。
コレクションの各属性を個別にドロップしてフォームを作成するかわりに、オブジェクトのすべての属性のデータを表示または収集する、完全なフォームを作成できます。たとえば、Summitデモ・アプリケーションで、EditOrder.jspx
ページのフォームは、「データ・コントロール」パネルからordFindAll
アクセッサ・コレクションをドロップして作成されています。
また、コレクションからデータを表示するだけでなく、多くの機能を提供するフォームの作成もできます。ユーザーがデータを更新できるフォームの作成に関する詳細は、4.6項「既存レコードを編集するフォームの作成」を参照してください。ユーザーがコレクションの新規オブジェクトを作成できるフォームの作成に関する詳細は、4.7項「入力フォームの作成」を参照してください。検索フォームを作成することもできます。詳細は、第8章「データバインドされた検索フォームの作成」を参照してください。
データ・コントロールを使用してフォームを作成するには、UIコンポーネントをデータ・コントロールの対応するオブジェクトの属性にバインドします。JDeveloperでは、返されるコレクションを「データ・コントロール」パネルからドラッグ・アンド・ドロップして、宣言的にこの処理を実行できます。
始める前に:
データ・コントロールからのフォームの作成に関する一般的な知識があると役立ちます。詳細は、4.3項「基本的なフォームの作成」を参照してください。
次のタスクを完了する必要があります。
基本的なフォームの作成手順:
「データ・コントロール」パネルから、表示するデータを返すコレクションを選択します。図4-3は、アクセッサによって返されるコレクションordFindAll
を示しています。
ページにコレクションをドラッグし、ポップアップ・メニューから、オブジェクトのデータの表示または収集に使用するフォームのタイプを選択します。選択できるフォームのタイプは次のとおりです。
ADFフォーム: 「フォーム・フィールドの編集」ダイアログが起動し、デフォルトですべての属性に対して1つのフィールドが作成されるのではなく、属性を個別に選択できます。また、各属性に使用するラベルおよびUIコンポーネントを選択できます。デフォルトでは、ADF inputText
コンポーネントはほとんどの属性で使用されます。inputText
コンポーネントごとにlabel
属性が移入されます。
日付である属性ではInputDate
コンポーネントが使用されます。さらに、属性にUIヒントが作成されている場合、または属性がリストとして構成されている場合、ヒントにより設定されたコンポーネントが使用されます。InputText
コンポーネントには、属性の検証を設定するためのバリデータ・タグが含まれます。属性が数値または日付の場合、コンバータも含まれます。
ヒント:
|
ADF読取り専用フォーム: 「ADFフォーム」と同じですが、読取り専用outputText
コンポーネントが使用されます。このフォームはデータの表示を目的としているため、validator
タグは追加されません(コンバータは含まれます)。タイプDate
の属性は、読取り専用フォームではoutputText
コンポーネントを使用します。すべてのコンポーネントはpanelLabelAndMessage
コンポーネント内に置かれます。このコンポーネントには、label
属性が移入されます。 panelLabelAndMessage
コンポーネントは、panelFormLayout
コンポーネント内に配置されます。
「フォーム・フィールドの編集」ダイアログで、フォームを構成します。
フォーム・フィールドを追加、削除および並替えできます。
ユーザーがコレクション内のすべてのデータ・オブジェクトに移動できるように、ナビゲーション・コントロールを含めることもできます。詳細は、4.4項「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。 また、フォームの送信に使用する「送信」ボタンを含めることもできます。このボタンにより、HTMLフォームを送信し、JSF/ADFページ・ライフサイクルの一環としてフォームのデータをバンディングに適用します。このダイアログの使用方法に関する追加のヘルプを表示するには、「ヘルプ」をクリックします。すべてのUIコンポーネントは、panelFormLayout
コンポーネントの中に配置されます。
ユーザーによるデータの更新が可能なフォームを作成する場合は、ここで、更新を実行するメソッドをドラッグ・アンド・ドロップする必要があります。詳細は、4.6項「既存レコードを編集するフォームの作成」を参照してください。
「データ・コントロール」パネルからオブジェクトをフォームとしてドロップすることは、単一の属性をドロップするのと同じ効果があります。ただし、複数の属性バインディングおよび関連するUIコンポーネントが作成される点が異なります。UIコンポーネントの属性(value
など)は、その属性のバインディング・オブジェクト(inputValue
など)のプロパティ、または対応するサービスで設定されるコントロール・ヒントの値にバインドされます。例4-5に、SOrdList
アクセッサ・コレクションをデフォルトADFフォームとしてドロップして注文の編集フォームを作成した場合にJSFページで生成されるコードの一部を示します。
注意: 関連付けられているデータ・コントロール構造ファイルで属性が非表示としてマークされている場合、対応するUIは作成されません。 |
例4-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:inputText> <af:inputDate value="#{bindings.dateOrdered.inputValue}" label="#{bindings.dateOrdered.hints.label}" required="#{bindings.dateOrdered.hints.mandatory}" columns="#{bindings.dateOrdered.hints.displayWidth}" shortDesc="#{bindings.dateOrdered.hints.tooltip}" id="id1"> <f:validator binding="#{bindings.dateOrdered.validator}"/> <af:convertDateTime pattern="#{bindings.dateOrdered.format}"/> </af:inputDate> <af:inputDate value="#{bindings.dateShipped.inputValue}" label="#{bindings.dateShipped.hints.label}" required="#{bindings.dateShipped.hints.mandatory}" columns="#{bindings.dateShipped.hints.displayWidth}" shortDesc="#{bindings.dateShipped.hints.tooltip}" id="id2"> <f:validator binding="#{bindings.dateShipped.validator}"/> <af:convertDateTime pattern="#{bindings.dateShipped.format}"/> </af:inputDate> <af:selectBooleanCheckbox value="#{bindings.orderFilled.inputValue}" label="#{bindings.orderFilled.label}" shortDesc="#{bindings.orderFilled.hints.tooltip}" id="sbc1"/> <af:selectOneChoice value="#{bindings.paymentType.inputValue}" label="#{bindings.paymentType.label}" required="#{bindings.paymentType.hints.mandatory}" shortDesc="#{bindings.paymentType.hints.tooltip}" id="soc2"> <f:selectItems value="#{bindings.paymentType.items}" id="si2"/> </af:selectOneChoice> . . . </af:panelFormLayout>
注意: バリデータ・タグとコンバータ・タグの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』の「入力の検証および変換」を参照してください。 |
ADFフォームを作成する際、ナビゲーション・コントロールの組込みを選択すると、データ・コントロールの既存のナビゲーション・ロジックにバインドされているADF Facesコマンド・コンポーネントが組み込まれます。この組込みロジックによって、ユーザーは、コレクション内のすべてのデータ・オブジェクトを移動できるようになります。たとえば、図4-4は、ordFindAll
アクセッサをドラッグし、ナビゲーションを使用するADFフォームとしてドロップした場合に作成されるフォームを示しています。
デフォルトでは、「データ・コントロール」パネルを使用してフォームを作成する際にナビゲーションの組込みを選択すると、「先頭へ」、「最後へ」、「前へ」および「次へ」の各ボタンが作成され、ユーザーがコレクション内を移動できるようになります。
また、既存のフォームにナビゲーション・ボタンを手動で追加できます。
始める前に:
ナビゲーション・コントロールの一般的な知識があると役立ちます。詳細は、4.4項「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。
次のタスクを完了する必要があります。
ナビゲーション・ボタンを手動で追加する場合の手順:
操作の実行対象となるオブジェクトのコレクションに関連付けられる操作を「データ・コントロール」パネルから選択し、JSFページ上にドラッグします。
たとえば、注文のコレクション内を移動できるようにする場合は、OrdFindAll
アクセッサに関連付ける「次へ」操作をドラッグします。図4-5に、OrdFindAll
アクセッサに関連付けられている操作を示します。
次に表示されるポップアップ・メニューから「ADFボタン」または「ADFリンク」を選択します。
ヒント: 「先頭へ」、「最後へ」、「前へ」および「次へ」のすべてのボタンを一度にドロップすることもできます。これを行うには、対応するコレクションをドラッグし、ポップアップ・メニューから「移動」→「ADFナビゲーション・ボタン」を選択します。 |
任意の操作をコマンド・コンポーネントとしてドロップすると、JDeveloperによって次の処理が行われます。
関連付けられている操作について、ページ定義ファイルでアクション・バインディングが定義されます。
コレクションに部分ページ・レンダリングを使用するように、イテレータ・バインディングが構成されます。
コマンド・コンポーネント用のコードがJSFページに挿入されます。
アクション・バインディングは、ビジネス・ロジックを実行します。たとえば、アクション・バインディング・オブジェクト上で組込みメソッドを起動できます。このような組込みメソッドは、イテレータやデータ・コントロール自体に対して作用し、「データ・コントロール」パネルに操作として表示されます。JDeveloperには、ユーザーによるコレクション内の前後のオブジェクトへの移動や最初または最後のオブジェクトへの移動を可能にするナビゲーション操作が用意されています。
アクション・バインディングがNext
またはPrevious
などのイテレータレベル・アクションにバインドされている場合、操作のアクション・バインディングには、値バインディングと同様にイテレータ・バインディングへの参照が含まれます。これらのタイプのアクションはイテレータによって実行されます。イテレータは現在のオブジェクトを判別するため、ナビゲーション・ボタンがクリックされたときに表示するオブジェクトが正しく判別されます。
アクション・バインディングはRequiresUpdateModel
プロパティを使用して、アクションを実行する前にモデルを更新する必要があるかどうかを判別します。ナビゲーション操作の場合、デフォルトではこのプロパティはtrue
に設定されています。つまり、ビュー・レイヤーでのすべての変更は、ナビゲーションを実行する前にモデルに移動する必要があります。例4-6に、ナビゲーション操作のアクション・バインディングを示します。
例4-6 操作アクション・バインディングのページ定義コード
<action IterBinding="ordFindAllIterator" id="First" RequiresUpdateModel="true" Action="first"/> <action IterBinding="ordFindAllIterator" id="Previous" RequiresUpdateModel="true" Action="previous"/> <action IterBinding="ordFindAllIterator" id="Next" RequiresUpdateModel="true" Action="next"/> <action IterBinding="ordFindAllIterator" id="Last" RequiresUpdateModel="true" Action="last"/>
イテレータ・バインディングにはrangeSize
属性が含まれ、バインディングではこの属性を使用して、反復ごとにページで使用できるようにするデータ・オブジェクト数が決定されます。この属性は、データソース内のオブジェクト数がきわめて多い場合に役立ちます。イテレータ・バインディングは、すべてのオブジェクトではなく、1つのセット番号のみを戻すため、他のバインディングでアクセスできるようになります。イテレータはレンジの最後に到達すると、次のセットにアクセスします。例4-7に、ordFindAll
イテレータのデフォルトのレンジ・サイズを示します。
例4-7 イテレータのRangeSize属性
<accessorIterator MasterBinding="OrdersSessionEJBLocalIterator"
Binds="ordFindAll" RangeSize="25"
DataControl="OrdersSessionEJBLocal" BeanClass="model.Ord"
id="ordFindAllIterator" ChangeEventPolicy="ppr"/>
注意: この |
デフォルトでは、rangeSize
属性は25
に設定されています。つまり、ユーザーは、25個のオブジェクトを表示でき、データソースにアクセスしなくても、このオブジェクト間を前後に移動できるということです。イテレータは、現在のオブジェクトを追跡します。ユーザーが新しいレンジを要求するボタンをクリックすると(たとえば、オブジェクト番号25で「次へ」ボタンをクリックすると)、関連付けられているメソッドがバインディング・オブジェクトによってイテレータに対して実行され、イテレータは別の25個のレコードのセットを取得します。その後、そのセットがバインディングによって使用されます。この設定は、必要に応じて変更できます。完全なレコード・セットを戻すには、-1
に設定します。
注意: 「データ・コントロール」パネルを使用してナビゲーション可能なフォームを作成する場合、関連するイテレータの |
表4-1に、データ・コントロールで提供される組込みナビゲーション操作と、操作の起動または操作にバインドされたイベントの実行の結果を示します。
表4-1 組込みナビゲーション操作
操作 | 関連付けられているイテレータ・バインディングによる起動時の処理 |
---|---|
先頭 |
現在のポインタを結果セットの先頭に移動します。 |
最後 |
現在のポインタを結果セットの最後に移動します。 |
前 |
現在のポインタを結果セットの前のオブジェクトに移動します。このオブジェクトが現在のレンジの外にある場合は、レンジ・サイズと同じオブジェクト数だけレンジが戻るようにスクロールされます。 |
次 |
現在のポインタを結果セットの次のオブジェクトに移動します。このオブジェクトが現在のレンジの外にある場合は、レンジ・サイズと同じオブジェクト数だけレンジが進むようにスクロールされます。 |
前のセット |
レンジ・サイズ属性と同じオブジェクト数だけ、レンジを戻すように移動します。 |
次のセット |
レンジ・サイズ属性と同じオブジェクト数だけ、レンジを進めるように移動します。 |
ナビゲーション操作を使用してコマンド・コンポーネントを作成すると、コマンド・コンポーネントはpanelGroupLayout
コンポーネント内に配置されます。JDeveloperにより、ナビゲーション・コマンド・ボタンのactionListener
属性を、指定された操作のアクション・バインディングのexecute
プロパティにバインドするEL式が作成されます。
実行時、アクション・バインディングは、コアのJUCtrlActionBinding
実装クラスを拡張するFacesCtrlActionBinding
クラスのインスタンスです。FacesCtrlActionBinding
クラスにより、次のメソッドが追加されます。
public void execute(ActionEvent event)
: actionListener
プロパティで参照されるメソッドです(例: #{bindings.First.execute}
)。
ユーザーがボタンをクリックすると、この式によって、イテレータに対してバインディングの操作が起動されます。たとえば、「先頭へ」コマンド・ボタンの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 Fusion Middleware Oracle Application Development Framework Fusion開発者ガイドのOracle ADFバインディング・プロパティに関する付録を参照してください。
例4-8に、ナビゲーション操作ボタンに対してJSFページで生成されたコードを示します。ボタンのpartialSubmit
属性の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』の部分ページ・レンダリングの宣言的な有効化に関する項を参照してください。
例4-8 ADF操作にバインドされているナビゲーション・ボタンのJSFコード
<f:facet name="footer"> <af:panelGroupLayout> <af:commandButton actionListener="#{bindings.First.execute}" text="First" disabled="#{!bindings.First.enabled}" partialSubmit="true" id="cb1"/> <af:commandButton actionListener="#{bindings.Previous.execute}" text="Previous" disabled="#{!bindings.Previous.enabled}" partialSubmit="true" id="cb2"/> <af:commandButton actionListener="#{bindings.Next.execute}" text="Next" disabled="#{!bindings.Next.enabled}" partialSubmit="true" id="cb3"/> <af:commandButton actionListener="#{bindings.Last.execute}" text="Last" disabled="#{!bindings.Last.enabled}" partialSubmit="true" id="cb4"/> </af:panelGroupLayoutr> </f:facet>
コンテンツを表示する前に、ページで情報を必要とする場合があります。このタイプのページの場合、パラメータをとるメソッドから返されるコレクションを使用してフォームを作成します。メソッドを実行するには、要求元のページがパラメータの値を指定する必要があります。
パラメータを必要とするフォームを作成する場合、返すレコードを決定するために、パラメータの値にアクセスできる必要があります。それらの値にアクセスするには、あるオブジェクトにパラメータ値を設定し、その後メソッドがそのオブジェクトにアクセスできるようなロジックを、別のページのコマンド・ボタンに追加します。
始める前に:
パラメータ・フォームの一般的な知識があると役立ちます。詳細は、4.5項「パラメータをとるメソッドを使用するフォームの作成」を参照してください。
次のタスクを完了する必要があります。
2.2.1項「ADFデータ・コントロールの作成方法」の説明に従って、セッションBeanのデータ・コントロールを作成します。
セッションBeanに、フォームでの表示に必要な項目を返すメソッドを作成するか指定します。たとえば、OrderSessionEJBBean.java
クラスにはmergeOrd(Ord)
メソッドが含まれています。
ヒント: データ・コントロールを生成した後にセッションBeanにサービス・メソッドを追加した場合、パネルに新しいメソッドを表示するために「データ・コントロール」パネルをリフレッシュする必要があります。パネルをリフレッシュするには、「リフレッシュ」アイコンをクリックします。 |
パラメータを使用するフォームまたは表を作成する手順:
「データ・コントロール」パネルから、パラメータをとるメソッドの戻りであるコレクションをドラッグし、任意のタイプのフォームとしてドロップします。
たとえば、注文の編集のためのボタンをクリックすると表示されるフォームを作成するには、図4-6に示すように、Ord
戻りをドラッグ・アンド・ドロップします。
「フォーム・フィールドの編集」ダイアログで、必要に応じてフォームを構成し、「OK」をクリックします。
このダイアログの使用に関するヘルプを表示するには、「ヘルプ」をクリックします。
メソッドがパラメータをとるため、「アクション・バインディングの編集」ダイアログが開き、パラメータの値を設定するよう求められます。
アクション・バインディング・エディタで「値」フィールドの参照(「...」)アイコンをクリックし、EL式ビルダーを開いて各パラメータの値を入力します。パラメータの値を表すノードを選択します。
このエディタでは、この値を使用して、メソッドが実行される際のパラメータを表すNamedData
要素が作成されます。メソッドの戻りであるコレクションをドロップしているため、このメソッドは(コマンド・ボタンにバインドされているメソッドとは異なり)、関連付けられているイテレータがページのロード時に実行される際に実行されます。パラメータ値は、ページがレンダリングされる前に設定される必要があります。つまり、NamedData
要素は、送信元ページの設定に関係なく、この値を取得する必要があるということです。
ヒント: 同じページからの入力に基づいて表示されるフォームを作成する場合、「ADFパラメータ・フォーム」を使用してアクション・バインディングを作成できます。まず、「データ・コントロール」パネルからメソッドをドラッグし、「ADFパラメータ・フォーム」としてドロップします。次にメソッド戻りをドラッグし、任意のタイプのフォームとしてドロップします。 |
パラメータをとるメソッドの戻りを使用してフォームを作成すると、JDeveloperによって次の処理が行われます。
メソッドに対するアクション・バインディング、メソッドの結果に対するメソッド・イテレータ・バインディング、オブジェクトの各属性に対する属性バインディング、表の場合は表バインディングが作成されます。メソッドが必要とする各パラメータのNamedData
要素の作成も行われます。
ADF Facesコンポーネントを使用するフォームのコードがJSFページに挿入されます。
例4-9では、mergeOrd(Ord)
メソッドのOrd
戻りをドロップした際に作成されるアクション・メソッド・バインディングを示しています。ここで、パラメータの値はSOrdListIterator
の現在の行のデータ・プロバイダに設定されています。
例4-9 メソッド戻りのメソッド・アクション・バインディング
<bindings> <methodAction id="mergeOrd" RequiresUpdateModel="true" Action="invokeMethod" MethodName="mergeOrd" IsViewObjectMethod="false" DataControl="OrdersSessionEJBLocal" InstanceName="Sdata.OrdersSessionEJBLocal.dataProvider ReturnName="data.OrdersSessionEJBLocal.methodResults.mergeOrd_ OrdersSessionEJBLocal_dataProvider_mergeOrd_result"> <NamedData NDName="productId" NDValue="#{bindings.SOrdListIterator.currentRow.dataProvider}" NDType="model.Ord"/> </methodAction> ... </bindings>
ユーザーがコマンド・ボタンをクリックすると実行されるメソッドとは異なり、フォームの作成に使用されるメソッドは、ページのロード時に実行されます。ページのデータを返すためにメソッドが実行される際、メソッドでNamedData
要素のEL式が評価され、その値がパラメータとして使用されます。このようにして正しいデータを返すことができます。メソッドが複数のパラメータをとる場合、各パラメータが順に評価され、メソッドにパラメータが設定されます。
たとえば、EditOrder
ページのロード時、SOrdListIterator
のcurrentRow.dataProvider
パラメータの値が取得され、mergeOrd(Ord)
メソッドで必要なパラメータの値として設定されます。メソッドが実行されると、パラメータの値に一致するレコードのみが返されます。メソッドの戻りをドロップしてフォームを作成したため、その戻りが表示される製品です。
1つのページでのアクションに対して、アプリケーション機能を判別するためのパラメータを設定する必要が生じる場合があります。たとえば、あるページに、パラメータ値がfalse
の場合にのみコンポーネントが表示される別のページに移動するコマンド・ボタンを作成できます。
ページ間でこのパラメータを渡す場合やパラメータ値のチェックに使用するメソッドを含める場合には、マネージドBeanを使用できます。コマンド・ボタン内にネストしている、type
プロパティがaction
に設定されているsetPropertyListener
コンポーネントを使用して、パラメータを設定します。メソッドを使用したパラメータの設定の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のコマンド・コンポーネントを使用したパラメータ値の設定に関する項を参照してください。
注意: タスク・フローを使用している場合、タスク・フローのパラメータ渡しメカニズムを使用できます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「タスク・フローのパラメータの使用」を参照してください。 |
ページまたはページ内のリージョンで、ページの別の場所または別のリージョンの情報を必要する場合があります(リージョンの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のタスク・フローのリージョンとしての使用に関する項を参照してください)。情報を取得するためにパラメータを渡すことは可能ですが、それはパラメータが既知であり、EL式でページにアクセスできる入力である場合のみ意味を持ちます。また、パラメータ値が変化した場合にタスク・フローを再起動する必要があるときに、パラメータは便利です。
ただし、複数のページ・フラグメントを持つタスク・フローがあり、ページ・フラグメントには、フロー内のあるページへの入力として使用できる様々な興味深い値が含まれているとします。パラメータを使用して値を渡す場合、タスク・フローはすべてのフラグメントの興味深い各値を結合するための出力パラメータを公開する必要があります。そのかわり、必要な情報を含む各フラグメントに対し、ページを送信すると発生するコンテキスト・イベントを定義できます。情報を必要とするページまたはフラグメントは、様々なイベントをサブスクライブし、イベントを介して情報を取得できます。
コンテキスト・イベントは、ページ定義ファイルを使用して作成および構成できます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のコンテキスト・イベントの使用に関する項を参照してください。
ユーザーが現在のデータを編集し、その変更をデータ・ソースにコミットするためのフォームを作成できます。これを行うには、コレクションに関連付けられたデータ・レコードを変更できるメソッドを使用して、コマンド・ボタンを作成します。たとえば、デフォルトのmergeOrd(Ord)
メソッドを使用して、ユーザーが注文を更新できるボタンを作成できます。
ページがバインドされたタスク・フローの一部でない場合、変更をコレクションにマージするには、コレクションに関連付けられたマージ・メソッドまたは永続化メソッドを使用する必要があります。この2つの違いの詳細は、第4.6.3項「マージ・メソッドと永続化メソッドとの違いについて」を参照してください。ページが、バインド・タスク・フロー内のトランザクションの一部である場合、commit
操作とrollback
操作を使用して、タスク・フロー・リターン・アクティビティのトランザクションを解決します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のタスク・フロー・リターン・アクティビティの使用に関する項を参照してください。
フォームでメソッドを使用するには、操作と同じ手順を実行します。
始める前に:
編集可能なフォームの一般的な知識があると役立ちます。詳細は、4.6項「既存レコードを編集するフォームの作成」を参照してください。
次のタスクを完了する必要があります。
2.2.1項「ADFデータ・コントロールの作成方法」の説明に従って、セッションBeanのデータ・コントロールを作成します。
セッションBeanに、フォームでの表示に必要な項目を返すメソッドを作成するか指定します。たとえば、OrderSessionEJBBean.java
クラスにはmergeOrd(Ord)
メソッドが含まれています。
編集フォームの作成方法:
「データ・コントロール」パネルから、フォームを作成するコレクションをドラッグし、ポップアップ・メニューから「ADFフォーム」を選択します。
これにより、inputText
コンポーネントを使用し、フィールドのデータを編集可能なフォームが作成されます。
操作の実行対象となるオブジェクトのコレクションに関連付けられるマージ・メソッドを「データ・コントロール」パネルから選択し、JSFページ上にドラッグします。
たとえば、注文のレコードを更新できるようにし、そのインスタンスを再度使用しない場合、mergeOrd(Ord)
メソッドをドラッグします。
次に表示されるポップアップ・メニューから「ADFボタン」または「ADFリンク」を選択します。
「アクション・バインディングの編集」ダイアログで、メソッドのパラメータに値を移入する必要があります。マージ・メソッド(およびその他のデフォルト・メソッド)の場合、これが更新されるオブジェクトです。
「パラメータ」セクションで、「値」ドロップダウン・リストを使用して「EL式ビルダーの表示」を選択します。
式ビルダーで、アクセッサのイテレータのノードを展開して「currentRow」ノードを展開し、「dataProvider」を選択します。
これによって、アクセッサのイテレータで現在の行の値と評価されるEL式が作成されます。
「OK」をクリックします。
たとえば、ordFindAll
アクセッサ・コレクションを使用してフォームを作成した場合、JDeveloperによってordFindAllIterator
という名前のaccessorIterator
バインディングが作成されます。図4-7に示すように、そのイテレータの下の現在の行のdataProvider
を選択する必要があります。この参照は、パラメータ値が、現在フォームに表示されている行の値に解決されることを表します。
「アクション・バインディングの編集」ダイアログ・ボックスで、「OK」をクリックします。
注意: ページが、バインド・タスク・フロー内のトランザクションの一部の場合、マージ・メソッド(または他のデフォルト・メソッド)からボタンを作成するかわりに、タスク・フロー・リターン・アクティビティの作成時に、トランザクション解決の値としてそのメソッドを設定します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のタスク・フロー・リターン・アクティビティの使用に関する項を参照してください。 |
メソッドをコマンド・ボタンとしてドロップすると、JDeveloperによって次の処理が行われます。
メソッドのメソッド・バインディングが定義されます。メソッドがパラメータを取得する場合は、パラメータ値を保持するNamedData
要素が作成されます。NamedData
要素の詳細は、4.5.3項「実行時に行われる処理: メソッドのパラメータの設定」を参照してください。
ADF Facesコマンド・コンポーネント用のコードがJSFページに挿入されます。このコードは、他のあらゆるコマンド・ボタンのコードと類似しています。ただし、ボタンは、操作用のアクション・バインディングのexecute
メソッドではなく、ドロップしたメソッド用のアクション・バインディングのexecute
メソッドにバインドされます。
メソッドからボタンを作成する場合、組込み操作からボタンを作成する場合と同様に、JDeveloperによってメソッドに対する アクション・バインディングが作成されます。例4-10に、mergeOrd(Ord)
メソッドをドロップした場合に作成されるアクション・バインディングを示します。
例4-10 イテレータによって使用されるアクション・バインディングのページ定義コード
<bindings> <methodAction id="mergeOrd" RequiresUpdateModel="true" Action="invokeMethod" MethodName="mergeOrd" IsViewObjectMethod="false" DataControl="OrdersSessionEJBLocal" InstanceName="OrdersSessionEJBLocal.dataProvider" ReturnName="OrdersSessionEJBLocal.methodResults.mergeOrd_ OrdersSessionEJBLocal_dataProvider_persistOrd_result"> <NamedData NDName="ord" NDValue="#{bindings.ordFindAllIterator.currentRow.dataProvider}" NDType="model.Ord/> </methodAction> </bindings>
この例では、アクション・プロパティ値がinvokeMethod
であるため、バインディングがアクセスされると、メソッドが起動されます。
パラメータをとるメソッドをJSFページにドロップすると、JDeveloperによって各パラメータに対してNamedData
要素も作成されます。これらの要素は、メソッドのパラメータを表します。たとえば、mergeOrd(Ord)
メソッドのアクション・バインディングには、Ord
パラメータに対するNamedData
要素が含まれます。
ナビゲーション操作を使用してコマンド・ボタンを作成するときと同様に、メソッドを使用してコマンド・ボタンを作成すると、JDeveloperによってactionListener
属性を使用して、ボタンがメソッドにバインドされます。ボタンは、指定されたメソッドのアクション・バインディングのexecute
プロパティにバインドされます。このバインディングによって、バインディングのメソッドがビジネス・サービスで起動されます。actionListener
属性の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の実行時に行われる処理とアクション・イベントおよびアクション・リスナーの動作方法に関する項を参照してください。
ヒント: アクション・バインディングの |
ナビゲーション操作のように、ボタンのdisabled
プロパティは、EL式を使用してボタンを表示するかどうかを決定します。例4-11に、コマンド・ボタンのmergeOrd(Ord)
メソッドへのバインドに使用されるEL式を示します。
例4-11 コマンド・ボタンをメソッドにバインドするためのJSFコード
<af:commandButton actionListener="#{bindings.merge.Ord.execute}" text="mergeOrd" disabled="#{!bindings.mergeOrd.enabled}" id="cb1"/>
ヒント: UIコンポーネントをページにドロップすると、それより前にドロップされた同じタイプのコンポーネントの数に基づいて、JDeveloperによってIDが自動的に付けられます( |
セッションBeanを作成する際に、構造化オブジェクトのマージ・メソッドと永続化メソッドを公開するよう選択した場合、それらのメソッドが「データ・コントロール」パネルに表示され、ユーザーがオブジェクトの現在のインスタンスをマージしたり、永続化できるボタンの作成に使用できます。どちらを使用するかは、更新が行われた後でページとインスタンスとの対話が必要かどうかで決まります。インスタンスを使用し続ける必要がある場合、永続化メソッドを使用します。
マージ・メソッドは、JPA EntityManager.merge
メソッドの実装です。このメソッドは、現在のインスタンスを取得してコピーし、そのコピーをPersistenceContext
に渡します。その後、元のオブジェクトではなく、その永続化されたエンティティへの参照が返されます。つまり、それ以降そのインスタンスに行われる変更は、マージ・メソッドを再度コールしないかぎり永続化されないということです。
永続化メソッドは、JPA EntityManager.persist
メソッドの実装です。マージ・メソッド同様、このメソッドは、現在のインスタンスをPersistenceContext
に渡します。ただし、コンテキストによってそのインスタンスの管理が続けられるため、以降の更新はコンテキスト内のインスタンスに行われます。
操作またはメソッドをコマンド・ボタンとしてドロップすると、JDeveloperによって操作またはメソッドのexecuteメソッドにそのボタンがバインドされます。ただし、既存のロジックの前または後に、ロジックの追加が必要になる場合もあります。JDeveloperを使用すると、バインディング・コンテナにアクセスするマネージドBeanにメソッドおよびプロパティを新規作成することにより、宣言的操作にロジックを追加できます。デフォルトでは、この生成されたコードによって、操作またはメソッドが実行されます。その後、このコードの前か後にロジックを追加できます。元の操作またはメソッドのexecuteプロパティではなく、この新規メソッドにコマンド・コンポーネントが自動的にバインドされます。その後、ユーザーがボタンをクリックすると、新規メソッドが実行されます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の宣言メソッドの上書きに関する項を参照してください。
ユーザーが新規レコードの情報を入力し、そのレコードをデータソースにコミットするためのフォームを作成できます。入力フォームを含むページが表示される前に、Create
操作をコールするメソッド・アクティビティを含むタスク・フローを使用する必要があります。このメソッド・アクティビティによって空白行が行セットに挿入されます。その後、ユーザーはフォームを使用して空白行にデータを移入できます。
ヒント: タスク・フローの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFタスク・フローの作成に関するパートを参照してください。 |
たとえば、Address
Beanがある場合、ユーザーによる住所の作成が可能な新規フォームを作成できます。createAddress
メソッド・アクティビティを含むcreate-address-task-flow
タスク・フローを作成します。このメソッド・アクティビティは、AddressFindAll
アクセッサに対してCreate
操作をコールします。その後、制御がcreateAddress
ビュー・アクティビティに渡され、図4-8に示すような、ユーザーが新しい住所を入力できるフォームが表示されます。
注意: アプリケーションでタスク・フローを使用しない場合は、タスク・フローのメソッド・アクティビティと同様の方法で、コール元のページで |
バインド・タスク・フロー内に入力フォームを作成し、適切なトランザクションの処理が行われるようにします。
始める前に:
入力フォームの一般的な知識があると役立ちます。詳細は、4.7項「入力フォームの作成」を参照してください。
次のタスクを完了する必要があります。
2.2.1項「ADFデータ・コントロールの作成方法」の説明に従って、セッションBeanのデータ・コントロールを作成します。
フォームとCreate
操作を実行するメソッド・アクティビティの両方を含むバインド・タスク・フローを作成します。タスク・フローによって新規トランザクションが開始される必要があります。手順は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のタスク・フローの作成に関する項を参照してください。
入力フォームの作成手順:
バインド・タスク・フローにメソッド・アクティビティを追加します。このアクティビティに、フォームを作成するアクセッサに関連付けられているCreate
操作を実行させます。メソッド・アクティビティを使用する手順は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のメソッド・コール・アクティビティの使用に関する項を参照してください。
たとえば、ユーザーによる住所の作成が可能なフォームを作成する場合、メソッド・アクティビティに、AddressFindAll
アクセッサに関連付けられているCreate
操作を実行させます。
プロパティ・インスペクタで、fixed-outcomeプロパティに文字列を入力します。たとえば、fixed-outcome
値としてcreate
と入力します。
入力フォームのページを表すビュー・アクティビティを追加します。ビュー・アクティビティ追加の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のビュー・アクティビティの使用に関する項を参照してください。
制御フロー・ケースをメソッド・アクティビティからビュー・アクティビティに追加します。プロパティ・インスペクタで、手順2で設定したメソッド・アクティビティのfixed-outcomeプロパティの値を、制御フロー・ケースのfrom-outcome
の値として入力します。
設計エディタでビュー・アクティビティのページを開き、「データ・コントロール」パネルから、新しいレコードの作成にフォームを使用するコレクションをドラッグし、ポップアップ・メニューから「ADFフォーム」を選択します。
たとえば、住所を作成するフォームの場合、「データ・コントロール」パネルから、AddressFindAll
アクセッサ・コレクションをドラッグします。
ヒント: データベースにコミットする前に、ユーザーが複数のエントリを作成できるようにする場合、次のようにします。
|
タスク・フローに、リターン・アクティビティを追加します。このリターン・アクティビティでは、データ・コントロールに対してcommit
操作を実行する必要があります。この手順は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のタスク・フロー・リターン・アクティビティの使用に関する項を参照してください。
ヒント:
|
制御フロー・ケースをビュー・アクティビティからリターン・アクティビティに追加します。fixed-outcome
属性をテキスト文字列に設定します。たとえば、return
に設定します。
コンポーネント・パレットから、リターン・アクティビティの起動に使用されるボタンまたは他のコマンド・コンポーネントをドラッグ・アンド・ドロップします。action
属性を、手順4で作成したfixed-outcome
に設定されているテキスト文字列に設定します。
ADFフォームを使用して入力フォームを作成すると、JDeveloperによって次の処理が行われます。
メソッド・アクティビティのページ定義に、アクセッサのイテレータ・バインディングおよびCreate
操作のアクション・バインディングが作成されます。Create
操作は、行を行セットに作成し、データソースに入力されたデータを移入します。その他のフォームに関しては、ページのページ定義に、返されるコレクションのイテレータ・バインディングと、コレクション内のオブジェクトの各属性に対する属性バインディングが作成されます。
ADF Faces inputText
コンポーネント、および操作の場合はcommandButton
コンポーネントを使用して、JSFページにフォームのコードが挿入されます。
たとえば、図4-8に示すフォームは、メイン・ページの「Create Address」リンクをクリックすると表示されます。このリンクによって、新規住所のデータを入力できるフォームに移動します。住所を作成したら、「Save」ボタンをクリックすると、メイン・ページに戻ります。図4-9に、newAddress
メソッド・アクティビティを含むcreate-address-task-flow
タスク・フローを示します。
例4-12に、メソッド・アクティビティのページ定義ファイルのコードを示します。
例4-12 Creationメソッド・アクティビティのページ定義コード
<executables> <iterator Binds="root" RangeSize="25" DataControl="SupplierFacadeLocal" id="SupplierFacadeLocalIterator"/> <accessorIterator MasterBinding="SupplierFacadeLocalIterator" Binds="addresses" RangeSize="25" DataControl="SupplierFacadeLocal" BeanClass="oracle.fodemo.supplier.model.Addresses" id="addressesIterator"/> </executables> <bindings> <action IterBinding="addressesIterator" id="Create" RequiresUpdateModel="true" Action="createRow"/> </bindings>
「データ・コントロール」パネルを使用してフォームを作成すると、属性の削除、表示順序の変更、データの表示に使用するコンポーネントの変更、およびコンポーネントのバインド先の属性の変更を実行できます。
既存のUIコンポーネントとバインディングの変更の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のフォーム上のUIコンポーネントおよびバインディングの変更に関する項を参照してください。