Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド 11gリリース1 (11.1.1.7.0) B52028-05 |
|
前 |
次 |
この章では、「データ・コントロール」パネルおよびADFモデル・データバインディングを使用して、Fusion WebアプリケーションのJSFページに、データバインドされたUIコンポーネントを作成する方法を説明します。ページ・テンプレートおよびページ・フラグメントを使用したページの作成方法を説明します。マネージドBeanを使用してページのロジックを格納する方法についても説明します。
この章の内容は次のとおりです。
使用するWebインタフェースでの作業を開始するにあたって必要な情報のほとんどは、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』に含まれています。ただし、JSFマネージドBeanのかわりにADFモデル・レイヤーを使用してデータバインディングを行うと、宣言的にコンポーネントをビジネス・サービスにバインドする機能など、追加の機能を使用できます。ADFモデルで使用できる機能の詳細は、1.2.2項「ADFモデル・レイヤー」を参照してください。この章では、Facesのマニュアルに詳細が含まれているWebインタフェース開発プロセスの概要を提供するとともに、ADFモデル・データバインディングを使用した場合に使用できる追加の機能に関する情報を提供します。
第1章「Oracle ADFを使用したFusion Webアプリケーションの構築の概要」で説明した開発プロセスに従い、ADF Facesを使用してWebアプリケーションを開発し、データ・バインディングにADFモデルを使用するには、次の手順が必要です。
ページのADF Facesテンプレートの作成(オプション)
ページ内で使用するリージョンへの個別のページおよびページ・フラグメントの作成
必要なマネージドBeanの作成
また、Fusion Webアプリケーションのライフサイクルは、標準のJSFアプリケーションまたはADF Facesアプリケーションのライフサイクルとは異なります。ライフサイクルの仕組みの詳細は、第21章「Fusionページ・ライフサイクル」を参照してください。
アプリケーション・フローを設計すると同時に、ページのデザインの検討も開始できます。アプリケーション全体の整合性を保持するには、ADFページ・テンプレートを使用します。これらのページ・テンプレートは、Webページを作成する開発者に構造および整合性を提供します。ページ・テンプレートには通常、使用時に変更できない静的領域、および開発者が作成するページに固有のコンテンツを配置できる動的領域があります。
たとえば、Fusion Order DemoアプリケーションのStoreFrontモジュールには、ブランド表示およびナビゲーションのための上部領域、著作権情報を表示する下部領域、およびページのメイン・コンテンツ用の中央領域を提供するページ・テンプレートが含まれています。このテンプレートを使用するページ開発者は、ブランド表示および著作権情報について何もする必要はありません。メイン・コンテンツ領域のみを開発します。
ADF Facesコンポーネントを使用してページ・テンプレートを作成し、さらにテンプレート定義に属性を追加できます。これらの属性は、ページ・テンプレートを使用するときにページ開発者が提供する必要がある特定の情報のプレースホルダとなります。たとえば、StoreFrontモジュール・アプリケーションのページ・テンプレートには、ようこそメッセージの属性が含まれています。ページ開発者は、このページ・テンプレートを使用する際に、ページごとに異なるようこそメッセージを追加できます。
また、ページ・テンプレートにファセット参照を追加することもできます。この参照は、ページ上のコンテンツのプレースホルダとして機能します。図20-1に、StoreFrontモジュール・アプリケーション内で使用されるStoreFrontTemplate
テンプレートがファセット参照をどのように使用しているかを示します。
このページ・テンプレートでは、ファセット参照は4つの異なるpanelSplitter
コンポーネント内で使用されています。このページ・テンプレートを使用してホームページを作成すると、ナビゲーション・リンクはHeaderファセット内に配置され、ナビゲーション・ツリーや検索パネルを含むアコーディオン・パネルはStartファセット内に配置されます。カートの合計はEndファセットに配置され、ページの主要部分はCenterファセットに配置されます。著作権情報はBottomファセットに配置されます。
データバインドされたコンポーネントをページ・テンプレートに追加することを選択した場合、関連するページ定義ファイルおよびADFモデル・レイヤー・データ・バインディングをサポートする他のメタデータ・ファイルが作成されます。第12章「Fusion WebアプリケーションでのADFモデルの使用」で説明しているように、各コンポーネントは標準JSFページと同様にバインドされます。また、ページ・テンプレートのモデル・パラメータを作成することもできます。それらのパラメータの値は、実行時にコール元のページから設定できます。
たとえば、ページ・テンプレートを使用している各ページに製品の一覧を表示する場合、Products
コレクションのProductName
属性をリストとしてドラッグ・アンド・ドロップできます。また、現在選択されている製品IDをページに表示する場合は、その製品のIDに評価されるモデル・パラメータをページ・テンプレートに対して作成できます。
注意: ページ・テンプレートは本来プロジェクト・アーティファクトです。プロジェクトとアプリケーションの間で再利用できますが、完全な自己完結型ではなく、ADFデータバインディング、メッセージ・バンドルの |
ページ・テンプレートにデータバインドされたコンポーネントが含まれない場合は、EL式を使用してコール元のページから動的に参照できます。つまり、使用するページ・テンプレートを実行時に決めることができます。たとえば、ユーザーの選択に基づいてtemplateAまたはtemplateBを使用できます。ページにページ・テンプレートを追加すると、af:pageTemplate
タグがページに追加されます。このaf:pageTemplate
タグには、そのページで使用されるページ・テンプレートを指定するviewId
属性が含まれます。例20-1に示すように、EL式でviewId
をページ・テンプレートId
を戻すマネージドBeanメソッドに設定できます。
例20-1 (データバインドされたページ・テンプレートのみでなく)動的ページ・テンプレートを使用するページ
<af:pageTemplate id="pt1" viewId="#{myBean.templateViewId}"
ページ・テンプレートにデータバインドされたコンポーネントが含まれる場合、EL式でviewId
を設定するのみでは不十分です。データバインドされたコンポーネントにはバインディング・コンテナへのアクセスが必要なため、ページ・テンプレートおよび関連付けられているバインディング・コンテナを指定する必要があります。
データバインドされているページ・テンプレートでは、pageTemplateModel
を使用して、ページ・テンプレートId
および関連付けられているバインディング・コンテナの両方を管理します。JSFページでは、viewId
属性を使用するかわりに、value
属性をpageTemplateModel
に設定します。また、コール元ページのページ定義ファイルのページ実行可能セクションを変更し、ページ・テンプレートId
を処理するメソッドを使用してマネージドBeanを作成する必要があります。詳細な手順は、20.2.3項「データバインドされたページ・テンプレートをページに動的に追加する方法」を参照してください。
ADFビジネス・コンポーネントおよびADFモデル・レイヤー・データバインディングを使用するアプリケーションのページ・テンプレートの作成方法は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のページ・テンプレートの使用に関する項に記載されているように、標準のADF Facesページ・テンプレートの作成方法と同様です。テンプレートを作成すると、「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップできます。このパネルから項目をドラッグ・アンド・ドロップすると、ページ定義ファイルが自動的に追加されます。
JSFページ・テンプレートの作成ウィザードを使用しても、テンプレートで使用するためのモデル・パラメータを作成できます。
モデル・パラメータをテンプレートに追加するには:
『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のページ・テンプレートの作成方法に関する項の手順に従い、ページ・テンプレートを作成します。ただし、ダイアログを完成させないでください。
「JSFページ・テンプレートの作成」ダイアログで「関連ADFmページ定義の作成」を選択します。
注意: パラメータを追加する場合は、このチェック・ボックスのみを選択します。「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップすると、ページ定義ファイルが自動的に追加されます。 |
「モデル・パラメータ」タブをクリックします。
「追加」アイコンをクリックします。
パラメータに、次のように入力します。
ID: パラメータの名前を入力します。
値: 値に、解決可能な値またはEL式を入力します。必要に応じて、「式ビルダーの起動」(...)ボタンをクリックして「式ビルダー」を開きます。式ビルダーを使用して式を作成できます。EL式およびEL式ビルダーの詳細は、第12章「ADFデータ・バインディングEL式の作成」を参照してください。
オプション: パラメータ値の指定方法を決定するオプションを選択します。
オプション: コール元によって特にパラメータが設定されていない場合のみ、バインディング定義の値が使用されます。これはデフォルト設定です。
最終: このパラメータに使用する値にアクセスするための式が、バインディング定義に含まれています。
必須: コール元がパラメータ値を設定する必要があります。
読取り専用: パラメータ値が読取り専用であり、上書きしない場合に選択します。
必要に応じてさらにパラメータを作成します。「順序」ボタンを使用し、評価する順序にパラメータを整列させます。
これで、この部の残りの章で説明しているように、標準JSFページと同様、「データ・コントロール」パネルを使用してデータバインドされたUIコンポーネントをページに追加できるようになりました。
注意: テンプレートにメソッド・イテレータにバインドされたメソッド・アクションが含まれる場合、イテレータの |
ADFのデータバインドされたコンポーネントをテンプレートに追加したり、テンプレートにモデル・パラメータを作成すると、そのテンプレートのページ定義ファイルが作成され、そのファイルにモデル・パラメータが追加されます。
注意: この項では、静的に割り当てられるページ・テンプレートの処理について説明します。動的テンプレートの詳細は、20.2.3項「データバインドされたページ・テンプレートをページに動的に追加する方法」を参照してください。 |
例20-2に、productId
モデル・パラメータを作成したテンプレートのページ定義ファイルを示します。
例20-2 テンプレートのページ定義のモデル・パラメータ
<parameters> <parameter id="productID" readonly="true" value="#{bindings.productId.inputValue}"/> </parameters> <executables/> <bindings/>
パラメータ・バインディング・オブジェクトにより、リクエスト開始時にページによって評価されるパラメータが宣言されます。バインディング・オブジェクトおよびADFライフサイクルの詳細は、第12章「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。ただし、テンプレート自体は実行されることはないため、テンプレートを使用するページ(コール元ページ)は、テンプレート用に作成されたバインディング・オブジェクト(「データ・コントロール」パネルからテンプレートにオブジェクトをドラッグ・アンド・ドロップして作成した、パラメータまたはその他のタイプのバインディング・オブジェクトを含む)にアクセスする必要があります。
テンプレートのバインディング・オブジェクトにアクセスするには、コール元のページのページ定義ファイルで、テンプレートのページ定義ファイルが示すバインディング・コンテナをインスタンス化する必要があります。その結果、テンプレートのページ定義への参照は、例20-3に示すようにコール元のページのページ定義ファイルに実行可能ファイルとして挿入されます。
例20-3 実行可能ファイルとしてのテンプレートのページ定義への参照
<executables> <page path="oracle.foddemo.storefront.pageDefs.templates_MyTemplatePageDef" id="pageTemplateBinding"/> </executables>
この例のコール元ページは、MyTemplate
テンプレートを使用して作成されています。MyTemplate
テンプレートのページ定義ファイルはコール元ページの実行可能ファイルとして表示されるため、 コール元ページのバインディング・コンテナがインスタンス化されると、続いてMyTemplatePageDef
のバインディング・コンテナがインスタンス化され、これによってパラメータ値またはその他のデータバインドされた値へのアクセスが可能になります。
この参照にはID(この例ではpageTemplateBinding
)があるため、コール元のページはテンプレートから値にアクセス可能なコンポーネントを保持できます。テンプレートからJSFページを作成する場合、テンプレート内のコードを繰り返す必要はなく、かわりにコール元のページにaf:pageTemplate
タグを使用できます。このタグは、テンプレートJSFページへのパスを含みます。
また、テンプレートにADFデータ・バインディングが含まれている場合、そのタグの値は例20-4に示すように、テンプレートのページ定義へのコール元のページの参照に設定されたIDとなります。このバインディングにより、テンプレートからバインディング値へのコンポーネントのアクセスが可能になります。
ページ・テンプレートを選択するEL式を使用することで、データバインドされたコンポーネントを含まないページ・テンプレートを動的に追加できます。手順の詳細は、20.2項「ページ・テンプレートの使用」を参照してください。
また、データバインドされたコンポーネントを含むページ・テンプレートを静的に追加できます。手順の詳細は、20.2.1項「ADFページ・テンプレートでのADFデータバインディングの使用方法」を参照してください。
この項では、データバインドされたコンポーネントを含むページ・テンプレートをページに動的に追加する方法を説明します。
ページ・テンプレートおよびそのバインディング・コンテナを動的に管理するには、pageTemplateModel
を使用します。ページ定義ファイル内でEL式を使用して、ページ・テンプレートId
を設定します。ページ・テンプレートId
を戻すためのマネージドBeanメソッドを作成します。
データバインドされたページ・テンプレートをページに動的に追加するには:
20.2.1項「ADFページ・テンプレートでのADFデータバインディングの使用方法」の説明に従って、ページにページ・テンプレートを追加します。
JSFページ・ソース・エディタで、viewId
属性を削除してvalue
属性をpageTemplateModel
に変更します。明示的にpageTemplateModel
を作成する必要はありません。対応するページ定義ファイルのページ実行可能バインディングのpageTemplateModel
を使用できます。たとえば、pageTemplate1
というページ実行可能バインディングでは、af:pageTemplate
タグの下に次の行を追加します。
value="#{bindings.pageTemplate1.templateModel}"/>
ページ定義ファイルの<executable>
セクションで、<page>
セクションに対して次の変更を行います。
path
属性を削除します。これは今後必要ありません。データバインドされたコンポーネントのバインディング・コンテナへのアクセスは、pageTemplateModel
で管理されます。
id
属性をページ実行可能バインディングに変更します。この例ではpageTemplate1
です。
Refresh
属性を追加してifNeeded
に設定します。
viewId
属性を追加して、現在のページ・テンプレートId
を戻すマネージドBeanメソッドを使用するEL式に設定します。
たとえば、pageTemplate1
のページ実行可能バインディングでは、id
属性もpageTemplate1
になります。
<executables> <page id="pageTemplate1" viewId="#{myBean.templateViewId}" Refresh="ifNeeded"/> ... </executables>
現在のページ・テンプレートId
を戻すメソッドを使用してpageFlowScope
マネージドBeanを作成します。
マネージドBeanのコードは、例20-5に含まれるもののようになります。この例の場合、gettemplateViewId()
は、ユーザーのページ・テンプレートの選択を取得してページ・テンプレートId
を戻します。setMDTemplateViewId()
は、ページ・テンプレートをMDPageTemplate
に設定し、setPopupTemplateViewId()
は、ページ・テンプレートをPopupPageTemplate
に設定します。
例20-5 ページ・テンプレートを動的に処理するためのマネージドBeanのコード
public class myClass { final private String MDPageTemplate = "/MDPageTemplate.jspx"; final private String PopupPageTemplate = "/PopupPageTemplate.jspx"; private String templateViewId; public myClass() { super(); templateViewId = MDPageTemplate; } public String gettemplateViewId() { return templateViewId; } public void setMDTemplateViewId(ActionEvent ae) { templateViewId = MDPageTemplate; } public void setPopupTemplateViewId(ActionEvent ae) { templateViewId = PopupPageTemplate; } }
ADFデータ・バインディングを含むテンプレートを使用してページが作成されると、次の処理が行われます。
第21章「Fusionページ・ライフサイクル」で説明しているように、コール元ページは標準のJSF/ADFライフサイクルに従います。ページでビューのリストア・フェーズが開始されると、対応するページ定義ファイルを検出するバインディング・コンテキストにコール元ページのURLが送信されます。
内容の初期化フェーズ中に、コール元のページのバインディング・コンテナはページ定義ファイルに基づいて作成されます。
モデル準備フェーズ中に、実行可能なページ・テンプレートがリフレッシュされます。この時点で、テンプレートのバインディング・コンテナはテンプレートのページ定義ファイルに基づいて作成され、バインディング・コンテキストに追加されます。
ライフサイクルは、処理対象のページとテンプレートの両方のUIコンポーネントおよびバインディングとともに継続します。
ADFモデル・レイヤー・データバインディングを使用するアプリケーションのWebページの作成方法は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のJSFページの作成に関する項の説明と同じです。タスク・フローのビュー・アクティビティをダブルクリックするか、新規ギャラリを使用して、ページを作成できます。ページの作成時(またはビュー・アクティビティをタスク・フロー上にドロップする際)には、JSF JSPまたはJSF JSPフラグメントのどちらとしてページを作成するかを選択できます。JSFフラグメントは、プロジェクト内に再利用可能なページ・コンテンツを作成するための簡単な方法を提供するもので、タスク・フローをページ上のリージョンとして使用する場合に使用します。JSFページ・フラグメントを変更すると、そのページ・フラグメントを使用するJSFページが自動的に更新されます。
注意: JDeveloperはFaceletsを使用するアプリケーションでのXHTMLファイルの使用をサポートしていますが、 |
ページへのコンテンツの追加を開始する場合、通常はJDeveloperの「コンポーネント・パレット」と「データ・コントロール」パネルを使用します。「コンポーネント・パレット」には、ページを宣言的に設計するために必要なすべてのADF Facesコンポーネントが含まれます。基本的なレイアウト・コンポーネントをページに配置すると、「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップし、ADFモデルのデータバインドされたUIコンポーネントを作成できます。このマニュアルの後の章では、ADFモデル・データバインディングを使用して作成できる異なるタイプのデータバインドされたコンポーネントとページの詳細を説明します。
マネージドBeanは、様々な構成ファイルを使用してアプリケーションに登録するJavaクラスです。JSFアプリケーションが起動すると、これらの構成ファイルが解析され、その中にリストされているBeanが使用可能になります。EL式内でマネージドBeanを参照できるため、Beanのプロパティおよびメソッドにアクセスできます。マネージドBeanが初めて参照されたときに、それがまだ存在しなていなかった場合は、常に、マネージドBean作成機能がそのBeanでデフォルトのコンストラクタ・メソッドをコールし、Beanがインスタンス化されます。また、プロパティが宣言されると、宣言されたデフォルトの値が移入されます。
多くの場合、マネージドBeanは、フロントエンドで処理することが最適なイベントやデータ操作を処理します。標準JSFアプリケーションでのマネージドBeanの使用方法の詳細は、OracleのTechnology Network WebサイトのJava EEチュートリアル(http://www.oracle.com/technetwork/java/javaee/overview/index.html
)を参照してください。
ベスト・プラクティス: マネージドBeanを使用して格納するのは、UIレンダリングに関連するロジックのみです。すべてのアプリケーション・データおよび処理データは、アプリケーションのビジネス・レイヤーのロジックによって処理される必要があります。JavaクラスではなくPL/SQLを使用してデータ関連のロジックをデータベースに格納するのと同様に、Fusion Webアプリケーションにおける経験則では、ビジネス関連のロジックを中間層に格納します。このようにすると、このロジックをビジネス・サービス・メソッドとして公開でき、ADFモデル・レイヤーでアクセスできるようになり、データ・バインディングに使用できます。 |
ADFデータ・バインディングおよびADFタスク・フローを使用するアプリケーションでは、マネージドBeanは標準JSFアプリケーションで使用されるものとは異なる構成ファイルに登録されています。標準JSFアプリケーションでは、マネージドBeanはfaces-config.xml
構成ファイルに登録されています。Fusion Webアプリケーションでは、マネージドBeanはfaces-config.xml
ファイル、adfc-config.xml
ファイルまたはタスク・フロー定義ファイルに登録できます。マネージドBeanの登録にどの構成ファイルを使用するかは、そのBeanにアクセスする必要があるものは何か、実行時にカスタマイズする必要があるか、Beanのスコープは何か、アプリケーション内のすべてのBeanをどの順序でインスタンス化する必要があるかによって異なります。表20-1に、各タイプの構成ファイルへのBeanの登録がBeanにどのような影響を与えるかを示します。
注意: Fusion Webアプリケーションでは、 タスク・フロー定義内でアクセスされたマネージドBeanは、そのタスク・フローの定義ファイル内に登録する必要があります。 |
表20-1 マネージドBeanの構成配置の影響
マネージドBeanの配置 | 影響 |
---|---|
|
|
タスク・フロー定義ファイル |
|
|
|
Fusion Webアプリケーションの一般的な規則として、複数のページまたはタスク・フローで使用できるBean、または主要な無制限タスク・フロー(adfc-config
)内のページで使用されるBeanは、adfc-config.xml
構成ファイルに登録する必要があります。特定のタスク・フローでのみ使用されるマネージドBeanは、そのタスク・フローの定義ファイルで登録する必要があります。faces-config.xml
ファイルには、Beanは登録されません。
注意: JDeveloperのダイアログからマネージドBeanを作成した場合、 |
たとえば、StoreFrontモジュールのmyOrders.jspx
ページでは、myOrdersBean
マネージドBeanを使用して、ユーザーが注文の編集を取り消し、編集がモデルにコミットされているがデータベースには保存されていない場合の処理を行っています。このBeanはadfc-config
の無制限タスク・フロー内のページで使用されるため、adfc-config.xml
ファイルに登録されます。custRegBasicInformationBean
は、そのページ上のシャトル・コンポーネントでの選択を処理するためにbasicInformation
JSFフラグメントで使用されるマネージドBeanです。customer-registration
タスク・フロー内で単独で使用されるため、customer-registration-task-flow
定義ファイルに登録されます。
この項では、タスク・フロー(デフォルトのadfc-config
フローまたはバインド・タスク・フロー)内で使用するマネージドBeanの作成方法について説明しています。マネージドBeanおよびJSFページのバッキングBeanとしてのマネージドBeanの使用方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のマネージドBeanの作成と使用に関する項を参照してください。
タスク・フロー定義のエディタを使用すると、マネージドBeanを作成し、同時にJSFアプリケーションに登録できます。
タスク・フローのマネージドBeanを作成するには:
「アプリケーション・ナビゲータ」で、adfc-config.xml
ファイルまたはその他のタスク・フロー定義ファイルをダブルクリックします。
ウィンドウの下部で、「概要」タブをクリックします。
概要エディタで、「マネージドBean」ナビゲーション・タブをクリックします。図20-2はadfc-config.xml
ファイルのエディタを示しています。
「Managed Bean」表に行を追加するには、「追加」アイコンをクリックします。
フィールドに次のように入力します。
managed-bean-name: Beanの名前。
managed-bean-class: Beanに対応するクラスがすでに作成されている場合、managed-bean-classフィールドの参照(...)ボタンを使用してクラスを検索し、選択します。クラスが存在しない場合、使用する名前を入力します。同様に、すべてのパッケージ名が含まれていることを確認してください。その後、ドロップダウン・メニューを使用して「クラスの生成」を選択すると、Javaファイルが自動的に作成されます。
managed-bean-scope: Beanのスコープ。様々なオブジェクト・スコープの詳細は、21.3項「オブジェクト・スコープ・ライフサイクル」を参照してください。
注意: マネージドBeanの登録または値の格納に使用するスコープを決める際には、次に留意してください。
|
Beanに必要なプロパティをオプションで追加できます。「Managed Bean」表でBeanを選択し、「管理プロパティ」表の「追加」アイコンをクリックします。プロパティ名を入力します(他のフィールドはオプションです)。
注意: このエディタを使用して管理プロパティを宣言することはできますが、対応するコードはJavaクラスで生成されません。このコードを追加するために、適切なタイプのプライベート・メンバー・フィールドを作成し、ソース・エディタのポップアップ・メニューの「アクセッサの生成」メニュー項目を使用して、これらのBeanプロパティに対応するgetterメソッドおよびsetterメソッドを生成する必要があります。 |
構成エディタを使用してマネージドBeanを作成し、Javaファイルの生成を選択すると、JDeveloperによって、指定された名前のスタブ・クラスおよびデフォルトのコンストラクタが作成されます。例20-6は、ビュー・パッケージに格納されるMyBean
クラスに追加されたコードを示しています。
この時点で、タスク・フローまたはページによって要求されるロジックを追加する必要があります。その後、マネージドBeanに対して指定されたmanaged-bean-name
値を参照するEL式を使用して、そのロジックを参照できます。たとえば、BeanのmyInfo
プロパティにアクセスする場合のEL式は、次のようになります。
#{my_bean.myInfo}
また、JDeveloperによってmanaged-bean
要素が適切なタスク定義ファイルに追加されます。例20-7は、MyBean
クラスに対して作成されたmanaged-bean
要素を示しています。
通常、クラスタ環境で実行されるアプリケーションでは、アプリケーションの状態がクラスタ内の他のサーバーで使用できるように、各リクエストの最後にその状態がシリアライズされ、別のサーバーまたはデータ・ストアにコピーされます。
注意: ADF Facesコンポーネントはシリアライズ可能でないため、マネージドBeanによってADF Facesコンポーネントの |
クラスタ環境で実行するようにアプリケーションを設計している場合は、次の点が必要です。
存続期間が1つのリクエストより長いマネージドBeanは、すべてシリアライズ可能にします(つまり、java.io.Serializable
インタフェースを実装します)。具体的には、セッション・スコープ、ページ・フロー・スコープおよびビュー・スコープに格納されているBeanは、シリアライズ可能である必要があります。
ヒント: ページ・フロー・スコープおよびビュー・スコープに格納されているオブジェクトでの失敗を識別するには、 |
ADFスコープ(ビュー・スコープおよびページ・フロー・スコープ)に格納されるマネージドBeanへの変更がフレームワークで認識されるようにします。
ビュー・スコープとページ・フロー・スコープのいずれかで、マネージドBean内の値が変更された場合には、アプリケーションがフレームワークに通知して、Beanの新しい値がレプリケートされるようにする必要があります。
例20-8では、ビュー・スコープ内のオブジェクトの属性が変更されます。
例20-8 viewScope内のオブジェクトを変更するコード
Map<String, Object> viewScope = AdfFacesContext.getCurrentInstance().getViewScope(); MyObject obj = (MyObject)viewScope.get("myObjectName"); Obj.setFoo("newValue");
コードを追加しないかぎり、この変更はフレームワークに通知されないため、新しい値をクラスタ内でレプリケートする必要があることも認識されません。ADFスコープ内のオブジェクトが変更されたためにレプリケーションが必要であることをフレームワークに通知するには、例20-9に示すように、markScopeDirty()
メソッドを使用します。markScopeDirty()
メソッドは、viewScope
およびpageFlowScope
のみをパラメータとして受け入れます。
例20-9 オブジェクトの変更をOracle ADFに通知するための追加のコード
ControllerContext ctx = ControllerContext.getInstance(); ctx.markScopeDirty(viewScope);
このコードは、ADFスコープのいずれかにある既存のオブジェクトを変更するリクエストに対して必要になります。スコープ自体がスコープのput()
、remove()
またはclear()
メソッドによって変更された場合は、フレームワークに通知する必要はありません。
アプリケーションをクラスタ環境にデプロイしない場合、ADFメモリー・スコープに対する変更を追跡する必要はなく、デフォルトでこの機能は無効になっています。サーバー・クラスタ内において、ADFコントローラでADFメモリー・スコープに対する変更を追跡し、ページ・フロー・スコープおよびビュー・スコープをレプリケートできるようにするには、adf-config.xml
ファイルの<adf-scope-ha-support>
パラメータをtrue
に設定します。スコープのレプリケーションでは小さいパフォーマンス・オーバーヘッドが生じるため、サーバー/クラスタ環境でアプリケーションを実行する場合にかぎり、この機能を有効にしてください。
例20-10に、adf-config.xml
ファイルでtrue
に設定されたadf-scope-ha-support
を示します。
例20-10 adf-config.xmlファイルにおけるadf-scope-ha-supportパラメータ
<?xml version="1.0" encoding="US-ASCII" ?> <adf-config xmlns="http://xmlns.oracle.com/adf/config" xmlns:adfc="http://xmlns.oracle.com/adf/controller/config"> <adfc:adf-controller-config> ... <adfc:adf-scope-ha-support>true</adfc:adf-scope-ha-support> ... </adfc:adf-controller-config> ... </adf-config>