ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド
11gリリース1(11.1.1.6.0)
B61007-04
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

2 Java EE WebアプリケーションでのADFモデル・データ・バインディングの使用方法

この章では、EJBセッションBeanに対してADFモデルのデータ・コントロールを作成する方法、さらに「データ・コントロール」パネルを使用して、データバインドされたUIコンポーネントをJSF Webページで作成する方法について説明します。

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

ADFモデル・データ・バインディングの使用の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。

2.1 ADFデータ・バインディングの概要

ADFモデルによって、ユーザー・インタフェース・テクノロジとビジネス・サービス実装の分離を可能にする2つの概念(データ・コントロール宣言的バインディング)が実装されています。データ・コントロールでは、標準のメタデータ・インタフェースを使用してビジネス・サービスの実装技術を抽象化し、使用されるプロパティ、メソッドおよびタイプに関する情報など、Beanの操作とデータ・コレクションを表します。JDeveloperを使用すると、ページにドラッグ・アンド・ドロップ可能なアイコンとして情報が表示されます。アイコンを使用し、パネルからページのビジュアル・エディタにドラッグ・アンド・ドロップして、データバインドされたHTML要素(JSPページの場合)、データバインドされたUIコンポーネント(JSFページの場合)およびデータバインドされたSwing UIコンポーネント(ADF Swingパネルの場合)を作成できます。JDeveloperによって、ページからサービスへのバインディングを表すメタデータが自動的に作成されます。実行時、ADFモデル・レイヤーは、データ・コントロールとバインディングの両方に対する適切なXMLファイルからメタデータ情報を読み取り、ユーザー・インタフェースとビジネス・サービスとの間の2方向の接続を実装します。

宣言的なバインディングによって、データ・コントロール内のデータ・コレクションのデータへのアクセスと、その操作の実行の詳細が抽象化されます。宣言的なバインディング・オブジェクトには、次の3つの基本的な種類があります。

図2-1は、バインディングによりUIコンポーネントをデータ・コントロールのコレクションとメソッドに関連付ける様子を示しています。

図2-1 バインディングによるデータ・コントロールへのUIコンポーネントの関連付け

バインディングによるデータへのコンポーネントの関連付け

ページのUIコンポーネントをサポートするバインディングのグループは、ページ定義ファイルというページ固有のXMLファイルに記述されます。ADFモデル・レイヤーで実行時にこのファイルが使用され、ページのバインディングがインスタンス化されます。これらのバインディングは、バインディング・コンテナと呼ばれるリクエスト・スコープ・マップに保持されます。JSFアプリケーションでは、バインディング・コンテナは、各ページ・リクエスト時にEL式#{bindings}を使用してアクセスできます。


ヒント:

ADF EL式の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFデータ・バインディングEL式の作成に関する項を参照してください。

ADFモデル・レイヤーをデータ・バインドに使用するには、サービスに対してデータ・コントロールを作成する必要があります。データ・コントロールは、「データ・コントロール」パネルにアイコンとして表示されます。これを使用してページを宣言的に作成すると、ページのコンポーネントがサービスに自動的にバインドされます。

2.2 ADFデータ・コントロールを使用したサービスの公開

アプリケーションのサービスの準備ができたら、JDeveloperを使用して、UIコンポーネントとサービスとの宣言的バインドに必要な情報を提供するデータ・コントロールを作成できます。Java EEアプリケーションでは、通常、データベース内の表を表すエンティティBeanを作成し、全EJBに対するセッション・ファサードを作成します。このファサードは、ベースとなるエンティティへの一元化されたインタフェースです。ADFアプリケーションでは、セッションBeanに対するデータ・コントロールを作成できます。データ・コントロールには、セッションBean下のすべてのEJBに関する記述が含まれます。データ・コントロールは、実行時にバインディングが使用するサービスの機能を定義する多数のXMLメタデータ・ファイルで構成されます。

たとえば、Suppliersモジュールでは、多数のリレーショナル・データベース表が含まれるFODデータベース・スキーマが使用されます。モジュールには、Suppliersモジュールで使用されるスキーマ内の表を表す多数のエンティティBeanが含まれます。Addresses Bean、Product Bean、Persons Beanなどがあります。モジュールには、2つのセッションBeanも含まれます。SupplierFacade Beanは、表から作成されるBeanへのアクセスに使用され、GenericServiceFacade Beanには、アプリケーション内のすべてのBeanによって使用される汎用サービス・メソッドが含まれます。これらの各セッションBeanに対してデータ・コントロールが存在し、開発者は、Beanに含まれるデータとロジックを使用して宣言的にUIページを作成できます。

2.2.1 ADFデータ・コントロールの作成方法

データ・コントロールは、JDeveloperのアプリケーション・ナビゲータ内から作成します。

始める前に:

  1. JPA/EJB 3.0エンティティを作成します。詳細は、JDeveloperのオンライン・ヘルプの「永続レイヤーの構築」を参照してください。

  2. 1つ以上のセッションBeanをエンティティに対して作成します。詳細は、JDeveloperのオンライン・ヘルプの「セッション・ファサード設計パターンでのビジネス・プロセスの実装」を参照してください。

    エンティティとセッションBeanを作成する際、次の点に注意してください。

    • クラスが有効なデータ・コントロール・ソースであるためには、JavaBeansの仕様に準拠している必要があります。publicデフォルト・コンストラクタを持つ必要があります。

    • データ・コントロールに対応するBeanを表すメタデータ・ファイルは、Beanのクラス名に基づいた名前が付けられるため、同じ名前のBeanがある場合、それらのBeanが異なるパッケージに含まれるようにする必要があります。1つのパッケージに同じ名前のBeanが2つある場合、一方のメタデータ・ファイルによって他方が上書きされます。

    • データ・コントロールの作成に使用されるBeanの名前を変更する場合、データ・コントロールを再作成する必要があります。

