31 データバインドされた基本的なページの作成

この章では、ADFデータ・コントロールおよびADF Facesコンポーネントを使用して、ADFビジネス・コンポーネントからデータがモデル化されたFusion Webアプリケーションでデータバインドされたフォームを作成する方法について説明します。テキスト・フィールドを個々の属性から作成する方法、新規レコードを編集および作成するためにコレクションからフォーム全体を生成する方法および動的フォームを作成する方法について説明します。

この章の内容は次のとおりです。

データバインドされた基本的なページの作成について

単純なデータバインドWeb UIは、Oracle ADFフレームワークと連携したJDeveloper IDEによって提供される視覚的で宣言的な開発エクスペリエンスの感覚をつかむのに役立ちます。要件に応じてUIコンポーネントをドラッグ・アンド・ドロップできます。

ビジネス・サービス用に作成されたデータ・コントロールを使用して情報の表示および収集を実行するための、UIページを作成できます。たとえば、「データ・コントロール」パネルを使用して、項目の属性をドラッグし、出力テキストまたはラベル付き入力テキスト・フィールドとして、値を表示できます。関連データの表示および更新に必要なすべてのJSFタグとバインディング・コードがJDeveloperによって作成されます。「データ・コントロール」パネルおよび宣言的なバインディング機能の詳細は、「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。

個々の属性をドロップできる他、オブジェクトのすべての属性をフォーム、表または単一列リスト・ビューとして一度にドロップできます。この章には、値を表示するフォーム、ユーザーが値を編集できるフォームおよび値を収集するフォーム(入力フォーム)に関する情報が含まれます。表およびリスト・ビューの作成の詳細は、「ADFによるデータバインドされた表の作成」を参照してください。

UIコンポーネントをドロップすると、コレクション内のレコード間を移動できるようにしたり、ユーザーがデータを操作(レコードのコミット、削除、作成など)できるようにする組込み操作をコマンドUIコンポーネントとしてドロップできます。たとえば、フォームに表示されたデータ・オブジェクトをユーザーが削除できるようにするためのボタンを作成できます。また、必要に応じてデフォルトのコンポーネントを変更することもできます。

ADFによるデータバインドされたフォームのユースケースと例

行データを収集または表示する必要がある場合、フォームを使用します。たとえば、図31-1に示すように、Oracle ADFのSummitサンプル・アプリケーションには、ユーザーが顧客に関する情報を更新できるパネルが含まれています。このフォームは「データ・コントロール」パネルからCustomersコレクションをドラッグ・アンド・ドロップし、表示するフィールドを選択して作成されました。

図31-1 Summit ADFサンプル・アプリケーションの顧客一般情報フォーム

図31-1の説明が続きます
「図31-1 Summit ADFサンプル・アプリケーションの顧客一般情報フォーム」の説明

フォームを作成する場合、図31-2に示すように、ユーザーがレコード間を素早く移動できるように、ナビゲーションの追加を選択することもできます。

図31-2 フォーム内のレコード間の移動

図31-2の説明が続きます
「図31-2 フォーム内のレコード間の移動」の説明

フォームに表示される行への処理を実行するコマンド・ボタンを追加することもできます。たとえば、レコードの値を変更して、これらの変更を編集フォームに保存できます。または、ユーザーに新規レコードの作成を許可する入力フォームを作成できます。図31-3は、ユーザーが新規注文を作成可能な入力フォームを示しています。

ノート:

フォーム内に表示する属性が実行時にしか使用できない場合は、動的フォームを作成できます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。

データバインド・ページの追加機能

データバインドされたページを実装する前に他のOracle ADF機能を理解することが役立つ場合があります。有用なその他の機能へのリンクは、次のとおりです。

  • ADFビュー・オブジェクト: フォーム内でのコンポーネントの表示方法および機能のほとんどは、対応するビュー・オブジェクトによって制御されます。「ビュー・オブジェクトを使用したSQL問合せの定義」を参照してください。

  • ADFアプリケーション・モジュール: ページにデータバインドされたコンポーネントをドラッグする「データ・コントロール」パネルに、アプリケーション・モジュールに追加したビュー・オブジェクトの表示が移入されます。「アプリケーション・モジュールによるビジネス・サービスの実装」を参照してください。

  • アダプタベースのデータ・コントロール: EJBコンポーネントやWebサービスなど他のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』「EJBデータ・コントロールの作成および構成」で説明されるこれらのビジネス・サービス用データ・コントロールを作成できます。

  • ADFモデルとデータ・バインディング: ADF Webアプリケーション内でフォームを作成する場合は、ADFモデルおよびデータ・バインディングを使用します。「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。

  • ADF Faces: ADF Faces UIコンポーネントも使用します。ADF Facesを使用した開発の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「ADF Facesの概要」を参照してください。

  • 高度なUIコントロール: 基本的なフォームには、入出力コンポーネントを使用します。また、リスト、表、ツリー、検索フォーム、LOVコンポーネント、グラフ、ゲージ、ツリーマップなどの高度なコンポーネントを使用することもできます。「データバインドされたWebユーザー・インタフェースの作成」の残りの各章を参照してください。

  • タスク・フロー: トランザクションに携わるフォームの場合は(入力フォームなど)、フォームのレンダリングの前または後に、ADFタスク・フローを使用して特定の操作を起動する必要があります。「ADFタスク・フローの作成」を参照してください。

  • ページ・ライフサイクル: ページ・ライフサイクルでのフォームの処理の詳細は、「Fusionページ・ライフサイクルの理解」を参照してください。

  • 検証: 特定のフィールドがデータ・ストアに送信される前に、このフィールドを検証する必要がある場合もあります。「検証とビジネス・ルールの宣言的な定義」および「ADFモデル・レイヤーでの検証の使用」を参照してください。

  • アクティブ・データ: アプリケーションでアクティブ・データを使用する場合は、データ・ソースのデータが変更されるたびに、UIコンポーネント内のデータを自動的に更新できます。「アクティブ・データ・サービスの使用」を参照してください。

データ・コントロール属性を使用したテキスト・フィールドの作成

「データ・コントロール」パネルは、属性を表示または更新できるテキスト・フィールドの作成に役立ちます。属性をJSFページにドラッグし、UIコンポーネントとしてドロップすると、ページのページ定義ファイルが作成されます(まだ存在しない場合)。

JDeveloperでは、テキスト・フィールドを宣言的に作成可能な、JSFページ用の完全なWYSIWYG開発環境が用意されているため、ページのほとんどの内容をコードを見ずに設計できます。「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップすると、属性バインディングを使用してADF FacesテキストUIコンポーネントはデータ・コントロールの属性に宣言的にバインドされます。

テキスト・フィールドの作成方法

属性を表示または更新できる個々のテキスト・フィールドを作成するには、「データ・コントロール」パネルからコレクションの属性をドラッグ・アンド・ドロップします。ADFビジネス・コンポーネントの場合、「データ・コントロール」パネルに、少なくとも1つのアプリケーション・モジュールで定義したデータ・モデルの要素が移入されます。

始める前に:

データ・コントロールを使用したテキスト・フィールドの作成に関する一般的な知識があると役立ちます。詳細は、「データ・コントロール属性を使用したテキスト・フィールドの作成」を参照してください。

次のタスクを完了する必要があります。

