Oracle® Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド 11g Release 1 (11.1.1.7.0) B61007-05 |
|
前 |
次 |
この章では、EJBセッションBeanに対してADFモデルのデータ・コントロールを作成する方法、さらに「データ・コントロール」パネルを使用して、データバインドされたUIコンポーネントをJSF Webページで作成する方法について説明します。
この章の内容は次のとおりです。
ADFモデル・データ・バインディングの使用の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。
ADFモデルによって、ユーザー・インタフェース・テクノロジとビジネス・サービス実装の分離を可能にする2つの概念(データ・コントロールと宣言的バインディング)が実装されています。データ・コントロールでは、標準のメタデータ・インタフェースを使用してビジネス・サービスの実装技術を抽象化し、使用されるプロパティ、メソッドおよびタイプに関する情報など、Beanの操作とデータ・コレクションを表します。JDeveloperを使用すると、ページにドラッグ・アンド・ドロップ可能なアイコンとして情報が表示されます。アイコンを使用し、パネルからページのビジュアル・エディタにドラッグ・アンド・ドロップして、データバインドされたHTML要素(JSPページの場合)、データバインドされたUIコンポーネント(JSFページの場合)およびデータバインドされたSwing UIコンポーネント(ADF Swingパネルの場合)を作成できます。JDeveloperによって、ページからサービスへのバインディングを表すメタデータが自動的に作成されます。実行時、ADFモデル・レイヤーは、データ・コントロールとバインディングの両方に対する適切なXMLファイルからメタデータ情報を読み取り、ユーザー・インタフェースとビジネス・サービスとの間の2方向の接続を実装します。
宣言的なバインディングによって、データ・コントロール内のデータ・コレクションのデータへのアクセスと、その操作の実行の詳細が抽象化されます。宣言的なバインディング・オブジェクトには、次の3つの基本的な種類があります。
実行可能バインディング: データ・コレクションのスクロール処理やページング、または概要情報から詳細情報へのドリルダウンを可能にするユーザー・インタフェースの作成を容易にするイテレータ・バインディングなどがあります。実行可能バインディングには、他のページ内の一連のページの検索やネストを可能にするバインディングも含まれます。
値バインディング: データを表示するUIコンポーネントで使用します。値のバインディングは、単純なテキスト・フィールドで使用する最も基本的なものから、リスト、表、ツリーでのUIコントロールのニーズをサポートするような、より高度なリスト、ツリーのバインディングまで、様々な種類があります。
アクション・バインディング: ハイパーリンクやボタンなどのUIコマンド・コンポーネントで使用され、コードを記述することなく、データ・コレクションやデータ・コントロールの組込み操作またはカスタム操作を実行します。
図2-1は、バインディングによりUIコンポーネントをデータ・コントロールのコレクションとメソッドに関連付ける様子を示しています。
ページのUIコンポーネントをサポートするバインディングのグループは、ページ定義ファイルというページ固有のXMLファイルに記述されます。ADFモデル・レイヤーで実行時にこのファイルが使用され、ページのバインディングがインスタンス化されます。これらのバインディングは、バインディング・コンテナと呼ばれるリクエスト・スコープ・マップに保持されます。JSFアプリケーションでは、バインディング・コンテナは、各ページ・リクエスト時にEL式#{bindings}
を使用してアクセスできます。
ヒント: ADF EL式の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFデータ・バインディングEL式の作成に関する項を参照してください。 |
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ページを作成できます。
データ・コントロールは、JDeveloperのアプリケーション・ナビゲータ内から作成します。
始める前に:
JPA/EJB 3.0エンティティを作成します。詳細は、JDeveloperのオンライン・ヘルプの「永続レイヤーの構築」を参照してください。
1つ以上のセッションBeanをエンティティに対して作成します。詳細は、JDeveloperのオンライン・ヘルプの「セッション・ファサード設計パターンでのビジネス・プロセスの実装」を参照してください。
エンティティとセッションBeanを作成する際、次の点に注意してください。
クラスが有効なデータ・コントロール・ソースであるためには、JavaBeansの仕様に準拠している必要があります。publicデフォルト・コンストラクタを持つ必要があります。
データ・コントロールに対応するBeanを表すメタデータ・ファイルは、Beanのクラス名に基づいた名前が付けられるため、同じ名前のBeanがある場合、それらのBeanが異なるパッケージに含まれるようにする必要があります。1つのパッケージに同じ名前のBeanが2つある場合、一方のメタデータ・ファイルによって他方が上書きされます。
データ・コントロールの作成に使用されるBeanの名前を変更する場合、データ・コントロールを再作成する必要があります。
データ・コントロールを作成する手順:
アプリケーション・ナビゲータで、データ・コントロールの作成対象のセッションBeanを右クリックします。
ポップアップ・メニューから、「データ・コントロールの作成」を選択します。
「EJBインタフェースの選択」ダイアログで、「ローカル」を選択します。
EJBセッションBeanに基づいてデータ・コントロールを作成すると、データ・コントロールには、Beanで公開されているすべてのメソッド、ベースになるエンティティBeanとこのBeanで公開されるメソッドとプロパティに関する記述が含まれます。
データ・コントロールでサービスおよびバインディングを直接使用するために、JDeveloperで次のメタデータXMLファイルが作成されます。
データ・コントロール定義ファイル(DataControls.dcx
)。このファイルでは、各データ・コントロールのファクトリ・クラスとIDが定義されます。データ・コントロールの動作を決める設定も含まれます。たとえば、.dcx
ファイルを使用して、サービスでトランザクションをサポートするかどうかなどのグローバル・プロパティを設定できます。設定を変更するには、概要エディタでデータ・コントロールを選択し、プロパティ・インスペクタでプロパティの値を変更します。図2-2は、JDeveloperの概要エディタおよびプロパティ・インスペクタでのDataControls.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-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モジュールの「データ・コントロール」パネルを示しています。Addresses
、Person
およびProduct
Beanがすべて、「データ・コントロール」パネルで、アクセッサによって返されるコレクションとして表されていることに注意してください。
「データ・コントロール」パネルには、セッションBeanの各サービス・メソッドも、メソッド名と一致する名前のメソッド・アイコンとして表示されます。メソッドが引数をとる場合、その引数は、メソッドのノード内にネストされたパラメータとして「パラメータ」ノードに表示されます。図2-4に示すように、メソッドによって返されるオブジェクトも表示されます。
返される各コレクションまたはオブジェクトには、関連付けられているBeanに定義された属性およびカスタム・メソッドが表示されます。図2-5は、supplierFindAll
アクセッサ・メソッドによって返されるSupplier
Beanに定義されている属性とメソッドを示しています。
デフォルトでは、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は |
「データ・コントロール」パネルは、データ・コントロールを作成すると作成されるDataControls.dcx
と構造定義ファイルを直接表したものです。ファイルを編集することで、パネルに表示されている要素を変更できます。
注意: 基礎となるサービスが変更されたら必ず、変更を表示するためにデータ・コントロールを手動でリフレッシュする必要があります。データ・コントロールをリフレッシュするには、「データ・コントロール」パネルのヘッダーにある「リフレッシュ」アイコンをクリックします。 |
EJBデータ・コントロールまたはBeanデータ・コントロールを作成するときには、データベースからレコードにどのようにアクセスするか、また同時にメモリーに保持されるレコードの数を制限するかどうかを決定できます。
データをフェッチしてメモリーに格納することが考えられるのは、次のような場合です。
スクロール可能アクセス・モード
データ・コントロールの作成時にデフォルトを受け入れた場合、データのアクセス・モードはscrollable
に設定されます。つまり、アプリケーションで表示する必要のあるデータは、必要に応じて(UIコンポーネントのイテレータで指定されたレンジ・サイズと等しい増分で)取得され、メモリーに格納されます。次に、ユーザーがアプリケーションで前方にスクロールすると、必要に応じて追加の行がフェッチされ、メモリーに格納されます。フェッチされた行はすべて、メモリーに残っています。
たとえば、実行中のアプリケーションに、行1から20までを1つのWebページに表示する表が含まれていて、その表のイテレータのレンジ・サイズが25 (デフォルト)の場合は、データ・コントロールでは最初の25行がフェッチされます。結果セットの行477から496までを表示するためにユーザーが下にスクロールした場合は、行26から500までがフェッチされるまで、ユーザーがスクロールするにつれて、データは25件ずつフェッチされます。その時点では、合計500行がメモリーに格納されています。
oracle.adf.model.adapter.bean.DataFilterHandler
およびoracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler
を使用したデータ・コントロールでは、これがデフォルトのモードです。ただし、oracle.adf.model.adapter.bean.DataFilterHandler
を使用したデータ・コントロールでは、アクセス・モードを実装するには、データ・コントロールにページング・メソッドを引き続き追加する必要があります。詳細は、2.3.6項「Beanデータ・コントロールでページ分割サポートを手動で実装する方法」を参照してください。
範囲ページング・アクセス・モード
同時にフェッチされメモリーに格納されるレコードの数を制限するために、rangePaging
アクセス・モードを使用できます。スクロール可能モードと同様に、範囲ページング・モードでも、アプリケーションでデータを増分でフェッチできます。範囲ページング・モードでの大きな違いは、メモリーに残されるのは、最後にフェッチされた増分のみであるということです。したがって、たとえば、アクセッサ・イテレータのrangeSize
属性が25に設定されていると、いずれの時点でも、メモリーに保持されるレコードは25件までです。
前述のスクロール可能な例を範囲ページング版に当てはめると、データ・コントロールでは、行1から20までを表示するために、行1から25までをフェッチしてメモリーに保持します。ユーザーが下にスクロールした場合、データ・コントロールでは、ユーザーがスクロールするのに伴ってデータを25件ずつフェッチし、新しい範囲をフェッチするたびに前の25件のレコードをメモリーから解放します。前述の例で、ユーザーが行477から496までに達した時点でメモリーに残っているのは、行476から500までのみです。
複数の増分からのデータを表示する位置までスクロールした時点でメモリーに保持されるのは、最後にフェッチされた増分からのデータのみです。
注意: データ・コントロールで範囲ページングを使用した場合、そのデータ・コントロールから作成された、データ・バインダされたUIコンポーネントに対して、組込みナビゲーション操作 |
ページ分割なし。ページ分割がない場合は、UIコンポーネントに使用できるデータがすべてフェッチされます。oracle.adf.model.adapter.bean.DataFilterHandler
やoracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler
などのデータ・コントロール・ハンドラをデータ・コントロールが実装していない場合は、ページ分割が実装されません。具体的なコレクションに対してページングを無効にするには、アノテーションを使用することもできます。詳細は、2.3.4項「データ・コントロールで個別オブジェクトにアクセス・モードを指定する方法」を参照してください。
カスタム・ページ分割。組込みページ分割オプションがニーズに合わない場合は、カスタム・ハンドラ・クラスを実装することによって、独自のページ分割を実装できます。詳細は、2.3.7項「問合せおよびページ分割にカスタム・ハンドラを実装する方法」を参照してください。
アクセス・モードおよびデータ・コントロール・ハンドラの詳細は、2.3.3項「スクロール可能モードおよび範囲ページング・モードについて」を参照してください。
EJBデータ・コントロールまたはBeanデータ・コントロールのページング・モードを変更する場合は、「データ・コントロール」パネルで変更できます。
注意:
|
始める前に:
EJBデータ・コントロールおよびBeanデータ・コントロールのアクセス・モードの一般的な知識があると役立ちます。詳細は、2.3項「EJBデータ・コントロールでのデータのページ分割されたフェッチ」を参照してください。
次のタスクを完了する必要があります。
データ・コントロールのページング・モードを変更する手順は次のとおりです。
「データ・コントロール」パネルで、データ・コントロールのノードを右クリックして「定義の編集」を選択します。
ejb-definitionの「プロパティ」ダイアログまたはbean-definitionの「プロパティ」ダイアログで、「AccessMode」ドロップダウン・リストからrangePaging
またはscrollable
を選択します。
範囲ページングを使用するようにデータ・コントロールを変更する場合は、データ・コントロールのFactoryClass
プロパティをoracle.adf.model.adapter.bean.BeanDCFactoryImpl
と指定してください。
DataControls.dcx
ファイルのソース・エディタで、あるいは、ソース・エディタまたは概要エディタでDataControls.dcx
を開いたときに表示されるプロパティ・エディタで、FactoryClass
プロパティにアクセスできます。
データ・コントロールのアクセス・モードをrangePaging
に設定すると、データ・コントロールは、データ・コントロール内のコレクションにバインドされる各コンポーネントのアクセッサ・イテレータのrangeSize
プロパティを読み取ることによって、レンジ・サイズを判別します。
コンポーネントのレンジ・サイズを設定する手順は次のとおりです。
アプリケーション・ナビゲータで、データ・コントロールにバインドされるコンポーネントがあるページを選択します。
「構造」ウィンドウで、データ・コントロール・コレクションにバインドされるコンポーネントを選択します。
プロパティ・インスペクタで、「動作」ノードを開き、rangeSize
プロパティを目的の値に設定します。
イテレータ・バインディングの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のイテレータ・バインディングの作成および使用に関する項を参照してください。
スクロール可能モードおよび範囲ページング・モードをサポートするデータ・コントロールは、その機能を実装するに際して、Beanクラス内のメソッドに依存しています。データ・コントロールが使用するメソッドは、データ・コントロールが使用するデータ・コントロール・ハンドラ・クラスに依存しています。
JPAベースのデータ・コントロールでは通常、JPQLDataFilterHandler
ハンドラが指定されています。JPQLDataFilterHandler
は、JPA問合せとqueryByRange()
メソッドがBean内に存在しているかどうかに応じて異なります。
JPA以外のBeanデータ・コントロール(および、queryByRange()
メソッドのないJPAベースのデータ・コントロールおよびEJBデータ・コントロール)では、DataFilterHandler
が指定されています。このハンドラを使用するデータ・コントロールに範囲ページングを実装するには、2.3.6項「Beanデータ・コントロールでページ分割サポートを手動で実装する方法」に示されているように、Beanクラスにコードを追加する必要があります。
これらのハンドラ・クラスのいずれもサポートしていないデータ・コントロール(以前のバージョンのIDEで生成されたデータ・コントロールなど)の場合は、スクロール可能に対しても範囲ページングに対しても、組込みサポートはありません。
様々なサイズの複数のコレクションがデータ・コントロールに含まれる場合は、コレクションのいくつかに別々のアクセス・モードを設定することもできます。これを行うには、Bean内でデータ・コントロールが表すアクセッサ・メソッドにアノテーションを配置します。
アノテーションが使用されるメソッドでは、そのアノテーションによって、データ・コントロールに設定されているアクセス・モードがオーバーライドされます。アクセッサ・メソッドにそのようなアノテーションがない場合、そのアクセス・モードは、データ・コントロールに定義されているアクセッサ・メソッドから継承されます。
Beanデータ・コントロールまたはEJBデータ・コントロールで個別オブジェクトにアクセス・モードを指定する手順は次のとおりです。
データ・コントロールのベースとなるBeanクラスを開きます。
データ・コントロールに対して一般的に指定されているアクセス・モードとは異なるアクセス・モードを指定するアクセッサ・メソッドに、アノテーションを追加します。
例2-3は、必要なインポート文と使用可能なアノテーション、およびコレクションに対してそれらをどのように使用できるかを示しています。
例2-3 アクセス・モードのアノテーション
import oracle.adf.model.adapter.bean.annotation.AccessMode; import oracle.adf.model.adapter.bean.annotation.AccessModeType; ... * List with scrollable access */ @AccessMode(type=AccessModeType.SCROLLABLE) public List<Employees> getEmployees() { ... * List with range paging. */ @AccessMode(type=AccessModeType.RANGE_PAGING) public List<Employees> getEmployees() { ... * List with no paging. */ @AccessMode(type=AccessModeType.NO_PAGING) public List<Countries> getCountries() { ...
デフォルトでは、JPAベースのデータ・コントロールにバインドされた表をユーザーがソートした場合、ADFモデル・ランタイムによってイテレータは、すべての行をメモリーに返してソートするように強制されます。これは、バックエンドJPQL問合せがそのソートをデータベース・レベルですでに行っている場合でも同じであり、コレクションが大きすぎるとメモリーに障害が発生する恐れがあります。コレクションに範囲ページングを使用している場合は、ADFモデル・ランタイムによるメモリー内の全ソートを無効にし、そのかわりに、現在選択している範囲に基づいて、ソートをデータ・コントロールに処理させることができます。
データ・コントロールを使用して、範囲がページ分割されたコレクションのソートを処理する手順は次のとおりです。
アプリケーション・ナビゲータで、DataControls.dcx
ファイルをダブルクリックし、概要エディタで開きます。
概要エディタで、編集するデータ・コントロールのノードを選択します。
プロパティ・インスペクタで、ImplementsSort
プロパティをtrueに設定します。
JPA以外のデータ・コントロール(または、oracle.adf.model.adapter.bean.jpa.DataFilterHandler
ハンドラを使用する任意のBeanデータ・コントロール)では、ADFモデル・ランタイムがスクロール可能ページングおよび範囲ページングを実装するようにするには、セッション・ファサードまたはサービス・ファサードで、各コレクションにメソッドを3つずつ追加する必要があります。メソッド・シグネチャは、次のような形式となります。
List<EntityBeanName
> getEntityBeanName
List() List<EntityBeanName
> getEntityBeanName
List(int firstResult, int maxResults) long getEntityBeanName
ListSize()
問合せとページングの組込みオプションがアプリケーションに不十分な場合は、データ・コントロールに独自のデータ・ハンドラ・クラスを指定することによって、問合せとページングのカスタム動作を実装できます。
問合せおよびページ分割にカスタム・ハンドラを実装する手順は次のとおりです。
データ・コントロールのカスタム・ハンドラ・クラスを記述して、データ・コントロールのプロジェクトに追加します。
oracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler
やoracle.adf.model.adapter.bean.DataFilterHandler
など、既存のハンドラをサブクラス化できます。カスタム・ハンドラ・クラスの概略については、例2-4を参照してください。
DataControls.dcx
ファイルの「ソース」ビューで、ハンドラの完全修飾クラス名を、各データ・コントロールのDataControlHandler
属性の値として入力します。
DataControlHandler
は、EJBデータ・コントロールのejb-definition
要素の属性であり、Beanデータ・コントロールのbean-definition
要素の属性です。
例2-4 データ・コントロールのカスタム・ハンドラ
public class MyJPQLDataFilterHandler extends JPQLDataFilterHandler { public boolean invoke(Map bindingContext, OperationBinding action, DataFilter filter) { /** TODO: Developer provides custom criteria. */ } public Object invoke(RowContext rowCtx, String name, DataFilter filter) { /** TODO: Developer provides custom criteria. */ } }
「データ・コントロール」パネルから項目をドラッグし、それを特定の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項「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。 |
|
パラメータ |
メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「パラメータ」ノード内に表示されます。 |
ラベル、テキストおよび選択リストの各コンポーネント。 |
JDeveloperは、ドロップするデータ・コントロール項目に対してそれぞれ選択できるUIコンポーネントの事前定義済セットを備えています。
「データ・コントロール」パネルを使用してUIコンポーネントを作成する手順:
「データ・コントロール」パネルで項目を選択し、ページのビジュアル・エディタにその項目をドラッグします。パネルの各項目の定義は、表2-1を参照してください。
ポップアップ・メニューから、UIコンポーネントを選択します。
「データ・コントロール」パネルから項目をドラッグしてページにドロップすると、ドロップした項目に使用できるすべてのデフォルトUIコンポーネントのポップアップ・メニューが表示されます。
図2-6は、アクセッサによって返されるコレクションが「データ・コントロール」パネルからページにドロップされる際に表示されるポップアップ・メニューを示しています。
ポップアップ・メニューから選択したコンポーネントに応じて、そのコンポーネントの外観を定義するためのダイアログがJDeveloperで表示されます。
図2-7に示すように、結果のUIコンポーネントがJDeveloperのビジュアル・エディタに表示されます。
ヒント: 「データ・コントロール」パネルを使用して自動的にバインドされるUIコンポーネントを作成するかわりに、UIをまず作成し、コンポーネントをADFモデル・レイヤーにバインドできます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の最初に単純なUIを開発する方法の使用に関する項を参照してください。 |
「データ・コントロール」パネルを使用してWebアプリケーションを構築すると、JDeveloperによって次の処理が行われます。
DataBindings.cpx
ファイルがプロジェクトのデフォルト・パッケージに作成されます(このファイルが存在しない場合のみ)。また、そのページ用にエントリが追加されます。
DataBindings.cpx
ファイルは、アプリケーションのバインディング・コンテキスト(使用可能なデータ・コントロールとデータ・バインディング・オブジェクトのリストを保持するコンテナ・オブジェクト)を定義します。各DataBindings.cpx
ファイルによって、個々のページがページ定義ファイルに含まれるバインディング定義にマップされ、これらのページが使用するデータ・コントロールが登録されます。図2-8は、JDeveloperの概要エディタでのDataBindings.cpx
ファイルを示しています。
例2-5は、対応するXMLファイルのコードを示しています。
例2-5 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-6は、adfm.xml
ファイルの例を示しています。
Webアプリケーションの場合、web.xml
ファイルにADFバインディング・フィルタが登録されます。
ADFバインディング・フィルタにより、バインディング・コンテキストへのアクセスが必要なHTTPリクエストが、すべて処理されます。フィルタの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFデータ・バインディング・フィルタの構成に関する項を参照してください。
プロジェクトに次のライブラリが追加されます。
ADFモデル・ランタイム
ADFモデル汎用ランタイム
パッケージ定義ファイルがページ定義サブパッケージに追加されます(ページに対してファイルが存在しない場合)。デフォルトのサブパッケージは、adfmsrc
ディレクトリにあるview.pageDefs
です。
ページ定義ファイル(pageName
PageDef.xml
)は、アプリケーションのビュー・レイヤーにある各ページのADFバインディング・コンテナを定義します。バインディング・コンテナでは、すべてのADFバインディング・オブジェクトへのランタイム・アクセスが行われます。図2-9は、JDeveloperの概要エディタでのページ定義ファイルを示しています。
ページで参照されるバインディング・オブジェクトの定義の追加も含めて、ページ定義ファイルが構成されます。例2-7は、ページ定義の対応するXMLファイルを示しています。
例2-7 ページ定義ファイル
<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-8は、ADFモデル・データ・バインドを使用してバインドされたコンポーネントを含むJSFページを示しています。例2-7のページ定義ファイルで定義されているとおり、出力テキスト・コンポーネントの値は、productsFindAll
バインディング・オブジェクトの値にバインドされていることに注意してください。
例2-8 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ユーザー・インタフェース開発者ガイド』を参照してください。
ページにADFバインディングが含まれている場合、実行時には、クライアントまたはコントローラから起動されたビジネス・サービスとのやり取りが、バインディング・コンテキストを介して、アプリケーションによって管理されます。バインディング・コンテキストは、アプリケーション内のすべてのデータ・コントロールおよびページ定義のランタイム・マップ(名前付きdata
でEL式#{data}
を使用してアクセス可能)です。
ADFライフサイクルで、図2-10に示すように、DataControls.dcx
、DataBindings.cpx
およびページ定義ファイルからADFバインディング・コンテキストが作成されます。DataControls.dcx
ファイルで、設計時にアプリケーションで使用可能なデータ・コントロールが定義され、DataBindings.cpx
ファイルで、実行時にアプリケーションで使用可能なデータ・コントロールが定義されます。DataBindings.cpx
ファイルには、アプリケーションのページで使用されるデータ・コントロールがすべてリストされ、ページ定義ファイルで定義済のバインディング・オブジェクトを含むバインディング・コンテナがWebページのURL、またはJava Swingアプリケーションの場合はJavaクラスにマップされます。ページ定義ファイルは、アプリケーション・ページで使用されるバインディング・オブジェクトを定義します。ページごとにページ定義ファイルが1つあります。
バインディング・コンテキストには、これらのオブジェクトの実際のライブ・インスタンスは含まれません。かわりに、マップには必要に応じてデータ・コントロールまたはバインディング・コンテナ・オブジェクトになる参照がまず含まれます。オブジェクト(ページ定義など)がアプリケーションから解放されると(タスク・フローが終了したり、リクエストの終了時にバインディング・コンテナまたはデータ・コントロールが解放される場合)、データ・コントロールおよびバインディング・コンテナは参照オブジェクトに戻ります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「Fusionページ・ライフサイクルの理解」を参照してください。
データ・コントロールでコレクションを変更する場合、変更されていることがADFモデル・レイヤーで認識されるよう、データ・コントロールでコレクションの新規インスタンスをインスタンス化する必要があります。つまり、クライアントのアクションによってコレクションが変更されることがありますが、コレクションの新規インスタンスを作成しないかぎり、その変更はUIに反映されないということです。ただし、パフォーマンス上の理由から、アクセッサとメソッド・イテレータでは結果セットがキャッシュされます(デフォルトでは、イテレータのcacheResults
属性はtrue
に設定されています)。この設定は、ページが初めてレンダリングされるときにイテレータがリフレッシュされ、コレクションの新規インスタンスが作成されることを意味します。部分ページ・レンダリングを使用したページのリフレッシュやページに戻るユーザー・ナビゲーションなどのページの再アクセス時、イテレータはリフレッシュされません。
たとえば、ページで表のソートが可能であるとします。ソート後にページをリフレッシュする必要があるため、部分ページ・レンダリングを使用して表をリフレッシュする、ソート・イベント用のコードをリスナーに追加します(詳細は、Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイドの部分的なページ・コンテンツのレンダリングに関する項を参照してください)。表のコレクションのインスタンスはすでにインスタンス化され、キャッシュされているため、アクセッサ・イテレータは再実行されません。このため、新しいソート順のコレクションの新規インスタンスは作成されず、ページ上のソート順は同じままになります。
この問題に対処するには、結果をキャッシュしないようイテレータを構成するか、ページのリフレッシュ時にイテレータの再実行に使用できるボタンをページに配置します。アクション属性をメソッドにバインドできるボタンがページにない場合、ページのリフレッシュ時に起動されるinvokeAction
実行可能ファイルを使用できます。
注意: ページでナビゲーション操作を使用してコレクション内を移動する場合、 |
パフォーマンスに関するヒント: 結果セットをキャッシュしないようイテレータを設定し、結果セットが多数の行を返す可能性のあるコレクションの場合、パフォーマンスにマイナスの影響があります。大規模な結果セットの場合、 |
結果セットをキャッシュしないようイテレータを設定する手順:
ページ定義ファイルを開き、結果をキャッシュしないイテレータを構造ウィンドウで選択します。
プロパティ・インスペクタで、「詳細」セクションを展開し、CacheResultsをfalseに設定します。
ボタンを使用してイテレータを再実行する手順:
コンポーネント・パレットの「ADF Faces」ページから、「ボタン」をページにドラッグ・アンド・ドロップします。
構造ウィンドウで、ボタンを右クリックし、ポップアップ・メニューで「ADFコントロールにバインド」を選択します。
「ADFコントロールにバインド」ダイアログで、再実行するイテレータに関連付けられているアクセッサを展開し、アクセッサの「操作」ノードを展開して「実行」を選択します。
invokeActionを使用してイテレータを再実行する手順:
ページ定義ファイルを開き、構造ウィンドウで「実行可能ファイル」を右クリックし、「実行可能ファイルの中に挿入」→「invokeAction」を選択します。
「invokeActionの挿入」ダイアログで、「ID」を一意の名前に設定します。「バインド」ドロップダウン・リストを使用して、再実行するイテレータを選択します。
新たに作成したinvokeActionが選択された状態で、プロパティ・インスペクタで「リフレッシュ」を「prepareModel」に設定します。
この設定によって、モデルの準備フェーズでアクセッサ・メソッドが起動されます。これによって、バインディング・コンテナがリフレッシュされます。
RefreshConditionを、値が実際に変更された場合にのみリフレッシュが行われるようにするEL式に設定します。この条件が設定されている場合、invokeAction
が2回コールされます。
たとえば、#{(userState.refresh) and (!adfFacesContext.postback)}
という式では、ページがリフレッシュされる場合にのみ、リフレッシュが行われます。
ページのライフサイクルのフェーズとrefresh
およびrefreshCondition
属性の使用の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のJSFとADFのページ・ライフサイクルに関する項を参照してください。
ページ定義ファイルで、属性バインディングに検証を設定できます。ユーザーが、検証が定義されている属性のフィールド内のデータを編集または入力してフォームを送信すると、構成されているルールおよび条件に対してバインドされたデータが検証されます。検証が失敗すると、アプリケーションによりエラー・メッセージが表示されます。モデル・レイヤーの検証の設定の詳細および手順は、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開発者ガイド』のエラー処理のカスタマイズに関する項を参照してください。