データ・コントロールを作成する手順:

  1. アプリケーション・ナビゲータで、データ・コントロールの作成対象のセッションBeanを右クリックします。

  2. ポップアップ・メニューから、「データ・コントロールの作成」を選択します。

  3. 「EJBインタフェースの選択」ダイアログで、「ローカル」を選択します。

2.2.2 データ・コントロール作成時のプロジェクト内の処理

EJBセッションBeanに基づいてデータ・コントロールを作成すると、データ・コントロールには、Beanで公開されているすべてのメソッド、ベースになるエンティティBeanとこのBeanで公開されるメソッドとプロパティに関する記述が含まれます。

データ・コントロールでサービスおよびバインディングを直接使用するために、JDeveloperで次のメタデータXMLファイルが作成されます。

  • データ・コントロール定義ファイル(DataControls.dcx)。このファイルでは、各データ・コントロールのファクトリ・クラスとIDが定義されます。データ・コントロールの動作を決める設定も含まれます。たとえば、.dcxファイルを使用して、サービスでトランザクションをサポートするかどうかなどのグローバル・プロパティを設定できます。設定を変更するには、概要エディタでデータ・コントロールを選択し、プロパティ・インスペクタでプロパティの値を変更します。図2-2は、JDeveloperの概要エディタおよびプロパティ・インスペクタでのDataControls.dcxファイルを示しています。

    図2-2 概要エディタおよびプロパティ・インスペクタでのDataControls.dcxファイル

    プロパティ・インスペクタで設定されるdcxファイルの値

    例2-1は、対応するXMLファイル(ソース・タブをクリックすると、表示される)のコードを示しています。

    例2-1 DataControls.dcxファイル

    <?xml version="1.0" encoding="UTF-8" ?>
    <DataControlConfigs xmlns="http://xmlns.oracle.com/adfm/configuration"
                        version="11.1.1.54.7" id="DataControls"
                        Package="oracle.fodemo.supplier.model">
      <AdapterDataControl id="SupplierFacadeLocal"
                       FactoryClass="oracle.adf.model.adapter.DataControlFactoryImpl"
                       ImplDef="oracle.adfinternal.model.adapter.ejb.EjbDefinition"
                       SupportsTransactions="false" SupportsSortCollection="true"
                       SupportsResetState="false" SupportsRangesize="false"
                       SupportsFindMode="false" SupportsUpdates="true"
                       Definition="oracle.fodemo.supplier.service.SupplierFacadeLocal"
                       BeanClass="oracle.fodemo.supplier.service.SupplierFacadeLocal"
                       xmlns="http://xmlns.oracle.com/adfm/datacontrol">
        <CreatableTypes>
          <TypeInfo FullName="oracle.fodemo.supplier.model.CountryCode"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.ProductCategory"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.Addresses"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.AddressUsage"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.Person"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.Supplier"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.Product"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.ProductImage"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.ProductTranslation"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.WarehouseStockLevel"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.OrderItem"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.LookupCode"/>
        </CreatableTypes>
        <Source>
          <ejb-definition ejb-version="3.0" ejb-name="SupplierFacade"
                          ejb-type="Session"
           ejb-business-interface="oracle.fodemo.supplier.service.SupplierFacadeLocal"
                          ejb-interface-type="local"
                       initial-context-factory="weblogic.jndi.WLInitialContextFactory"
          DataControlHandler="oracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler"
                          xmlns="http://xmlns.oracle.com/adfm/adapter/ejb"/>
        </Source>
      </AdapterDataControl>
      <AdapterDataControl id="GenericServiceFacadeLocal"
    . . .
      </AdapterDataControl>
    </DataControlConfigs>
    
  • このサービスによって公開される各エンティティ・オブジェクトと構造化オブジェクトに対する構造定義ファイル。これらのファイルでは、属性、アクセッサおよび操作の表示方法と動作が定義されます。たとえば、属性のラベルのクライアントでの表示方法を設定できます。構造定義ファイルには、次の情報が含まれます。

    • 属性: サービスで使用可能な属性を表します。これらの属性のUIでの表示方法を定義するUIヒントを設定できます。属性値が必須か、一意である必要があるか、表示可能かどうかなどの他のプロパティを設定することもできます。UIヒントの設定の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のビュー・オブジェクトの属性コントロール・ヒントの定義に関する項を参照してください。


      注意:

      ビュー・オブジェクトは、SQL問合せのカプセル化と結果の操作の単純化に使用されるADF Business Componentsです。この項を読む際、ビュー・オブジェクトをBeanと読み替えてください。

      属性の検証を設定したり、カスタム・プロパティを作成することもできます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の組込み宣言的検証ルールの使用に関する項およびカスタム・プロパティによって駆動される汎用機能の実装方法に関する項を参照してください。

    • アクセッサ: 様々なアクセッサ・メソッドを表します。

    • 操作: サービスに対するカスタム・メソッドとパラメータを表します。

    図2-3は、SuppliersモジュールのAddresses Beanの構造定義ファイルを示しています。

    図2-3 概要エディタでの構造ファイル

    構造ファイル

    例2-2は、対応するXMLファイル(ソース・タブをクリックすると、表示される)のコードを示しています。

    例2-2 構造ファイル

    <?xml version="1.0" encoding="UTF-8" ?>
    <JavaBean xmlns="http://xmlns.oracle.com/adfm/beanmodel" version="11.1.1.54.7"
              id="Addresses" Package="oracle.fodemo.supplier.model"
              BeanClass="oracle.fodemo.supplier.model.Addresses" isJavaBased="true">
      <Attribute Name="address1" Type="java.lang.String" Precision="40">
        <Properties>
          <SchemaBasedProperties>
            <LABEL ResId="oracle.fodemo.supplier.model.Addresses.address1_LABEL"/>
            <TOOLTIP ResId="oracle.fodemo.supplier.model.Addresses.address1_TOOLTIP"/>
            <DISPLAYWIDTH Value="40"/>
          </SchemaBasedProperties>
        </Properties>
      </Attribute>
      <Attribute Name="address2" Type="java.lang.String" Precision="40">
        <Properties>
          <SchemaBasedProperties>
            <LABEL ResId="oracle.fodemo.supplier.model.Addresses.address2_LABEL"/>
            <TOOLTIP ResId="oracle.fodemo.supplier.model.Addresses.address2_TOOLTIP"/>
            <DISPLAYWIDTH Value="40"/>
          </SchemaBasedProperties>
        </Properties>
      </Attribute>
    . . .
      <AccessorAttribute id="addressUsageList" IsCollection="true"
                         RemoveMethod="removeAddressUsage"
                         AddMethod="addAddressUsage"
                         BeanClass="oracle.fodemo.supplier.model.AddressUsage"
                         CollectionBeanClass="UpdateableCollection">
        <Properties>
          <Property Name="RemoveMethod" Value="removeAddressUsage"/>
          <Property Name="AddMethod" Value="addAddressUsage"/>
        </Properties>
      </AccessorAttribute>
    . . .
      <MethodAccessor IsCollection="false"
                      Type="oracle.fodemo.supplier.model.AddressUsage"
                      BeanClass="oracle.fodemo.supplier.model.AddressUsage"
                      id="addAddressUsage" ReturnNodeName="AddressUsage">
        <ParameterInfo id="addressUsage"
                       Type="oracle.fodemo.supplier.model.AddressUsage"
                       isStructured="true"/>
      </MethodAccessor>
      <MethodAccessor IsCollection="false"
                      Type="oracle.fodemo.supplier.model.AddressUsage"
                      BeanClass="oracle.fodemo.supplier.model.AddressUsage"
                      id="removeAddressUsage" ReturnNodeName="AddressUsage">
        <ParameterInfo id="addressUsage"
                       Type="oracle.fodemo.supplier.model.AddressUsage"
                       isStructured="true"/>
      </MethodAccessor>
    . . .
      <ConstructorMethod IsCollection="true"
                         Type="oracle.fodemo.supplier.model.Addresses"
                         BeanClass="oracle.fodemo.supplier.model.Addresses"
                         id="Addresses">
        <ParameterInfo id="address1" Type="java.lang.String" isStructured="false"/>
        <ParameterInfo id="address2" Type="java.lang.String" isStructured="false"/>
        <ParameterInfo id="addressId" Type="java.lang.Long" isStructured="false"/>
        <ParameterInfo id="city" Type="java.lang.String" isStructured="false"/>
        <ParameterInfo id="countryId" Type="java.lang.String" isStructured="false"/>
        <ParameterInfo id="createdBy" Type="java.lang.String" isStructured="false"/>
        <ParameterInfo id="creationDate" Type="java.sql.Timestamp"
                       isStructured="false"/>
        <ParameterInfo id="lastUpdateDate" Type="java.sql.Timestamp"
                       isStructured="false"/>
        <ParameterInfo id="lastUpdatedBy" Type="java.lang.String"
                       isStructured="false"/>
        <ParameterInfo id="latitude" Type="java.lang.Long" isStructured="false"/>
        <ParameterInfo id="longitude" Type="java.lang.Long" isStructured="false"/>
        <ParameterInfo id="objectVersionId" Type="java.lang.Long"
                       isStructured="false"/>
        <ParameterInfo id="postalCode" Type="java.lang.String"
                       isStructured="false"/>
        <ParameterInfo id="stateProvince" Type="java.lang.String"
                       isStructured="false"/>
      </ConstructorMethod>
      <ConstructorMethod IsCollection="true"
                         Type="oracle.fodemo.supplier.model.Addresses"
                         BeanClass="oracle.fodemo.supplier.model.Addresses"
                         id="Addresses"/>
      <ResourceBundle>
        <PropertiesBundle xmlns="http://xmlns.oracle.com/adfm/resourcebundle"
                          PropertiesFile="oracle.fodemo.supplier.model.ModelBundle"/>
      </ResourceBundle>
    </JavaBean>
    