データバインド・テキスト・フィールドを作成するには:

  1. 「データ・コントロール」パネルから、コレクションの属性を選択します。属性およびその他のオブジェクトを表す「データ・コントロール」パネルのアイコンの詳細は、「「データ・コントロール」パネルの使用」を参照してください。

    たとえば、図31-4は、Summit ADFサンプル・アプリケーションのBackOfficeAppModuleDataControlデータ・コントロールの Customersコレクション下のLastName属性を示しています。これは、顧客の姓を表示、更新または挿入するためにドロップする属性です。

    図31-4 コレクションに関連付けられた属性の「データ・コントロール」パネルでの表示

    図31-4の説明が続きます
    「図31-4 コレクションに関連付けられた属性の「データ・コントロール」パネルでの表示」の説明
  2. ページに属性をドラッグし、図31-5に示すように、ポップアップ・メニューから、属性値を表示または収集するUIコンポーネントのタイプを選択します。

    図31-5 属性をページにドロップする際のポップアップ・メニュー

    図31-5の説明が続きます
    「図31-5 属性をページにドロップする際のポップアップ・メニュー」の説明

    各属性について、次の選択肢があります。

    • テキスト:

      • ラベル付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リストを作成します。ビジネス・コンポーネントのこのリストの動作の詳細は、「ビュー・オブジェクト属性の値リスト(LOV)での作業」を参照してください。アダプタベースのデータ・コントロールのこのリストの動作の詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』値オブジェクトのリストの作成に関する項を参照してください。JSFページでのリストの使用の詳細は、「選択リストの作成」を参照してください。

    • 単一選択: 単一選択リストを作成します。JSFページでのリストの作成の詳細は、「選択リストの作成」を参照してください。

    ノート:

    これらの選択は、デフォルトではユーザーが選択します。ただし、属性で使用可能なコンポーネントのリストは、関連するエンティティまたはビュー・オブジェクトのコントロール・ヒントとして構成できます。詳細は、「エンティティ・オブジェクトの属性のコントロール・ヒントの定義」および「ビュー・オブジェクトのUIヒントの定義」を参照してください。アダプタベースのデータ・コントロールのコントロール・ヒントを追加する方法の詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』属性のUIヒントを設定する方法に関する項を参照してください。

    この章の目的にあわせて、ここではテキスト・コンポーネントのみ(リストは除く)について説明します。

テキスト・フィールドの作成時の処理

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ページに作成されるコンポーネント・タグ

「データ・コントロール」パネルから属性をドロップしてテキスト・フィールドを作成すると、対応するタグが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機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。

次のタスクを完了する必要があります。

基本的なフォームを作成するには:

  1. 「データ・コントロール」パネルから、表示するデータを表すコレクションを選択します。図31-6に、BackOfficeAppModuleDataControlデータ・コントロールのCustomersコレクションを示します。

    図31-6 「データ・コントロール」パネルでのCustomerVOオブジェクト

    図31-6の説明が続きます
    「図31-6 「データ・コントロール」パネルでのCustomerVOオブジェクト」の説明
  2. コレクションをページにドラッグし、ポップアップ・メニューから「ADFフォーム」を選択します。

    図31-7 コレクションをページにドロップする際のポップアップ・メニュー

    図31-7の説明が続きます
    「図31-7 コレクションをページにドロップする際のポップアップ・メニュー」の説明
  3. 「フォームの作成」ダイアログで、フォームを構成します。
    • 属性がフォームに表示できないようにすることができます。

    • 「読取り専用フォーム」チェック・ボックスを選択しない場合、ADF inputTextコンポーネントがほとんどの属性に対して使用されます。inputTextコンポーネントごとにlabel属性が移入されます。デフォルトで、ラベルは、関連付けられているバインディング・オブジェクトのlabelプロパティにバインディングからその値を取得します。

      日付である属性ではInputDateコンポーネントが使用されます。

      属性にコントロール・タイプのコントロール・ヒントが作成されている場合、または属性がリストとして構成されている場合、ヒントにより設定されたコンポーネントが使用されます。

      InputTextコンポーネントには、属性のクライアント側検証を設定するためのvalidatorタグが含まれます。属性が数値または日付の場合、converterも含まれます。

      ヒント:

      inputTextコンポーネントの様々な属性の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「入力コンポーネントの使用およびフォームの定義」を参照してください。

    • 「読取り専用フォーム」チェック・ボックスを選択する場合、読取り専用outputTextコンポーネントが使用されます。このフォームはデータの表示を目的としているため、validatorタグは追加されません(コンバータは含まれます)。タイプDateの属性は、読取り専用フォームではoutputTextコンポーネントを使用します。すべてのコンポーネントは、label属性を含むpanelLabelAndMessageコンポーネント内に配置され、panelFormLayoutコンポーネントに格納されます。これにより、実行時にラベルがoutputTextコンポーネントと適切に位置合せされるようになります。

    • ユーザーがコレクション内の全データ・オブジェクト間を移動できるようにする、ナビゲーション・コントロールを含めることもできます。詳細は、「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。

    • HTMLフォームを送信する「送信」ボタンが含まれ、フォームのデータをJSF/ADFページ・ライフサイクルの一部としてバインディングに適用することもできます。このダイアログの使用方法に関する追加のヘルプを表示するには、「ヘルプ」をクリックします。

  4. ユーザーがデータを更新できるようにするためのフォームを作成する場合は、ここで、レコードを更新するために変更をコミットする操作をドラッグ・アンド・ドロップする必要があります。詳細は、「既存レコードを編集するフォームの作成」を参照してください。

ノート:

「フォームの作成」ダイアログで実行時に生成されるフィールドを選択する場合、表示する属性は、ビジネス・サービスの構成に基づいて実行時に決定されます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。

データ・コントロール・コレクションを使用したフォームの作成時の処理

「データ・コントロール」パネルからオブジェクトをフォームとしてドロップすることは、単一の属性をドロップするのと同じ効果があります。ただし、複数の属性バインディングおよび関連する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のプリミティブ・タイプまたはコレクションのいずれでもない属性)が含まれる場合、その属性はダイアログには表示されず、また、フォームに対応するコンポーネントもありません。これらのフィールドは手動で作成する必要があります。

データ・コントロール操作を使用したコマンド・コンポーネントの作成

コマンド・コンポーネントは、アクティブ化されたときにアクションを実行するUICommandコンポーネントで表されます。「データ・コントロール」パネルは、ページへのデータ・コントロール操作に基づいてコマンド・コンポーネントをドラッグ・アンド・ドロップするのに役立ちます。

「データ・コントロール」パネルには、データ・オブジェクトの表示を提供するほか、フォームで使用するための標準操作を表すノードもあります。これらの組込み操作により、レコード間の移動やデータベースへの変更のコミットなど、通常のフォーム機能を宣言的に処理できます。大半の操作はデータ・コントロール内の個々のデータ・コレクションに対応しています。コミットおよびロールバック操作はデータ・コントロール全体に対して使用できます。「データ・コントロール」パネルからページに操作をドラッグする場合、ボタンやリンクなど、作成するコマンド・コンポーネントの種類を選択するよう求められます。

図31-8は、Summit ADFサンプル・アプリケーションのCountriesコレクションで使用可能な操作を示しています。

図31-8 データ・コントロール・コレクションの操作

図31-8の説明が続きます
「図31-8 データ・コントロール・コレクションの操作」の説明

この項では、組込みデータ・コントロール操作からコマンド・コンポーネントを作成する方法を示します。データバインドされたページでコマンド・コンポーネントを使用可能な他の方法の詳細は、「ビュー・レイヤーで各機能を起動するコマンド・コンポーネントの使用」を参照してください。

操作からコマンド・コンポーネントを作成する方法

データ・コントロール操作に基づいてコマンド・コンポーネントを作成するには、「データ・コントロール」パネルからページに操作をドラッグ・アンド・ドロップします。

始める前に:

コマンド・コンポーネントを作成するためにデータ・コントロール操作を使用することを理解しておくと役立ちます。詳細は、「データ・コントロール操作を使用したコマンド・コンポーネントの作成」を参照してください。

次のタスクを完了する必要があります。

操作からコマンド・コンポーネントを作成するには:

  1. 「データ・コントロール」パネルから、操作をページにドラッグします。
  2. 次に表示されるポップアップ・メニューから「ADFボタン」または「ADFリンク」を選択します。

操作を使用したコマンド・コンポーネント作成時の処理

操作をドロップしてコマンド・コンポーネントを作成する場合、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属性

イテレータ・バインディングには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属性が指定されない場合、完全なレコード・セットが戻されます。

操作へバインドするために作成されるEL式

データ・コントロール操作を使用してコマンド・コンポーネントを作成すると、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に設定するため、「先頭へ」ボタンが自動的に無効になります。これは、enabledFalseの場合は、常に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フォームの作成時にナビゲーション・コントロールを含めることを選択できます。デフォルトでは、JDeveloperはコレクション内でナビゲートゲートするための「先頭へ」、「最後へ」、「前へ」および「次へ」ボタンを作成します。必要に応じてナビゲーション・ボタンを手動で含めることもできます。

ADFフォームを作成する際、ナビゲーション・コントロールの組込みを選択すると、データ・コントロールの既存のナビゲーション・ロジックにバインドされているADF Facesコマンド・コンポーネントが組み込まれます。この組込みロジックによって、ユーザーは、コレクション内のすべてのデータ・オブジェクトを移動できるようになります。図31-9の例は、Countriesコレクションをドラッグし、ナビゲーションを使用するADFフォームとしてドロップした場合に作成されるフォームを示しています。

図31-9 フォーム内のナビゲーション

図31-9の説明が続きます
「図31-9 フォーム内のナビゲーション」の説明

表31-1に、データ・コントロールで提供される組込みナビゲーション操作と、操作にバインドされたイベントの実行または操作の起動の結果を示します。アクション・イベントの詳細は、「実行時に行われる処理: アクション・イベントおよびアクション・リスナーの動作方法」を参照してください。

表31-1 組込みナビゲーション操作

操作 関連イテレータ・バインディングによる起動時の処理

最初へ

現在のポインタを結果セットの最初に移動します。

最後へ

現在のポインタを結果セットの最後に移動します。

現在のポインタを結果セットの前のオブジェクトに移動します。このオブジェクトが現在のレンジの外にある場合は、レンジ・サイズと同じオブジェクト数だけレンジが戻るようにスクロールされます。

現在のポインタを結果セットの次のオブジェクトに移動します。このオブジェクトが現在のレンジの外にある場合は、レンジ・サイズと同じオブジェクト数だけレンジが進むようにスクロールされます。

Previous Set

レンジ・サイズ属性と同じオブジェクト数だけ、レンジを戻すように移動します。

Next Set

レンジ・サイズ属性と同じオブジェクト数だけ、レンジを進めるように移動します。

フォームへのナビゲーション・コントロールの手動の挿入方法

デフォルトでは、「データ・コントロール」パネルを使用してフォームを作成する際にナビゲーションの組込みを選択すると、「先頭へ」「最後へ」「前へ」および「次へ」の各ボタンが作成され、ユーザーがコレクション内を移動できるようになります。

また、既存のフォームにナビゲーション・ボタンを手動で追加できます。

始める前に:

ナビゲーション・コントロールについて理解しておくと役立ちます。詳細は、「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。

また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。

次のタスクを完了する必要があります。

ナビゲーション・ボタンを手動で追加するには:

  1. 操作の実行対象となるオブジェクトのコレクションに関連付けられている操作を「データ・コントロール」パネルから選択し、JSFページ上にドラッグします。

    たとえば、国のコレクション全体を移動できるようにする場合は、Countriesコレクションに関連付けられている「次へ」操作をドラッグします。図31-8に、Countriesコレクションに関連付けられている操作を示します。

  2. 次に表示されるポップアップ・メニューから「ADFボタン」または「ADFリンク」を選択します。

ヒント:

「先頭へ」「最後へ」「前へ」および「次へ」のすべてのボタンを一度にドロップすることもできます。一度にドロップするには、対応するコレクションをドラッグし、ポップアップ・メニューから「移動」→「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は表示されません。かわりに、現在のすべての注文を表示するためのリンクを含むページに戻ります。

CacheResultsプロパティに関する必知事項

「データ・コントロール」パネルを使用してナビゲーション可能なフォームを作成する場合、関連するイテレータのCacheResultsプロパティはtrueに設定されます。これにより、現在行情報などのイテレータの状態はリクエスト間でキャッシュされ、現在のオブジェクトを判別できるようになります。このプロパティがfalseに設定されている場合、ナビゲーションは動作しません。

既存レコードを編集するフォームの作成

編集フォームにより、フォーム内の既存のデータに修正を加えることができます。編集フォームを作成するには、コレクションをフォームとしてページにドロップし、適切な操作をコマンド・コンポーネントとしてドロップする必要があります。

ユーザーが現在のデータを編集し、その変更をデータ・ソースにコミットするためのフォームを作成できます。フォームを作成するには、コレクションまたはデータ・コントロール自身に関連付けられたデータ・レコードを変更するための操作を使用して、コマンド・ボタンを作成します。たとえば、Delete操作を使用して、ユーザーが現在のレンジからレコードを削除できるボタンを作成できます。

ADFビジネス・コンポーネントまたは明示的コミット・モデルを持つEJBセッションBeanに基づいたデータ・コントロールの場合、重要なのは、これらの操作がADFキャッシュのオブジェクトに対してのみ実行されるという点です。ルート・データ・コントロール上でCommit操作を使用して、任意の変更をデータソースに実際にコミットする必要があります。データ・コントロールのRollback操作を使用して、キャッシュされたオブジェクトに対する任意の変更をロールバックします。ページが、バインド・タスク・フロー内のトランザクションの一部である場合、通常、タスク・フロー・リターン・アクティビティのトランザクションを解決するためにこの操作を使用します。「タスク・フローのトランザクションの管理」を参照してください。

編集フォームの作成方法

編集フォームを作成するには、コレクションをフォームとしてページにドロップし、適切な操作をコマンド・コンポーネントとしてドロップします。

始める前に:

編集フォームの作成について理解しておくと役立ちます。詳細は、「既存レコードを編集するフォームの作成」を参照してください。

また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。

次のタスクを完了する必要があります。