JDeveloperで、データバインドされたUIコンポーネントの作成に使用できるアイコンの「データ・コントロール」パネルへの追加も行われます。「データ・コントロール」パネルには、アプリケーションのビジネス・サービスに対して作成されたすべてのデータ・コントロールがリストされます。また、UIコンポーネントへのバインドに使用できるコレクション、メソッドおよび組込み操作がすべて公開されます。


ヒント:

「データ・コントロール」パネルが表示されない場合、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「データ・コントロール」パネルの開き方に関する項でパネルを開く手順を確認してください。

セッションBeanに対してデータ・コントロールが作成され、ベースになるBeanに対するアクセッサ・メソッドを含むようそのセッションBeanが構成されていた場合、それらのBeanは、アクセッサによって返される、Beanのインスタンス名と一致する名前のコレクションとして表示されます。「データ・コントロール」パネルは、マスター・データ・コレクションの下にネストされたディテール・データ・コレクションを表示することで、データ・モデル内のマスター/ディテール階層を示します。たとえば、図2-4は、Fusion Order DemoアプリケーションのSuppliersモジュールの「データ・コントロール」パネルを示しています。AddressesPersonおよびProduct Beanがすべて、「データ・コントロール」パネルで、アクセッサによって返されるコレクションとして表されていることに注意してください。

「データ・コントロール」パネルには、セッションBeanの各サービス・メソッドも、メソッド名と一致する名前のメソッド・アイコンとして表示されます。メソッドが引数をとる場合、その引数は、メソッドのノード内にネストされたパラメータとして「パラメータ」ノードに表示されます。図2-4に示すように、メソッドによって返されるオブジェクトも表示されます。

図2-4 「データ・コントロール」パネル

サンプルのデータ・コントロール・パレット

返される各コレクションまたはオブジェクトには、関連付けられているBeanに定義された属性およびカスタム・メソッドが表示されます。図2-5は、supplierFindAllアクセッサ・メソッドによって返されるSupplier Beanに定義されている属性とメソッドを示しています。

図2-5 返されるコレクションの子ノード

コレクションの子ノード

デフォルトでは、Beanで問合せ可能な各属性に対して暗黙的な表示基準が作成されます。それらは、図2-5に示すように、「名前付き基準」ノードの下に「すべての問合せ可能な属性」ノードとして表示されます。このノードは、第7章「データバインドされた検索フォームの作成」で説明するような、クイック検索フォームの作成に使用されます。

図2-5に示すように、返されるコレクションの下の「操作」ノードには、使用可能な組込み操作がすべて表示されます。操作が1つ以上のパラメータをとる場合、そのパラメータは、ネストされた「パラメータ」ノードに表示されます。実行時に、これらのデータ・コレクション操作の1つがデータ・バインディング・レイヤーによって名前別に起動されると、データ・コントロールは、組込み機能を処理するBeanインタフェース上の適切なメソッドにそのコールを委譲します。ほとんどの組込み操作は、現在の行に作用します。execute操作のみが、データ・コントロール自体をリフレッシュします。組込み操作は、次のとおりです。

  • Create: 現在の行になる新規行を作成しますが、挿入はしません。

  • Delete: 現在の行を削除します。

  • Execute: アクセッサ・メソッドを実行または再実行することによって、データ・コレクションをリフレッシュします。

  • First: 行セット内の最初の行を現在の行に設定します。

  • Last: 行セット内の最後の行を現在の行に設定します。

  • Next: 行セット内の次の行を現在の行に設定します。

  • Next Set: 1つ後の行のセットに移動します。

  • Previous: 行セット内の前の行を現在の行に設定します。

  • Previous Set: 1つ前の行のセットに移動します。

  • removeCurrentRowWithKey: パラメータとして渡された行キーのシリアライズされた文字列表現を使用して行の検索を試行します。検出されると、その行が削除されます。

  • setCurrentRowWithKey: パラメータとして渡された行キーのシリアライズされた文字列表現を使用して行の検索を試行します。検出されると、その行が現在の行になります。

  • setCurrentRowWithKeyValue: パラメータとして渡された主キーの属性値を使用して行の検索を試行します。検出されると、その行が現在の行になります。


注意:

デフォルトでは、JavaBeansはrowIndexをキーと見なします。明示的にキーを定義しない場合、索引が使用されます。

「データ・コントロール」パネルは、データ・コントロールを作成すると作成されるDataControls.dcxと構造定義ファイルを直接表したものです。ファイルを編集することで、パネルに表示されている要素を変更できます。


注意:

基礎となるサービスが変更されたら必ず、変更を表示するためにデータ・コントロールを手動でリフレッシュする必要があります。データ・コントロールをリフレッシュするには、「データ・コントロール」パネルのヘッダーにある「リフレッシュ」アイコンをクリックします。

2.3 「データ・コントロール」パネルの使用

「データ・コントロール」パネルから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインドされたユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、選択したデータ・コントロールにそのコンポーネントをバインドするために必要な、様々なコードおよびオブジェクトがJDeveloperによって自動的に作成されます。

「データ・コントロール」パネルでは、各オブジェクトは特定のアイコンで表されます。表2-1は、各アイコンが表すもの、「データ・コントロール」パネルの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。

表2-1 「データ・コントロール」パネルのアイコンおよびオブジェクト階層

アイコン 名前 説明 作成できるコンポーネント

データ・コントロール・アイコン


データ・コントロール

データ・コントロールを表します。データ・コントロール自体を使用してUIコンポーネントを作成することはできませんが、その下に表示される子オブジェクトは、いずれも使用できます。ビジネス・サービスの定義方法によっては、複数のデータ・コントロールが存在することがあります。

他のオブジェクトのコンテナとして機能し、作成には使用されません。

アクセッサ戻りアイコン。


アクセッサによって返されるコレクション

ビジネス・サービスでBean形式のアクセッサ・メソッドによって返されるオブジェクトを表します。たとえば、セッションBeanを作成する際、セッションBean下に各Javaエンティティに対するアクセッサ・メソッドも作成するよう選択した場合、アクセッサによって返されるコレクションがそれらの各エンティティに対して表示されます。