編集フォームを作成するには:

  1. 「データ・コントロール」パネルから、フォームを作成するコレクションをドラッグし、ポップアップ・メニューから「ADFフォーム」を選択します。

    これにより、inputTextコンポーネントを使用し、フィールドのデータを編集可能なフォームが作成されます。

  2. 「フォームの作成」ダイアログで、追加するフィールドとボタンをフォームに設定し、「OK」をクリックします。
  3. 必要に応じて、「データ・コントロール」パネルから、フォームに追加するコレクションに関連付けられている追加操作を選択し、ポップアップ・メニューから「ADFボタン」または「ADFリンク」を選択します。

    たとえば、国を削除できるようにする場合は、Countriesコレクションに関連付けられているDelete操作を選択します。図31-10に、Countriesコレクションに関連付けられている操作を示します。

    図31-10 コレクションに関連付けられている操作

    図31-10の説明が続きます
    「図31-10 コレクションに関連付けられている操作」の説明
  4. 変更内容を保存するかキャンセルする場合はページに操作を追加します。

    ページが、バインド・タスク・フロー内のトランザクションの一部でない場合、ユーザーが変更をコミットまたはロールバックできるようにするためのボタンを作成する必要があります。「データ・コントロール」パネルから、ルートレベル・データ・コントロールに関連付けられたCommit操作とRollback操作をドラッグし、コマンド・ボタンまたはコマンド・リンクのいずれかとしてドロップします。図31-11に、BackOfficeAppModuleDataControlデータ・コントロールのコミット操作とロールバック操作を示します。

    図31-11 データ・コントロールのCommit操作とRollback操作

    図31-11の説明が続きます
    「図31-11 データ・コントロールのCommit操作とRollback操作」の説明

    ページが、バインド・タスク・フロー内のトランザクションの一部である場合、タスク・フロー・リターン・アクティビティを作成する際のトランザクションを解決する値としてCommitまたはRollbackを入力します。詳細は、「タスク・フローのトランザクションの管理」を参照してください。

    ADFビジネス・コンポーネント以外のビジネス・サービスに基づいたデータ・コントロールにフォームを作成する場合は、CommitおよびRollback操作を使用できない場合があります。詳細は、「ステートレス・ビジネス・サービスのデータ・コントロールに関する必知事項」を参照してください。

  5. 必要に応じて、各編集可能なフィールドのautoSubmitプロパティをtrueに変更します。

    これを行うことにより、フィールドを変更してボタンをクリックするなど、別のイベント・シーケンスによってCommitおよびRollback操作が有効になっていない場合に、フィールドからタブアウトし、これらを有効にしたときに、ユーザーの変更をページに送信できるようになります。

    フィールドを選択し、「プロパティ」ウィンドウの「動作」セクションにスクロールして、フィールドのautoSubmitプロパティにアクセスできます。

ヒント:

編集フォームを作成する同じページにフォームと同じコレクションから作成された表がある場合にも、表およびフォームは同じイテレータ・バインディングを使用し、これにより、表で行を選択することによってユーザーがフォームで編集するレコードを選択できるようになります。データバインドされた表を作成する方法の詳細は、「基本表の作成」を参照してください。

フォームの作成時の処理

ページにコレクションをドロップする場合の処理の詳細は、「データ・コントロール・コレクションを使用したフォームの作成時の処理」を参照してください。

コマンド・ボタンとして任意のデータ・コントロール操作をドロップすると、ナビゲーション操作をドロップするときと同様のコードが生成されます。詳細は、「操作を使用したコマンド・コンポーネント作成時の処理」を参照してください。

イテレータとは異なり、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 追加の組込み操作

操作 関連イテレータ・バインディングによる起動時の処理

CreateInsert

現在の行の直前に行を作成し、行セットに新しいレコードを挿入して、現在行ポインタを新しい行に移動します。レンジは移動しないため、レンジの最後の行が結果的にレンジから除外される可能性があります。CreateInsert操作を使用したオブジェクトの作成の詳細は、「入力フォームの作成」を参照してください。

ノート: CreateInsertはADFビジネス・コンポーネント・アプリケーション・モジュールに基づいたデータ・コントロールでのみ使用可能です。

Create

現在の行の直前に行を作成し、現在行ポインタを新しい行に移動します。レンジは移動しないため、レンジの最後の行が結果的にレンジから除外される可能性があります。

アプリケーション・モジュールおよびほとんどの他のビジネス・サービスに基づいたデータ・コントロールの場合、ユーザーが実際にデータを作成することなく移動した場合の空白行を避けるため、行セットにレコードは挿入されません。新しい行は、ユーザーがデータを送信すると作成されます。詳細は、「CreateおよびCreateInsertに関する必知事項」を参照してください。ただし、JPAベースのデータ・コントロールの場合、Create操作がデータを行セットに挿入するため、データを永続化するように構成できます。詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』データ・コントロールの組込み操作に関する項を参照してください。

CreateWithパラメータ

CreateInsert操作と同じ(新規レコードが行セットに挿入されます)。ただし、オブジェクトの作成に名前付きパラメータが使用されます。

ノート: Create With ParametersはADFビジネス・コンポーネント・アプリケーション・モジュールに基づいたデータ・コントロールでのみ使用可能です。

Delete

現在の行をキャッシュから削除し、現在行ポインタを結果セットの次の行に移動します。レンジは移動しないため、レンジの最後に行が追加される可能性があります。最後の行が削除された場合、現在行ポインタはその前の行に移動します。コレクション内の行がなくなると、有効な属性がdisabledに設定されます。

RemoveRowWithKey

入力フィールドによって指定された値から変換されたStringとして行キーを使用し、バインドされたデータ・コレクションのデータ・オブジェクトを削除します。

SetCurrentRowWithキー

行キーを、入力フィールドで指定された値から変換されたStringとして設定します。行キーは、バインドされたデータ・コレクション内のデータ・オブジェクトの現状設定に使用されます。使用例は、「表での現在行の設定に関する必知事項」を参照してください。

SetCurrentRowWithKeyValue

キーの値を使用して、イテレータの現在のオブジェクトを設定します。詳細は、「表での現在行の設定に関する必知事項」を参照してください。

ExecuteWithParams

パラメータとして渡された名前付きのバインド変数に新しい値を割り当てた後で、ビュー・オブジェクトの問合せを(再)実行することにより、データ・コレクションをリフレッシュします。この操作は、CreateInsert操作を使用して入力フォームを作成するのと同じ方法で使用します。詳細は、「入力フォームの作成」を参照してください。

この操作は、設計時に1つ以上の名前付きバインド変数が定義されているビュー・オブジェクトの場合のみ表示されます。詳細は、「バインド変数の使用」を参照してください。

EJBおよびBeanデータ・コントロールの場合、この操作はパラメータ使用の問合せに基づくデータ・コントロール・コレクション・オブジェクトでのみ使用可能です。

Commit

現在キャッシュ内にあるすべての項目をデータベースにコミットします。

Rollback

キャッシュをクリアして、トランザクションおよびイテレータを初期状態に戻します。ActionListenerメソッドをリセットします。

ExecuteおよびFind

これらの操作は、検索フォームでのみ使用されます。詳細は、「ADFによるデータバインドされた検索フォームの作成」を参照してください。

ステートレス・ビジネス・サービスのデータ・コントロールに関する必知事項

ADFビジネス・コンポーネント・サービスに基づいてユーザー・インタフェースを作成する場合は、ユーザーが行うどのデータ変更もユーザーがコマンド・コンポーネントを使用してCommit操作を行うまで基本のデータベースに伝搬されません。

ステートレスEJBセッションBeanまたはRESTful Webサービスなど、ステートレス・ビジネス・サービスのデータ・コントロールに基づくユーザー・インタフェースの場合、CommitおよびRollback操作が使用できません。そのような場合は、基本のデータベースとの対話を処理するカスタム・メソッドを使用できます。EJBデータ・コントロールの場合、セッションBeanのpersistEntityおよびmergeEntityメソッドは、「データ・コントロール」パネルを使用して公開され、それらからコマンド・コンポーネントを作成できます。詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』EJBセッションBeanのコミット・モデルに関する項を参照してください。

フォームを作成するためのパラメータの使用

様々なメカニズムを使用してADFパラメータ・フォームを作成できます。ExecuteWithParams操作を使用して、ADFパラメータ・フォームの作成に関する情報を収集する必要があります。

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操作

図31-12の説明が続きます
「図31-12 「データ・コントロール」パネルのExecuteWithParams操作」の説明

ビュー・オブジェクト・バインド変数およびJPAパラメータ付き問合せを使用すると、実行時にビュー・オブジェクトまたはビュー基準に属性値を組み込むことができます。ExecuteWithParams操作により、パラメータとして渡された名前付きのバインド変数に新しい値を割り当てた後で、ビュー・オブジェクトの問合せを(再)実行することにより、データ・コレクションがリフレッシュされます。ビュー・オブジェクトのバインド変数の詳細は、「バインド変数の使用」を参照してください。JPA問合せの名前付きパラメータの詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』EJBデータ・コントロールの前提条件と考慮事項に関する項を参照してください。

パラメータを使用するフォームの作成方法

パラメータを使用するフォームを作成するには、ADFパラメータ・フォームとしてページにコレクションのExecuteWithParams操作をドロップし、ADFフォームとしてコレクション自体をドロップします。

始める前に:

パラメータ・フォームの作成について理解しておくと役立ちます。詳細は、「フォームを作成するためのパラメータの使用」を参照してください。

また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。

次のタスクを完了する必要があります。

ExecuteWithParams操作に基づいたパラメータ・フォームを作成するには:

  1. 「データ・コントロール」パネルから、フォームを作成するコレクションのExecuteWithParams操作をドラッグし、ポップアップ・メニューから「ADFパラメータ・フォーム」を選択します。
  2. 「フォームの作成」ダイアログで、ユーザーが問い合せることができるパラメータを選択し、「OK」をクリックします。
  3. 「データ・コントロール」パネルから、対応するコレクションをドラッグし、ユーザー入力に基づいて問合せ結果を表示したい表またはフォームのタイプとしてそれをドロップします。

ノート:

選択リストをパラメータ・フォームに宣言的に組み込むこともできます。選択リストを作成するには、フォームに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プロパティがパラメータ・フォームのコマンド・ボタンに設定されます。

実行時に行われる処理: パラメータの移入方法

ページがレンダリングされる場合、フレームワークにより、ページが最初にレンダリングされるか、例外リストに任意のアイテムがあるかどうかがチェックされます。両方がfalseの場合、フレームワークにより、ExecuteWithParamsアクション・バインディングが実行されます。このアクション・バインディングでは問合せが実行され、必須パラメータの値として名前付きデータ要素の値が取得されます。

入力フォームの作成

入力フォームは、新規レコードの情報の入力に役立つ編集フォームに似ています。基本入力フォームを作成するには、最初に編集フォームを作成し、新しいレコードを作成するためのコマンド・コンポーネントを追加します。

ユーザーが新規レコードの情報を入力し、そのレコードをデータ・ソースにコミットするためのフォームを作成できます。基本的な入力フォームの作成は、入力フォームにCreateInsert操作も含まれるということを除いて、編集フォームの作成と同じであり、ユーザーがフォームを使用して移入できる行セットに空白行が挿入されます。

「データ・コントロール」パネルからページにコレクションおよび適切な操作をドラッグ・アンド・ドロップすることにより、単純な入力フォームを作成できます。ただし、ユーザー・ワークフローを制御し、他のフォームの処理ロジックを挿入するために、他の手法を選択する必要がある場合があります。このような手法は次のとおりです。

次のセクションでは、基本的な入力フォームの作成方法について説明し、またいくつかのバリアントに関する情報を提供します。

入力フォームの作成方法

基本的な入力フォームの作成には、編集フォームの作成および新規レコードを作成するためのコマンド・コンポーネントの追加が含まれます。

始める前に:

入力フォームについて理解しておくと役立ちます。詳細は、「入力フォームの作成」を参照してください。

また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。

次のタスクを完了する必要があります。

入力フォームを作成するには:

  1. 「データ・コントロール」パネルで、フォームがベースとするコレクション・オブジェクトのノードを開きます。
  2. コレクションの「操作」ノードを開き、CreateInsert操作を編集フォームにドラッグします。

ノート:

CreateInsert操作はADFビジネス・コンポーネント・アプリケーション・モジュールに基づいたデータ・コントロールでのみ使用可能です。データ・コントロールが別のビジネス・サービスに基づく場合は、かわりにCreate操作を使用します。2つの間の相違の詳細は、表31-2を参照してください。

バインド・タスク・フローを使用した入力フォームの作成

入力フォームのワークフローを提供するタスク・フローを使用できます。コマンド・コンポーネントを使用して新規オブジェクトを作成するのではなく、タスク・フロー内でメソッド・コール・アクティビティを使用するか、マネージドBeanのメソッドを使用します。コマンド・コンポーネントを使用して変更をコミットするのではなく、タスク・フロー・リターン・アクティビティを使用します。

たとえば、タスク・フローのメソッド・コール・アクティビティを使用して、データ・コントロール・オブジェクトのCreateInsert操作をコールして、ユーザーがデータを入力可能なフォームを表示するビュー・アクティビティにコントロールを渡すことができます。

バインド・タスク・フロー内で入力フォームを作成するには:

  1. 「タスク・フローの作成」の説明に従って、バインド・タスク・フローを作成します。
  2. 「プロパティ」ウィンドウの「トランザクション」プロパティを「常に新規トランザクションを開始」に設定します。

    詳細は、「タスク・フローのトランザクションの管理」を参照してください。

  3. バインド・タスク・フローで、メソッド・コール・アクティビティを追加します。

    詳細は、「メソッド・コール・アクティビティの使用」を参照してください。

  4. 「データ・コントロール」パネルから、フォームを作成しているコレクションに関連付けられているCreateInsert操作をドラッグし、それをメソッド・アクティビティにドロップします。
  5. メソッド・コール・アクティビティを選択したままにして、「プロパティ」ウィンドウで、fixed-outcomeプロパティの文字列を入力します。CreateInsert操作をメソッド・コール・アクティビティにドロップした後で、この値はCreateInsertに設定されますが、さらに具体的なものに変更できます。
  6. タスク・フローの概要エディタで、入力フォームのページを表すビュー・アクティビティを追加します。ビュー・アクティビティの追加の詳細は、「タスク・フローへのアクティビティの追加」を参照してください。
  7. 制御フロー・ケースをメソッド・アクティビティからビュー・アクティビティに追加します。
  8. 設計エディタでコントロール・フロー・ケースを選択した状態にして、「プロパティ」ウィンドウで、制御フロー・ケースのfrom-outcomeプロパティがステップ5で設定したメソッド・アクティビティのfixed-outcomeプロパティの値と同じであることを確認します。
  9. 設計エディタでビュー・アクティビティのページを開き、「データ・コントロール」パネルから、新しいレコードの作成にフォームを使用するコレクションをドラッグし、ポップアップ・メニューから「ADFフォーム」を選択します。
  10. タスク・フローに、リターン・アクティビティを追加します。このリターン・アクティビティでは、データ・コントロールに対してcommit操作を実行する必要があります。これらの手順については、「タスク・フロー・リターン・アクティビティの使用」を参照してください。