エンティティに他のエンティティ(外部キーなど)への関係が含まれている場合、子アクセッサによって返されるコレクションがそのエンティティに対して表示されます。ADFでは、親エンティティと子エンティティ間の関係は、マスター/ディテール関係と呼ばれます。

コレクション下の子には、コレクションを構成する要素の属性、コレクション全体に対する操作、コレクション内の各要素の行に対する操作などがあります。

コレクションの場合: フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント、およびマスター/ディテール・ウィジェット。

単一オブジェクトの場合: フォーム、マスター/ディテール・ウィジェットおよび選択リスト。

フォームおよびナビゲーション・コンポーネントの作成の詳細は、第3章「データバインドされた基本的なページの作成」を参照してください。

表の作成の詳細は、第4章「ADFによるデータバインドされた表の作成」を参照してください。

ツリーおよび他のマスター/ディテールUIコンポーネントの作成の詳細は、第5章「マスター/ディテール・データの表示」を参照してください。

リストの作成の詳細は、第6章「データバインドされた選択リストの作成」を参照してください。

属性アイコン


属性

オブジェクト内の個別のデータ要素(行の属性など)を表します。属性は、自分の属するコレクションまたはメソッド戻りの下に、子として表示されます。

ラベル、テキスト・フィールドおよび選択リストの各コンポーネント。

テキスト・フィールドの作成の詳細は、3.2項「属性を使用したテキスト・フィールドの作成方法」を参照してください。

メソッド・アイコン


メソッド

データ・コントロールの操作またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、または単一の値と構造のコレクションを戻すことができます。

コマンド・コンポーネント。

パラメータをとるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。

メソッドからのコマンド・コンポーネントの作成の詳細は、3.6項「既存レコードを編集するフォームの作成」を参照してください。

パラメータを使用するフォームの作成の詳細は、3.5項「パラメータをとるメソッドを使用するフォームの作成」を参照してください。

メソッド戻りアイコン。


メソッド戻り

カスタム・メソッドによって戻されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。

メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッド戻りの下に子として表示されるオブジェクトは、コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、または親コレクションで実行できる操作などです。

単一の値の場合: テキスト・フィールドおよび選択リスト。

コレクションの場合: フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント。

単一値のメソッド戻りがドロップされた場合、メソッドはフレームワークにより自動的に起動されません。ユーザーは、メソッドを起動するために、実行可能ファイルとして起動アクションも作成するか、対応するメソッドをボタンとしてドロップする必要があります。

データ・コントロール操作アイコン


操作

親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。データ・コントロール操作は、コレクションまたはメソッド戻りの下の「操作」ノードにあります。特定のコレクションまたはメソッド戻りの子である操作は、それらのオブジェクトにのみ作用します。

1つ以上のパラメータが操作に必要な場合、それらのパラメータは操作の下の「パラメータ」ノードにリストされます。

ボタンやリンクなどのコマンド・コンポーネント。

操作からのコマンド・コンポーネントの作成の詳細は、3.4項「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。

パラメータ・アイコン


パラメータ

メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「パラメータ」ノード内に表示されます。

ラベル、テキストおよび選択リストの各コンポーネント。


2.3.1 「データ・コントロール」パネルの使用方法

JDeveloperは、ドロップするデータ・コントロール項目に対してそれぞれ選択できるUIコンポーネントの事前定義済セットを備えています。

「データ・コントロール」パネルを使用してUIコンポーネントを作成する手順:

  1. 「データ・コントロール」パネルで項目を選択し、ページのビジュアル・エディタにその項目をドラッグします。パネルの各項目の定義は、表2-1を参照してください。

  2. ポップアップ・メニューから、UIコンポーネントを選択します。

    「データ・コントロール」パネルから項目をドラッグしてページにドロップすると、ドロップした項目に使用できるすべてのデフォルトUIコンポーネントのポップアップ・メニューが表示されます。

    図2-6は、アクセッサによって返されるコレクションが「データ・コントロール」パネルからページにドロップされる際に表示されるポップアップ・メニューを示しています。

    図2-6 「データ・コントロール」パネルのポップアップ・メニュー

    データ・コントロール・パレットのポップアップ・メニュー

    ポップアップ・メニューから選択したコンポーネントに応じて、そのコンポーネントの外観を定義するためのダイアログがJDeveloperで表示されます。

    図2-7に示すように、結果のUIコンポーネントがJDeveloperのビジュアル・エディタに表示されます。

    図2-7 データバインドされたUIコンポーネント: ADF表

    データバインドされたUIコンポーネントの例

ヒント:

「データ・コントロール」パネルを使用して自動的にバインドされるUIコンポーネントを作成するかわりに、UIをまず作成し、コンポーネントをADFモデル・レイヤーにバインドできます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の最初に単純なUIを開発する方法の使用に関する項を参照してください。

2.3.2 「データ・コントロール」パネルを使用したUIコンポーネントの作成時の処理