タスク・フロー内でリターン・アクティビティのかわりにコマンド・ボタンを使用する方法

通常、Commit操作をコールするには、リターン・アクティビティを使用する必要があります。ただし、タスク・フローに複数のデータ・コントロールによって管理されるデータが含まれる場合や、フローの終了前にデータをコミットする必要がある場合など、Commit操作にコマンド・コンポーネントを使用する必要がある場合があります。

フォーム内に「コミット」ボタンを持つ入力フォームを作成するには:

  1. 「バインド・タスク・フローを使用した入力フォームの作成」の説明に従って、入力フォームを作成します。
  2. 「データ・コントロール」パネルで、入力フォームに関連付けられたコレクションを含むデータ・コントロールのCommit操作をドラッグし、コマンド・ボタンとしてドロップします。
  3. 構造ウィンドウで、commit操作のコマンド・ボタンを選択します。
  4. 「プロパティ」ウィンドウで、メソッド・アクティビティに戻る結果文字列にactionを設定します。同じoutcome値を使用して、ページからアクティビティに戻る制御フロー・ケースを追加する必要があります。
  5. コマンド・ボタンのdisabledプロパティをfalseに設定します。

    デフォルトでは、ボタンのdisabled属性がバインディングのenabledプロパティにバインドされ、その結果、enabledプロパティがfalseに設定された場合にボタンが無効になります。このバインディングでは、enabledプロパティは更新がポストされるまでfalseです。変更がポストされるには、その前にユーザーが新しいオブジェクトを作成する必要があるため、入力フォームの目的上、ボタンは常に有効にする必要があります。

単一トランザクションでの複数エントリを許可する入力フォームの作成

データベースにコミットする前に、ユーザーが複数のエントリを作成できるようにする場合、次のようにします。

単一トランザクションでの複数エントリを許可する入力フォームを有効にするには:

  1. 「バインド・タスク・フローを使用した入力フォームの作成」の説明に従って、入力フォームを作成します
  2. タスク・フローで、ビュー・アクティビティからメソッド・アクティビティに戻る別の制御フロー・ケースを追加し、from-outcomeメソッドの値を入力します。たとえば、createAnotherと入力します。
  3. 「コンポーネント」ウィンドウからコマンド・コンポーネントをページにドラッグ・アンド・ドロップし、action属性を、先ほど作成したfrom-outcomeに設定します。これによって、タスク・フローはメソッド・アクティビティに戻り、CreateInsert操作を再起動します。

入力フォームの作成時の処理

ADFフォームを使用して入力フォームを作成すると、JDeveloperによって次の処理が行われます。

  • メソッド・アクティビティのページ定義でコレクションのイテレータ・バインディングおよびCreateInsert操作のアクション・バインディングが作成されます。CreateInsert操作は、行を行セットに作成し、データ・ソースに入力されたデータを移入します。その他のフォームに関しては、ページのページ定義で、コレクションのイテレータ・バインディングと、コレクション内のオブジェクトの各属性について属性バインディングが作成されます。Commit操作およびRollback操作を使用してコマンド・ボタンまたはリンクを作成した場合、JDeveloperではこれらの操作のアクション・バインディングも作成されます。

  • ADF Faces inputTextコンポーネントおよび操作の場合はbuttonコンポーネントを使用して、JSFページにフォームのコードが挿入されます。

実行時に行われる処理: メソッド・アクティビティからのCreateInsertアクション

CreateInsertボタンをクリックする(またはその操作に対応するメソッドをコールする)と、CreateInsertアクション・バインディングが起動され、CreateInsertRow操作が実行されてコレクション用に空白の新規インスタンスが作成されます。

ノート:

CreateInsert操作をコールするタスク・フロー・メソッド・アクティビティを使用する場合、メソッド・アクティビティからビュー・アクティビティへのルーティング中、メソッド・アクティビティのバインディング・コンテナは必須属性の検証をスキップするため、空白のインスタンスがページ上のフォームに表示できます。

順序番号の表示に関する必知事項

ページが表示される前にCreateアクションが実行されるため、順序を使用して主キーを移入する場合は、空である他のフィールドとは異なり、次の順序番号が入力テキスト・フィールドに表示されます。順序番号が表示されるのは、関連するエンティティ・クラスに、Eagerフェッチを使用して主キー属性の番号の順序を生成するメソッドが含まれるためです。Eagerフェッチにより、行が作成される際に値が移入されます。そのため、順序を使用すると想定どおりに入力フォームが動作します。

ただし、かわりに属性のタイプをDBSequence(データベース・トリガーを使用して順序を生成する)に構成した場合、オブジェクトがデータベースにコミットされるまで番号は移入されません。この場合は、プレースホルダとして負の数が表示されます。この状態を回避するには、入力テキスト・フィールドのRendered属性に次のEL式を使用できます。

#{bindings.EmployeeId.inputValue.value > 0}

この式では、値がゼロより大きい場合のみコンポーネントが表示されますが、これはコミット前には発生しません。同様に、Rendered属性を単純にfalseに設定することもできます。ただし、その場合は主キーの入力テキスト・フィールドのコンポーネントがページに表示されることはありません。

ステートレス・サービスにバックアップされた入力フォームに関する必知事項

入力フォームのベースとなるデータ・コントロールがステートレス・ビジネス・サービスのデータ・コントロールである場合、データ・ソースに変更を保存するために使用する組込みCommit操作はありません。

かわりに、カスタム・メソッドを使用して、データベースに保存する必要があります。詳細は、「ステートレス・ビジネス・サービスのデータ・コントロールに関する必知事項」を参照してください。

動的コンポーネントを使用したフォームの作成

フォームは動的に作成できます。ADF Faces動的コンポーネントを使用して、実行するたびに異なるデータを表示できるフォームを作成します。

ページ内で直接各コンポーネントにタグを提供する静的データバインド・フォームを作成するかわりに、動的コンポーネントを使用して、バインディング・メタデータおよびバインド・コンテンツを表示するために使用されるコンポーネントが実行時に決定されるフォームを作成できます。

この項では、データバインドされた動的フォームの作成について説明します。動的コンポーネントを使用して、データバインドされた表を作成することもできます。「動的コンポーネントを使用した表の作成」を参照してください。

動的フォーム・コンポーネントの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「実行時のコンポーネントの決定」を参照してください。

動的コンポーネントについて

ADF Facesでは、バインディング・メタデータおよびバインド・コンテンツを表示するために使用されるタグが実行時に決定される、モデルドリブン・フォームおよび表の作成に使用可能なaf:dynamicComponentタグが提供されます。

バインディングのこの動的作成では、次の機能が提供されます。

  • 表示されるフィールドおよびこれらのフィールドを表示するために使用されるADF Facesをデータ・モデルによって決定するページを作成できます。追加列や変更されたUIヒントなどのデータ・モデルへの変更は、ページを再設計する必要なしに、ページに反映されます。ビュー・オブジェクトのUIヒントの詳細は、「ビュー・オブジェクトのUIヒントの定義」を参照してください。

  • 多相ビュー・オブジェクトに基づいてページを作成できます。これらのビュー・オブジェクトでは、指定されたレコードに対して使用可能なフィールドがレコードのベース・エンティティ・オブジェクトによって異なる場合があります。表示するフィールドは実行時に決定されるため、特定のレコードに適用されない可能性のあるページにこれらのフィールドを含めたり、指定されたレコードに対して表示されるフィールドを調整するためにビュー・レイヤーでコーディングを行う必要はありません。複数の行タイプを処理するビジネス・コンポーネントの構築の詳細は、「多相ビュー・オブジェクトの定義」を参照してください。