「データ・コントロール」パネルを使用してWebアプリケーションを構築すると、JDeveloperによって次の処理が行われます。

  • DataBindings.cpxファイルがプロジェクトのデフォルト・パッケージに作成されます(このファイルが存在しない場合のみ)。また、そのページ用にエントリが追加されます。

    DataBindings.cpxファイルは、アプリケーションのバインディング・コンテキスト(使用可能なデータ・コントロールとデータ・バインディング・オブジェクトのリストを保持するコンテナ・オブジェクト)を定義します。各DataBindings.cpxファイルによって、個々のページがページ定義ファイルに含まれるバインディング定義にマップされ、これらのページが使用するデータ・コントロールが登録されます。図2-8は、JDeveloperの概要エディタでのDataBindings.cpxファイルを示しています。

    図2-8 概要エディタでのDataBindings.cpxファイル

    cpxファイル

    例2-3は、対応するXMLファイルのコードを示しています。

    例2-3 DataBindings.cpxファイル

    <?xml version="1.0" encoding="UTF-8" ?>
    <Application xmlns="http://xmlns.oracle.com/adfm/application"
                 version="11.1.1.54.7" id="DataBindings" SeparateXMLFiles="false"
                 Package="oracle.fodemo.supplier" ClientType="Generic"
                 ErrorHandlerClass="oracle.fodemo.frmwkext.CustomErrorHandlerImpl">
      <definitionFactories>
        <factory nameSpace="http://xmlns.oracle.com/adf/controller/binding"
                 className="oracle.adf.controller.internal.binding.
                                                      TaskFlowBindingDefFactoryImpl"/>
        <dtfactory className="oracle.adf.controller.internal.dtrt.binding.
                                                             BindingDTObjectFactory"/>
      </definitionFactories>
      <pageMap>
        <page path="/templates/StoreFrontTemplate.jspx"
              usageId="oracle_fodemo_supplier_StoreFrontTemplatePageDef"/>
        <page path="/browse.jspx" usageId="oracle_fodemo_supplier_browsePageDef"/>
        <page path="/supplier/supplierDetails.jspx"
              usageId="oracle_fodemo_supplier_supplierdetailPageDef"/>
        <page path="/login_error.jspx"
              usageId="oracle_fodemo_supplier_login_errorPageDef"/>
    . . .
      </pageMap>
      <pageDefinitionUsages>
        <page id="oracle_fodemo_supplier_StoreFrontTemplatePageDef"
              path="templates.StoreFrontTemplatePageDef"/>
        <page id="oracle_fodemo_supplier_browsePageDef"
              path="oracle.fodemo.supplier.pageDefs.browsePageDef"/>
        <page id="oracle_fodemo_supplier_supplierdetailPageDef"
              path="oracle.fodemo.supplier.pageDefs.supplierdetailPageDef"/>
        <page id="oracle_fodemo_supplier_login_errorPageDef"
              path="oracle.fodemo.supplier.pageDefs.login_errorPageDef"/>
    . . .
      </pageDefinitionUsages>
      <dataControlUsages>
        <dc id="GenericServiceFacadeLocal"
            path="oracle.fodemo.supplier.model.GenericServiceFacadeLocal"/>
        <dc id="SupplierFacadeLocal"
            path="oracle.fodemo.supplier.model.SupplierFacadeLocal"/>
      </dataControlUsages>
    </Application>
    

    .cpxファイルの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のDataBindings.cpxファイルの使用に関する項を参照してください。

  • META-INFディレクトリにadfm.xmlファイルが作成されます。このファイルによってDataBindings.cpxファイルのレジストリが作成され、アプリケーション・メタデータ・レイヤーによって使用されて、アプリケーションのカスタマイズとパーソナライズが行われます。例2-4は、adfm.xmlファイルの例を示しています。

    例2-4 adfm.xmlファイル

    <MetadataDirectory xmlns="http://xmlns.oracle.com/adfm/metainf"
                       version="11.1.1.0.0">
      <DataBindingRegistry path="oracle/fodemo/supplier/DataBindings.cpx"/>
    </MetadataDirectory>
    
  • Webアプリケーションの場合、web.xmlファイルにADFバインディング・フィルタが登録されます。

    ADFバインディング・フィルタにより、バインディング・コンテキストへのアクセスが必要なHTTPリクエストが、すべて処理されます。フィルタの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFデータ・バインディング・フィルタの構成に関する項を参照してください。

  • プロジェクトに次のライブラリが追加されます。

    • ADFモデル・ランタイム

    • ADFモデル汎用ランタイム

  • パッケージ定義ファイルがページ定義サブパッケージに追加されます(ページに対してファイルが存在しない場合)。デフォルトのサブパッケージは、adfmsrcディレクトリにあるview.pageDefsです。

    ページ定義ファイル(pageNamePageDef.xml)は、アプリケーションのビュー・レイヤーにある各ページのADFバインディング・コンテナを定義します。バインディング・コンテナでは、すべてのADFバインディング・オブジェクトへのランタイム・アクセスが行われます。図2-9は、JDeveloperの概要エディタでのページ定義ファイルを示しています。

    図2-9 ページ定義ファイル

    ページ定義ファイル
  • ページで参照されるバインディング・オブジェクトの定義の追加も含めて、ページ定義ファイルが構成されます。例2-5は、ページ定義の対応するXMLファイルを示しています。

    例2-5 ページ定義ファイル

    <pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
                    version="11.1.1.54.43" id="browsePageDef"
                    Package="oracle.fodemo.supplier.pageDefs">
      <parameters/>
      <executables>
        <variableIterator id="variables"/>
        <page path="templates.StoreFrontTemplatePageDef" id="pageTemplateBinding"
              Refresh="ifNeeded"/>
        <iterator Binds="root" RangeSize="25" DataControl="SupplierFacadeLocal"
                  id="SupplierFacadeLocalIterator"/>
        <accessorIterator MasterBinding="SupplierFacadeLocalIterator"
                          Binds="productFindAll" RangeSize="25"
                          DataControl="SupplierFacadeLocal"
                          BeanClass="oracle.fodemo.supplier.model.Product"
                          id="productFindAllIterator" Refresh="ifNeeded"/>
        <searchRegion Criteria="__ImplicitViewCriteria__"
                      Customizer="oracle.jbo.uicli.binding.JUSearchBindingCustomizer"
                      Binds="productFindAllIterator"
                      id="ImplicitViewCriteriaQuery" />
      </executables>
      <bindings>
        <tree IterBinding="productFindAllIterator" id="productFindAll">
          <nodeDefinition DefName="oracle.fodemo.supplier.model.Product"
                          Name="productFindAll0">
            <AttrNames>
              <Item Value="productId"/>
              <Item Value="productName"/>
              <Item Value="costPrice"/>
              <Item Value="listPrice"/>
              <Item Value="minPrice"/>
              <Item Value="productStatus"/>
            </AttrNames>
          </nodeDefinition>
        </tree>
        <methodAction id="removeProduct" RequiresUpdateModel="true"
                      Action="invokeMethod" MethodName="removeProduct"
                      IsViewObjectMethod="false" DataControl="SupplierFacadeLocal"
                      InstanceName="SupplierFacadeLocal.dataProvider">
          <NamedData NDName="product"
                  NDValue="${bindings.productFindAllIterator.currentRow.dataProvider}"
                     NDType="oracle.fodemo.supplier.model.Product"/>
        </methodAction>
        <action IterBinding="productFindAllIterator" id="Delete"
                RequiresUpdateModel="false" Action="removeCurrentRow"/>
      </bindings>
    </pageDefinition>
    

    ページ定義ファイルの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のページ定義ファイルに関する項を参照してください。

  • 事前作成済のコンポーネントがビュー・ページに追加されます。

    これらの事前作成済のコンポーネントには、ページ定義ファイルのバインディング・オブジェクトを参照するADFデータ・バインディングが含まれます。例2-6は、ADFモデル・データ・バインドを使用してバインドされたコンポーネントを含むJSFページを示しています。例2-5のページ定義ファイルで定義されているとおり、出力テキスト・コンポーネントの値は、productsFindAllバインディング・オブジェクトの値にバインドされていることに注意してください。

    例2-6 ADFモデル・データ・バインディングを使用したJSFページ

    .
    .
    .
    <af:column sortProperty="costPrice" sortable="false"
               headerText="#{bindings.productFindAll.hints.costPrice.label}"
               id="c6" align="right">
      <af:outputText value="#{row.costPrice}" id="ot1">
        <af:convertNumber groupingUsed="false"
                         pattern="#{bindings.productFindAll.hints.costPrice.format}"/>
      </af:outputText>
    </af:column>
    <af:column sortProperty="listPrice" sortable="false"
               headerText="#{bindings.productFindAll.hints.listPrice.label}"
               id="c1" align="right">
      <af:outputText value="#{row.listPrice}" id="ot6">
        <af:convertNumber groupingUsed="false"
                         pattern="#{bindings.productFindAll.hints.listPrice.format}"/>
      </af:outputText>
    </af:column>
    <af:column sortProperty="minPrice" sortable="false"
               headerText="#{bindings.productFindAll.hints.minPrice.label}"
               id="c3" align="right">
      <af:outputText value="#{row.minPrice}" id="ot3">
        <af:convertNumber groupingUsed="false"
                          pattern="#{bindings.productFindAll.hints.minPrice.format}"/>
      </af:outputText>
    </af:column>.
    .
    .
    .
    
  • ADF Facesを使用するアプリケーションの場合、ADF Facesコンポーネントで必要なすべてのファイルと構成可能な要素が追加されます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』を参照してください。