コントロールをページにドロップする際に「フォームの作成」または「表の作成」ダイアログで情報を構成するのではなく、ビュー・オブジェクトのUIヒントを使用して表示情報を設定します。その結果、データの表示方法を変更する場合に、ビュー・オブジェクトで表示方法を変更するだけで、そのビュー・オブジェクトにバインドされているすべての動的コンポーネントの表示はそれに従って変更されます。

図31-13は、CustomerVOビュー・オブジェクトで属性に対するUIヒントを設定し、動的フォームとしてCustomersデータ・コントロール・コレクションをドロップすることにより設計された実行時の動的フォームを示しています。設定されたUIヒントにはLABELおよびDISPLAYHINTがあります(後者は、動的フォームに指定された属性を含めないようにHideに設定できます)。

図31-13 ビュー・オブジェクトに設定されたヒントに基づいた動的フォームの表示

図31-13の説明が続きます
「図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機能について理解しておくと役立ちます。「データバインド・ページの追加機能」を参照してください。

次のタスクを完了する必要があります。

UIヒントにより、属性、ラベル、ツールチップ、フィールドを自動的に送信する必要があるかどうかなどを表示するために使用するUIコンポーネントのタイプなどが決定されます。特定の属性を表示するか非表示にするかも決定できます。UIヒントの作成手順は、「ビュー・オブジェクトのUIヒントの定義」を参照してください。

動的フォームを作成するには:

  1. 動的フォームを作成しているコレクションに対応するビュー・オブジェクトまたはデータ・コントロール構造にUIヒントを設定します。
  2. 必要に応じて、各ビュー・オブジェクト属性のCategoryヒントに対して、カテゴリを指定するか、「新規カテゴリ」アイコンをクリックして、新規カテゴリを作成します。

    同じカテゴリを持つ属性は、そのビュー・オブジェクトに基づいて作成する動的フォームでまとめることができます。

  3. 必要に応じて、作成したカテゴリに対して、カテゴリのラベルおよびツールチップ用にUIヒントを設定します。これらはビュー・オブジェクトの概要エディタの「UIカテゴリ」タブで設定できます。
  4. 「データ・コントロール」パネルから、ビュー・オブジェクトを表すコレクションを選択します。
  5. コレクションをページにドラッグし、ポップアップ・メニューから「ADFフォーム」を選択します。
  6. 「フォームの作成」ダイアログで、「実行時に生成されるフィールド」チェック・ボックスを選択します。
  7. 属性のカテゴリを指定した場合は、これらのカテゴリに従ってフォームで属性をグループ化するために「フィールド・グループを含める」チェック・ボックスを選択します。

動的フォームの作成時に発生する処理

コレクションをページに動的フォームとしてドロップする場合、次の処理が発生します。

  • ページ定義はvariableIteratorバインディング、イテレータへのiteratorバインディングおよびtree値バインディングで移入されます。

  • JSFページには1つ以上のaf:iteratorおよびaf:dynamicComponentタグが移入されます。また、「フィールド・グループを含める」オプションが選択されている場合は、af:switcherおよびaf: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によってaf:iteratorタグが挿入され、その内部でaf:dynamicComponentタグがネストされます。af:iteratorタグは、実行時にコレクションによって公開される属性をすべてループし、af: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>

af:iteratorタグのvalue属性では、コレクションのツリー・バインディングのattributesModel.attributesプロパティに評価されるEL式を使用します。attributesModelプロパティは、コンポーネント・タイプ、ラベル、ツールチップ、レンダリングされる実際のコンポーネントの他のプロパティなど、データ・オブジェクトの属性およびそのメタデータを取得するために使用されます。attributesModelattributesプロパティは、表示可能属性およびそのメタデータのフラット(非階層的)リストが提供されていることを示します。

dynamicComponentタグのattributeModel属性は、EL式#{attr}にバインドされ、イテレータのvar属性で定義される変数を参照し、データ・コントロール・コレクションおよびその対応するメタデータの現在の属性へのポインタとして機能します。dynamicComponentvalue属性のEL式は、変数attrも参照します。

グループ化して動的フォームに対して作成されるタグ

「フォームの作成」ダイアログの「フィールド・グループを含める」チェック・ボックスを選択している場合は、生成されたJSFページに、「グループ化しないで動的フォームに対して作成されるタグ」で説明されているタグに加え、af:switcherタグとaf:groupタグが含まれます。

af:switcherタグは、af:iteratorタグ内で直接ネストされます。af:switcherタグ内には、GROUPおよびATTRIBUTEという名前のネストされたf:facetタグがあります。GROUPファセットにはaf:groupタグが含まれ、その内部に、グループ名とiteratorタグを表示するafoutputTextタグがあり、それにはaf:dynamicComponentタグが含まれます。ATTRIBUTEファセットにはaf: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>

af:iteratorタグのvalue属性では、コレクションのツリー・バインディングのattributesModel.hierarchicalAttributesプロパティに評価されるEL式を使用します。attributesModelプロパティは、コンポーネント・タイプ、ラベル、ツールチップ、レンダリングされる実際のコンポーネントの他のプロパティなど、データ・オブジェクトの属性およびそのメタデータを取得するために使用されます。hierarchicalAttributesプロパティは、UIヒントの属性に対して設定されたカテゴリを含む、表示可能属性およびそのメタデータの階層リストが提供されることを示します。

af:dynamicComponentタグのattributeModel属性は、EL式#{attr}に設定され、イテレータのvar属性で定義される変数を参照し、データ・コントロール・コレクションおよびその対応するメタデータの現在の属性(またはカテゴリ)へのポインタとして機能します。

実行時に行われる処理: 属性値の動的な決定方法

動的コンポーネントを含むページがレンダリングされると、設計時に「データ・コントロール」パネルから項目をドロップしたときと同様に、バインディングが作成されます。ただし、バインディングは実行時に作成されます。

実行時に、iteratorは、属性のセットを反復処理し、各属性のdynamicComponentをインスタンス化します。動的コンポーネントは、そのattributeModelプロパティを使用して、ラベルやコントロール・タイプなど、現在の属性に関するイテレータからの情報を取得します。次に各dynamicComponentは属性に対して戻されるメタデータに基づいてコンポーネントをレンダリングします。

属性のDISPLAYHINT UIヒントがHideに設定される場合、属性のコンポーネントはレンダリングされません。

動的フォームが多相ビュー・オブジェクトに基づくデータ・コントロール・オブジェクトから作成される場合、レンダリングされるコンポーネントは、現在選択されているレコードの行タイプによって異なります。

コンバータおよびバリデータの動的コンポーネントへの適用方法

デフォルトで、標準のADF Facesコンバータおよびバリデータは、動的コンポーネントを使用している場合に実行時に生成されるコンポーネントに適用されます。たとえば、converterDateTimeコンバータは、TimeStampタイプの属性に基づくコンポーネントに適用されます。

特定の検証または変換をコンポーネントに追加する必要がある場合は、ADF Facesバリデータおよびコンバータ・タグを動的コンポーネントのソースに追加することでこれを行い、タグのdisabled属性を使用してバリデータおよびコンバータが適用される属性を決定できます。

始める前に:

動的フォームについて理解しておくと役立ちます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。

また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。

次のタスクを完了する必要があります。

ADF Facesバリデータまたはコンバータを動的フォームに手動で挿入するには:

  1. ソース・エディタで動的コンポーネントを含むページを開きます。
  2. af:dynamicComponentタグ内に、使用するバリデータ・コンポーネントとコンバータ・コンポーネントを挿入します。
  3. 各バリデータおよびコンバータ・タグ内で、disabled属性を挿入し、適用するものを除いてすべての属性のタグを無効にするEL式にそれをバインドします。

    たとえば、次の式では、Hiredate属性に対してのみバリデータを有効にします。

    #{attr.name == 'Hiredate' ? false : true}
    

次の例は、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つのaf:groupタグから構成されており、最初と3番目には静的コンテンツが含まれ、2番目にはネストされたaf:dynamicComponentタグとともにaf: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の作成の詳細は、「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください

動的コンポーネントの動作をプログラム的に設定するには:

  1. 動的コンポーネントを含むUIプロジェクトで、oracle.adf.view.rich.model.BaseAttributeDescriptorクラスを拡張するJavaクラスを作成します。

    次の例は、Sal属性のラベルにカスタム・スタイルを適用するメソッドを追加するサンプル・クラスを示しています。

    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;
      }
    
  2. ページのマネージドBeanを作成します。
  3. マネージド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);
      }
    
  4. 動的コンポーネントを含むページのソース・エディタで、動的コンポーネントのattributeModelプロパティをカスタマイズされた属性ディスクリプタを戻すマネージドBeanメソッドにバインドします。

    次の例は、attributeModel属性がattributeCustomBeanマネージドBeanのgetCustomizedAttributesメソッドを参照するEL式に設定されているaf:dynamicComponentタグを示しています。

    <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を使用して行うことができます。

始める前に:

動的フォームについて理解しておくと役立ちます。詳細は、「動的コンポーネントを使用したフォームの作成」を参照してください。

また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。

次のタスクを完了する必要があります。

動的コンポーネントのバインディング・インスタンスにプログラム的に設定するには:

  1. 動的コンポーネントを識別するマネージドBeanメソッドを作成して、RichDynamicComponentにコンポーネントをキャストし、変更を適用します。
  2. 動的コンポーネントを含むページでは、コマンド・コンポーネントをページに追加して、そのactionListenerプロパティをマネージドBeanメソッドにパインドします。

次の例は、動的コンポーネントのラベル・スタイルを変更するマネージド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機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。

次のタスクを完了する必要があります。

動的コンポーネントのバインディング・インスタンスにプログラム的にアクセスするには:

  1. FacesContextを使用してバインディング・コンテナにアクセスするマネージドBeanメソッドを作成して、AttributesModelを取得し、必要なビジネス・ロジックを適用します。
  2. 動的コンポーネントを含むページでは、コマンド・コンポーネントをページに追加して、そのactionListenerプロパティをマネージドBeanメソッドにパインドします。

次の例は、現在行の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コンポーネントおよびバインディングの変更

「データ・コントロール」パネルを使用して、任意のタイプのフォーム(動的フォーム以外)およびフォーム上のADFバインディングを変更します。要件に応じてUIの表示をカスタマイズできます。

「データ・コントロール」パネルを使用してフォーム(動的フォームを除く)を作成すると、属性の削除、表示順序の変更、データの表示に使用するコンポーネントの変更、およびコンポーネントのバインド先の属性の変更を実行できます。

ノート:

次の手順では、動的フォームの表示方法は変更できません。表示情報は、ビュー・オブジェクトまたはエンティティ・オブジェクトで変更する必要があります。

UIコンポーネントおよびバインディングの変更方法

「データ・コントロール」パネルからドロップしたデフォルト・コンポーネントについて、一部の内容を変更できます。「構造」ウィンドウを使用して、コンポーネントの表示順序の変更、新規コンポーネントの追加や既存のコンポーネントの変更、またはコンポーネントの削除を行えます。「プロパティ」ウィンドウを使用すると、バインディングの変更や削除またはコンポーネントに対して表示されるラベルの変更が行えます。

始める前に:

生成された後の、UIコンポーネントでの作業について理解しておくと役立ちます。詳細は、「フォーム上のUIコンポーネントおよびバインディングの変更」を参照してください。

また、その他のADF機能について理解しておくと役立ちます。詳細は、「データバインド・ページの追加機能」を参照してください。

次のタスクを完了する必要があります。

デフォルト・コンポーネントおよびバインディングを変更するには:

  1. 構造ウィンドウを使用して、次の処理を行います。
    • UIコンポーネントをツリー内で上下にドラッグして、順序を変更します。黒線の矢印は、UIコンポーネントの配置先を示します。

    • UIコンポーネントの追加。「構造」ウィンドウで既存のUIコンポーネントを右クリックし、新規コンポーネントの配置場所として、選択したコンポーネントの前、後ろ、内部のいずれかを選択します。その後、リストからUIコンポーネントを選択します。

    • UIコンポーネントのバインド。「構造」ウィンドウで既存のUIコンポーネントを右クリックし、「ADFコントロールにバインド」を選択します。その後、コンポーネントをバインドするオブジェクトを選択できます。

    • UIコンポーネントの再バインド。「構造」ウィンドウで既存のUIコンポーネントを右クリックし、「別のADFコントロールに再バインド」を選択します。その後、コンポーネントをバインドする新しいコントロール・オブジェクトを選択できます。

    • UIコンポーネントの削除。コンポーネントを右クリックして、「削除」を選択します。コンポーネントを保持するが、バインディングを削除する場合は、「プロパティ」ウィンドウを使用する必要があります。ステップ2の2番目の箇条書きを参照してください。

  2. 「構造」ウィンドウで選択されたUIコンポーネントを使用して、「プロパティ」ウィンドウで次の操作を実行できます。
    • UIコンポーネントのADF以外のバインディングの追加。「値」フィールドにEL式を入力するか、ドロップダウン・メニューを使用して「編集」を選択します。

    • UIコンポーネントのバインディングの削除。EL式を削除します。

    • UIコンポーネントのラベルの変更。デフォルトでは、ラベルはバインディングのヒントのlabelプロパティにバインドされます。このプロパティにより、エンティティ・オブジェクト属性またはビュー・オブジェクト属性に対して定義したラベルのUIコントロール・ヒントをページで使用できるようになります。UIヒントを使用すると、値の一度の変更で、ラベルを表示するすべてのページに同じ値を表示できます。

      現在のページのラベルのみを変更できます。その場合は、label属性を選択します。ラベル値を別のもの(たとえば、プロパティ・ファイルやリソース・ファイルのキー)にバインドするために、テキストまたはEL式を入力します。

      たとえば、製品名の表示に使用するinputTextコンポーネントでは、Label属性に対して次のようなコードが含まれます。

      #{bindings.ProductName.hints.label}
      

      この式を変更して、プロパティ・ファイルのキーにバインドすることもできます。次に例を示します。

      #{properties['productName']}
      

      この例のpropertiesは、プロパティ・ファイルのロードに使用する、JSFページで定義された変数です。

属性およびバインディングを変更した場合の処理

UIコンポーネントを移動または変更して属性の表示方法を変更すると、JSFページの対応するコードが変更されます。バインディング・エディタを使用してバインディングを追加または変更すると、JDeveloperによって、JSFページにコードが追加され、ページ定義ファイルに適切な要素が追加されます。