2.3.3 実行時に行われる処理

ページにADFバインディングが含まれている場合、実行時には、クライアントまたはコントローラから起動されたビジネス・サービスとのやり取りが、バインディング・コンテキストを介して、アプリケーションによって管理されます。バインディング・コンテキストは、アプリケーション内のすべてのデータ・コントロールおよびページ定義のランタイム・マップ(名前付きdataでEL式#{data}を使用してアクセス可能)です。

ADFライフサイクルで、図2-10に示すように、DataControls.dcxDataBindings.cpxおよびページ定義ファイルからADFバインディング・コンテキストが作成されます。DataControls.dcxファイルで、設計時にアプリケーションで使用可能なデータ・コントロールが定義され、DataBindings.cpxファイルで、実行時にアプリケーションで使用可能なデータ・コントロールが定義されます。DataBindings.cpxファイルには、アプリケーションのページで使用されるデータ・コントロールがすべてリストされ、ページ定義ファイルで定義済のバインディング・オブジェクトを含むバインディング・コンテナがWebページのURL、またはJava Swingアプリケーションの場合はJavaクラスにマップされます。ページ定義ファイルは、アプリケーション・ページで使用されるバインディング・オブジェクトを定義します。ページごとにページ定義ファイルが1つあります。

図2-10 ADFバインディング・ファイルの実行時の使用

dcx、cpx、ページ定義によってバインディング・コンテキストが構成されます

バインディング・コンテキストには、これらのオブジェクトの実際のライブ・インスタンスは含まれません。かわりに、マップには必要に応じてデータ・コントロールまたはバインディング・コンテナ・オブジェクトになる参照がまず含まれます。オブジェクト(ページ定義など)がアプリケーションから解放されると(タスク・フローが終了したり、リクエストの終了時にバインディング・コンテナまたはデータ・コントロールが解放される場合)、データ・コントロールおよびバインディング・コンテナは参照オブジェクトに戻ります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「Fusionページ・ライフサイクルの理解」を参照してください。

2.3.4 イテレータの結果のキャッシュについて

データ・コントロールでコレクションを変更する場合、変更されていることがADFモデル・レイヤーで認識されるよう、データ・コントロールでコレクションの新規インスタンスをインスタンス化する必要があります。つまり、クライアントのアクションによってコレクションが変更されることがありますが、コレクションの新規インスタンスを作成しないかぎり、その変更はUIに反映されないということです。ただし、パフォーマンス上の理由から、アクセッサとメソッド・イテレータでは結果セットがキャッシュされます(デフォルトでは、イテレータのcacheResults属性はtrueに設定されています)。この設定は、ページが初めてレンダリングされるときにイテレータがリフレッシュされ、コレクションの新規インスタンスが作成されることを意味します。部分ページ・レンダリングを使用したページのリフレッシュやページに戻るユーザー・ナビゲーションなどのページの再アクセス時、イテレータはリフレッシュされません。

たとえば、ページで表のソートが可能であるとします。ソート後にページをリフレッシュする必要があるため、部分ページ・レンダリングを使用して表をリフレッシュする、ソート・イベント用のコードをリスナーに追加します(詳細は、Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイドの部分的なページ・コンテンツのレンダリングに関する項を参照してください)。表のコレクションのインスタンスはすでにインスタンス化され、キャッシュされているため、アクセッサ・イテレータは再実行されません。このため、新しいソート順のコレクションの新規インスタンスは作成されず、ページ上のソート順は同じままになります。

この問題に対処するには、結果をキャッシュしないようイテレータを構成するか、ページのリフレッシュ時にイテレータの再実行に使用できるボタンをページに配置します。アクション属性をメソッドにバインドできるボタンがページにない場合、ページのリフレッシュ時に起動されるinvokeAction実行可能ファイルを使用できます。


注意:

ページでナビゲーション操作を使用してコレクション内を移動する場合、CacheResultsをfalseに設定しないでください。ナビゲーションが機能しなくなります。ボタンを使用してイテレータを再実行する必要があります。ナビゲーション操作の詳細は、第3.4項「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。


パフォーマンスに関するヒント:

結果セットをキャッシュしないようイテレータを設定し、結果セットが多数の行を返す可能性のあるコレクションの場合、パフォーマンスにマイナスの影響があります。大規模な結果セットの場合、invokeActionを使用する必要があります。

結果セットをキャッシュしないようイテレータを設定する手順:

  1. ページ定義ファイルを開き、結果をキャッシュしないイテレータを構造ウィンドウで選択します。

  2. プロパティ・インスペクタで、「詳細」セクションを展開し、CacheResultsfalseに設定します。

ボタンを使用してイテレータを再実行する手順:

  1. コンポーネント・パレットの「ADF Faces」ページから、「ボタン」をページにドラッグ・アンド・ドロップします。

  2. 構造ウィンドウで、ボタンを右クリックし、ポップアップ・メニューで「ADFコントロールにバインド」を選択します。

  3. 「ADFコントロールにバインド」ダイアログで、再実行するイテレータに関連付けられているアクセッサを展開し、アクセッサの「操作」ノードを展開して「実行」を選択します。

invokeActionを使用してイテレータを再実行する手順:

  1. ページ定義ファイルを開き、構造ウィンドウで「実行可能ファイル」を右クリックし、「実行可能ファイルの中に挿入」→「invokeAction」を選択します。

  2. 「invokeActionの挿入」ダイアログで、「ID」を一意の名前に設定します。「バインド」ドロップダウン・リストを使用して、再実行するイテレータを選択します。

  3. 新たに作成したinvokeActionが選択された状態で、プロパティ・インスペクタで「リフレッシュ」「prepareModel」に設定します。

    この設定によって、モデルの準備フェーズでアクセッサ・メソッドが起動されます。これによって、バインディング・コンテナがリフレッシュされます。

  4. RefreshConditionを、値が実際に変更された場合にのみリフレッシュが行われるようにするEL式に設定します。この条件が設定されている場合、invokeActionが2回コールされます。

    たとえば、#{(userState.refresh) and (!adfFacesContext.postback)}という式では、ページがリフレッシュされる場合にのみ、リフレッシュが行われます。

    ページのライフサイクルのフェーズとrefreshおよびrefreshCondition属性の使用の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のJSFとADFのページ・ライフサイクルに関する項を参照してください。

2.3.5 検証の構成について

ページ定義ファイルで、属性バインディングに検証を設定できます。ユーザーが、検証が定義されている属性のフィールド内のデータを編集または入力してフォームを送信すると、構成されているルールおよび条件に対してバインドされたデータが検証されます。検証が失敗すると、アプリケーションによりエラー・メッセージが表示されます。モデル・レイヤーの検証の設定の詳細および手順は、Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイドのADFモデル・レイヤーの検証の追加に関する項を参照してください。

検証を設定する際、表示されるメッセージを定義できます。デフォルトでは、これらのメッセージはクライアントのダイアログに表示されます。これらのメッセージがインラインで表示されるように構成できます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のエラー・メッセージの表示に関する項を参照してください。

独自のエラー処理クラスを作成して、メッセージの処理方法を変更することもできます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のエラー処理のカスタマイズに関する項を参照してください。