Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.2.1.2.0) E82918-03 |
|
![]() 前 |
![]() 次 |
この章の内容は次のとおりです。
ADF Facesは、最小限の手書きコーディングによるJavaScriptでのWebアプリケーションの開発に使用できる一連のAjax対応のJavaServer Faces (JSF)コンポーネントです。追加機能を備えたWebアプリケーションの開発時には、ADFモデル・データ・バインディングを使用できます。
Webインタフェースを開始するための必知事項のほとんどは、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「ADF Facesの概要」で説明されています。ただし、JSFマネージドBeanのかわりにADFモデル・レイヤーを使用してデータバインディングを行うと、宣言的にコンポーネントをビジネス・サービスにバインドする機能など、追加の機能を使用できます。ADFモデルが提供する内容は、「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。
この章では、Facesのマニュアルに詳細が含まれているWebインタフェース開発プロセスの概要を提供するとともに、ADFモデル・データ・バインディングを使用した場合に使用できる追加の機能に関する情報を提供します。
「Oracle ADFを使用したFusion Webアプリケーションの構築の概要」で説明した開発プロセスに従い、ADF Facesを使用してWebアプリケーションを開発し、データ・バインディングにADFモデルを使用するには、次の手順が必要です。
ページのADF Facesテンプレートの作成(オプション)
ページ内で使用するリージョンへの個別のページおよびページ・フラグメントの作成
必要なマネージドBeanの作成
また、Fusion Webアプリケーションのライフサイクルは、標準のJSFアプリケーションまたはADF Facesアプリケーションのライフサイクルとは異なります。ライフサイクルの仕組みは、「Fusionページ・ライフサイクルの理解」を参照してください。
マネージドBeanは、ページやタスク・フローに柔軟にUIレベル・コードを追加するためのJavaクラスです。これらを、フロント・エンド・データ操作やイベント処理などの機能に使用できます。
ADF Facesページ・テンプレートは、Webページを構築するための構造、整合性および再利用性を提供します。ページ・テンプレートを1つ作成して複数のページに適用することで、一貫性のあるルック・アンド・フィールを実現できます。ページを作成するたびに同じ要素を配置する必要がなくなるため、時間と労力を節約できます。
create-edit-orders-task-flow-definition
では、ShuttleBean
を使用して、先行リストからの使用可能な製品を後続リストの選択した製品に移動するシャトル・コンポーネントをサポートするコードを示します。マネージドBeanには、使用可能製品リストおよび選択済製品リストにデータを移入するために必要なコードが含まれます。図29-1は、create-edit-orders-task-flow-definition
で使用されるマネージドBeanを示しています。
図29-1 create-edit-orders-task-flow-definitionのマネージドBean
ADFモデル・レイヤーを構成または使用する前に、他のOracle ADF機能を理解しておくと役立つ場合があります。また、モデル・レイヤーの構成によって可能になることについても、確認しておくことをお薦めします。次に、関連する他の機能へのリンクを示します。
ページ・テンプレートの使用の詳細は、「Fusion WebアプリケーションでのADFモデルの使用」および『Oracle ADF FacesによるWebユーザー・インタフェースの開発』のページ・テンプレートの作成方法に関する項を参照してください。
標準JSFアプリケーションでのマネージドBeanの詳細は、Oracle Technology Network WebサイトのJava EEチュートリアル(http://www.oracle.com/technetwork/java/javaee/overview/index.html
)を参照してください。マネージドBeanおよびスコープ値の詳細は、「オブジェクト・スコープ・ライフサイクルについて」を参照してください。
ADFページ・テンプレートを使用すると、ページの特定の属性値を含め、ページ全体のレイアウトを定義できます。クイック・レイアウト設計のいずれかを使用することも、テンプレートのレイアウトを自分で作成することもできます。
アプリケーション・フローを設計すると同時に、ページのデザインの検討も開始できます。アプリケーション全体の整合性を保持するには、ADFページ・テンプレートを使用します。これらのページ・テンプレートは、Webページを作成する開発者に構造および整合性を提供します。ページ・テンプレートには通常、使用時に変更できない静的領域、および開発者が作成するページに固有のコンテンツを配置できる動的領域があります。
たとえば、ページ・テンプレートには、ブランド表示およびナビゲーションのための上部領域、著作権情報を表示する下部領域、およびページのメイン・コンテンツ用の中央領域が提供されます。このテンプレートを使用するページ開発者は、ブランド表示および著作権情報について何もする必要はありません。メイン・コンテンツ領域のみを開発します。
ADF Facesコンポーネントを使用してページ・テンプレートを作成し、さらにテンプレート定義に属性を追加できます。これらの属性は、ページ・テンプレートを使用するときにページ開発者が提供する必要がある特定の情報のプレースホルダとなります。たとえば、ようこそメッセージに属性を追加している場合、およびページ開発者がこのページ・テンプレートを使用する際に、ページごとに異なるようこそメッセージを追加できます。
また、ページ・テンプレートにファセット参照を追加することもできます。この参照は、ページ上のコンテンツのプレースホルダとして機能します。図29-2に、ページ・テンプレートで使用可能なファセットのレンディションを示します。
図29-2 ページ・テンプレートのファセット
このページ・テンプレートでは、ファセット参照は4つの異なるpanelSplitter
コンポーネント内で使用されています。このページ・テンプレートを使用してホームページを作成すると、ナビゲーション・リンクはHeaderファセット内に配置され、ナビゲーション・ツリーや検索パネルを含むアコーディオン・パネルはStartファセット内に配置されます。カートの合計はEndファセットに配置され、ページの主要部分はCenterファセットに配置されます。著作権情報はBottomファセットに配置されます。
データバインドされたコンポーネントをページ・テンプレートに追加することを選択した場合、関連するページ定義ファイルおよびADFモデル・レイヤー・データ・バインディングをサポートする他のメタデータ・ファイルが作成されます。「Fusion WebアプリケーションでのADFモデルの使用」で説明しているように、各コンポーネントは標準JSFページと同様にバインドされます。また、ページ・テンプレートのモデル・パラメータも作成できます。それらのパラメータの値は、実行時にコール元のページから設定できます。
たとえば、ページ・テンプレートを使用している各ページに製品の一覧を表示する場合、ProductVO
コレクションのName
属性をリストとしてドラッグ・アンド・ドロップできます。また、現在選択されている製品IDをページに表示する場合は、その製品のIDに評価されるモデル・パラメータをページ・テンプレートに対して作成できます。
注意:
ページ・テンプレートは本来プロジェクト・アーティファクトです。プロジェクトとアプリケーションの間で再利用できますが、完全な自己完結型ではなく、ADFデータバインディング、メッセージ・バンドルのString
、イメージ、およびマネージドBeanなどの外部リソースに対して常に依存します。
ページ・テンプレートにデータバインドされたコンポーネントが含まれない場合は、EL式を使用してコール元のページから動的に参照できます。つまり、使用するページ・テンプレートを実行時に決めることができます。たとえば、ユーザーの選択に基づいてtemplateAまたはtemplateBを使用できます。ページにページ・テンプレートを追加すると、af:pageTemplate
タグがページに追加されます。このaf:pageTemplate
タグには、そのページで使用されるページ・テンプレートを指定するviewId
属性が含まれます。次の例に示すように、EL式を使用して、ページ・テンプレートId
を戻すマネージドBeanメソッドにviewId
を設定できます。
<af:pageTemplate id="pt1" viewId="#{myBean.templateViewId}"
ページ・テンプレートにデータバインドされたコンポーネントが含まれる場合、EL式でviewId
を設定するのみでは不十分です。データバインドされたコンポーネントにはバインディング・コンテナへのアクセスが必要なため、ページ・テンプレートおよび関連付けられているバインディング・コンテナを指定する必要があります。
データバインドされているページ・テンプレートでは、pageTemplateModel
を使用して、ページ・テンプレートId
および関連付けられているバインディング・コンテナの両方を管理します。JSFページでは、viewId
属性を使用するかわりに、value
属性をpageTemplateModel
に設定します。また、コール元ページのページ定義ファイルのページ実行可能セクションを変更し、ページ・テンプレートId
を処理するメソッドを使用してマネージドBeanを作成する必要があります。詳細な手順は、「データバインドされたページ・テンプレートをページに動的に追加する方法」を参照してください。
ADFビジネス・コンポーネントおよびADFモデル・レイヤー・データ・バインディングを使用するアプリケーションで使用するページ・テンプレートの作成方法は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』のページ・テンプレートの使用方法に関する項に記載されているように、標準のADF Facesページ・テンプレートの作成方法と同様です。テンプレートを作成すると、「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップできます。このパネルから項目をドラッグ・アンド・ドロップすると、ページ定義ファイルが自動的に追加されます。
ページ・テンプレートの作成ウィザードを使用しても、テンプレートで使用するためのモデル・パラメータを作成できます。
始める前に:
基本的なページ・テンプレートの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「ページ・テンプレートの使用方法」を参照してください。
また、ページ・テンプレートで使用可能な追加機能についても理解しておくと役立ちます。詳細は、「ページ・テンプレートおよびマネージドBeanの追加機能」を参照してください。
次のタスクを完了する必要があります。
モデル・パラメータをテンプレートに追加するには:
これで、この部の残りの章で説明しているように、標準JSFページと同様、「データ・コントロール」パネルを使用してデータバインドされたUIコンポーネントをページに追加できるようになりました。
注意:
テンプレートにメソッド・イテレータにバインドされたメソッド・アクションが含まれる場合、イテレータのrefresh
属性の値をDefault
以外の値に変更できません。Default
以外の値に設定すると、メソッドは実行されません。
ADFのデータバインドされたコンポーネントをテンプレートに追加したり、テンプレートにモデル・パラメータを作成すると、そのテンプレートのページ定義ファイルが作成され、そのファイルにモデル・パラメータが追加されます。
注意:
この項では、静的に割り当てられるページ・テンプレートの処理について説明します。動的テンプレートの詳細は、「データバインドされたページ・テンプレートをページに動的に追加する方法」を参照してください。
次の例は、productId
モデル・パラメータを作成したテンプレートのページ定義ファイルを示しています。
<parameters> <parameter id="productID" readonly="true" value="#{bindings.productId.inputValue}"/> </parameters> <executables/> <bindings/>
パラメータ・バインディング・オブジェクトにより、リクエスト開始時にページによって評価されるパラメータが宣言されます。バインディング・オブジェクトおよびADFライフサイクルの詳細は、「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。ただし、テンプレート自体は実行されることはないため、テンプレートを使用するページ(コール元ページ)は、テンプレート用に作成されたバインディング・オブジェクト(「データ・コントロール」パネルからテンプレートにオブジェクトをドラッグ・アンド・ドロップして作成した、パラメータまたはその他のタイプのバインディング・オブジェクトを含む)にアクセスする必要があります。
テンプレートのバインディング・オブジェクトにアクセスするには、コール元のページのページ定義ファイルで、テンプレートのページ定義ファイルが示すバインディング・コンテナをインスタンス化する必要があります。その結果、テンプレートのページ定義への参照は、次の例に示すようにコール元のページのページ定義ファイルに実行可能ファイルとして挿入されます。
<executables> <page path="oracle.summt.view.pageDefs.MyTemplatePageDef" id="pageTemplateBinding"/> </executables>
この例のコール元ページは、MyTemplate
テンプレートを使用して作成されています。MyTemplate
テンプレートのページ定義ファイルはコール元ページの実行可能ファイルとして表示されるため、 コール元ページのバインディング・コンテナがインスタンス化されると、続いてMyTemplatePageDef
のバインディング・コンテナがインスタンス化され、これによってパラメータ値またはその他のデータバインドされた値へのアクセスが可能になります。
この参照にはID(この例ではpageTemplateBinding
)があるため、コール元のページはテンプレートから値にアクセス可能なコンポーネントを保持できます。テンプレートからJSFページを作成する場合、テンプレート内のコードを繰り返す必要はなく、かわりにコール元のページにaf:pageTemplate
タグを使用できます。このタグは、テンプレートJSFページへのパスを含みます。
また、テンプレートにADFデータ・バインディングが含まれている場合、そのタグの値は次の例に示すように、テンプレートのページ定義へのコール元のページの参照に設定されたIDとなります。
<af:pageTemplate viewId="/MyTemplate.jspx" value="#{bindings.pageTemplateBinding}".../>
ページ・テンプレートを選択するEL式を使用することで、データバインドされたコンポーネントを含まないページ・テンプレートを動的に追加できます。手順の詳細は、「ページ・テンプレートの使用方法」を参照してください。
また、データバインドされたコンポーネントを含むページ・テンプレートを静的に追加できます。手順の詳細は、「ADFページ・テンプレートでのADFデータ・バインディングの使用方法」を参照してください。
この項では、データバインドされたコンポーネントを含むページ・テンプレートをページに動的に追加する方法を説明します。詳細は、「ページ・テンプレートの使用方法」を参照してください。
ページ・テンプレートおよびそのバインディング・コンテナを動的に管理するには、pageTemplateModel
を使用します。ページ定義ファイル内でEL式を使用して、ページ・テンプレートId
を設定します。ページ・テンプレートId
を戻すためのマネージドBeanメソッドを作成します。
始める前に:
基本的なページ・テンプレートの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「ページ・テンプレートの使用方法」を参照してください。
また、ページ・テンプレートで使用可能な追加機能についても理解しておくと役立ちます。詳細は、「ページ・テンプレートおよびマネージドBeanの追加機能」を参照してください。
次のタスクを完了する必要があります。
データバインドされたページ・テンプレートをページに動的に追加するには:
ADFデータ・バインディングを含むテンプレートを使用してページが作成される場合(テンプレートがないページなど)は、ページの作成にページ定義ファイルが使用されます。ライフサイクル中に、ページ・テンプレートのバインディング・コンテナも作成され、ページとテンプレートの両方に対するUIコンポーネントおよびバインディングが処理されます。
具体的には、次のような処理が行われます。
「Fusionページ・ライフサイクルの理解」で説明しているように、コール元のページは標準JSF/ADFライフサイクルに準拠します。ページがビューのリストア・フェーズを開始すると、コール元のページのURLはバインディング・コンテキストに送信され、対応するページ定義ファイルが検索されます。
内容の初期化フェーズ中に、コール元のページのバインディング・コンテナはページ定義ファイルに基づいて作成されます。
モデル準備フェーズ中に、実行可能なページ・テンプレートがリフレッシュされます。この時点で、テンプレートのバインディング・コンテナはテンプレートのページ定義ファイルに基づいて作成され、バインディング・コンテキストに追加されます。
ライフサイクルは、処理対象のページとテンプレートの両方のUIコンポーネントおよびバインディングとともに継続します。
Fusion Webアプリケーションの開発時に、ページ・テンプレートおよびページ・フラグメントを使用してWebページを構築します。「JSFページの作成」ダイアログを使用してWebページを作成する他、ADFセキュリティ・フレームワーク内でWebページを保護することもできます。
タスク・フローのビュー・アクティビティをダブルクリックするか、新規ギャラリを使用して、ページを作成できます。ページの作成時(またはビュー・アクティビティをタスク・フロー上にドロップする際)には、JSF JSPまたはJSF JSPフラグメントのどちらとしてページを作成するかを選択できます。JSFフラグメントは、プロジェクト内に再利用可能なページ・コンテンツを作成するための簡単な方法を提供するもので、タスク・フローをページ上のリージョンとして使用する場合に使用します。JSFページ・フラグメントを変更すると、そのページ・フラグメントを使用するJSFページが自動的に更新されます。
注意:
JDeveloperはFaceletsを使用するアプリケーションでのXHTMLファイルの使用をサポートしていますが、faces-config.xml
およびadfc-config.xml
ダイアグラマはXHTMLをサポートしていません。これらのファイルにナビゲーションを追加するには、「ソース」タブをクリックしてコードを手動で編集する必要があります。
ページへのコンテンツの追加を開始する場合、通常はJDeveloperの「コンポーネント」ウィンドウと「データ・コントロール」パネルを使用します。「コンポーネント」ウィンドウには、ページを宣言的に設計するために必要なすべてのADF Facesコンポーネントが含まれます。基本的なレイアウト・コンポーネントをページに配置すると、「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップし、ADF ModelのデータバインドされたUIコンポーネントを作成できます。このマニュアルの後の章では、ADFモデル・データバインディングを使用して作成できる異なるタイプのデータバインドされたコンポーネントとページの詳細を説明します。
「JSFページの作成」ダイアログを使用して、Webページを作成します。
始める前に:
ページの作成時には様々なオプションに関する知識が役立つ場合があります。詳細は、「Webページの作成」を参照してください。
Webページを作成するには:
ページの作成時の使用可能なテンプレートおよび処理の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』のビュー・ページの作成に関する項を参照してください。
新規の空白Webページを作成する場合は、作業しているプロジェクトのタイプおよびプロジェクトでインポートされているタグ・ライブラリによって、生成されるコードが異なる場合があります。たとえば、「カスタム・プロジェクト」テンプレートから作成したプロジェクトで作業している場合、および「JSFページの作成」ダイアログで「空白ページの作成」オプションを選択した場合、ADF Fusion Webアプリケーション・ワークスペースのUIプロジェクトの同様な状況下と同様に生成されたコードには、ADF Facesタグが含まれない場合があります。
ADF Facesタグを含む事前定義済レイアウトなしでページを作成する場合、「JSFページの作成」ダイアログの「クイック・スタート・レイアウトのコピー」オプションを選択し、単純なレイアウトを選択するほうが容易な場合があります。このオプションを選択すると、プロジェクト内にADF Facesタグ・ライブラリのインポートがトリガーされます。また、プロジェクトに作成する後のページは、「空白ページの作成」オプションを選択して作成された場合でも、ADF Facesタグを使用します。
Webページを作成する場合は、セキュリティを適用する方法について計画を立てる必要があります。
ADFセキュリティ・フレームワーク内でWebページを保護するには、ページのページ定義ファイルを実際にセキュリティ保護します。ページがバインド・タスク・フロー内にある場合、バインド・タスク・フローが保護されます(そのバインド・タスク・フローに適用されるセキュリティ・ポリシーは、そのタスク・フロー内のページのすべてに適用されます)。ページがバインド・タスク・フロー内である場合、ユーザーはそのページに直接アクセスできるので、ページ定義ファイルにセキュリティ・ポリシーを適用しないでください。
Webページの保護の詳細は、「ADFセキュリティ・ポリシーの定義」を参照してください。
標準のJSFアプリケーションには、1つ以上のマネージドBeanが含まれており、それぞれ特定のページで使用されるコンポーネントと関連付けることができます。マネージドBeanは、JSFアプリケーションまたはFusion Webアプリケーションの構成ファイルに登録する必要があります。
マネージド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をどの順序でインスタンス化する必要があるかによって異なります。表29-1に、各タイプの構成ファイルへのBeanの登録がBeanにどのような影響を与えるかを示します。
注意:
Fusion Webアプリケーションは、ADFタスク・フローによって提供される機能を利用します。タスク・フロー定義内でアクセスされたマネージドBeanは、faces-config.xml
ファイル内ではなく、そのタスク・フローの定義ファイル内に登録する必要があります。
表29-1 マネージドBeanの構成配置の影響
マネージドBeanの配置 | 影響 |
---|---|
|
|
タスク・フロー定義ファイル |
|
|
|
Fusion Webアプリケーションの一般的な規則として、複数のページまたはタスク・フローで使用できるBean、または主要なバインドなしタスク・フロー(adfc-config
)内のページで使用されるBeanは、adfc-config.xml
構成ファイルに登録する必要があります。特定のタスク・フローでのみ使用されるマネージドBeanは、そのタスク・フローの定義ファイルで登録する必要があります。faces-config.xml
ファイルには、Beanは登録されません。
注意:
JDeveloperのダイアログからマネージドBeanを作成した場合、adfc-config.xml
ファイルが存在すれば、このファイルにBeanが登録されます。
たとえば、Oracle ADFのSummitサンプル・アプリケーションでは、ShuttleBean
はそのページのシャトル・コンポーネントの選択内容を処理するために、showshuttle
ページによって使用されるマネージドBeanです。create-edit-orders-task-flow-definition
タスク・フロー内で単独で使用されるため、create-edit-orders-task-flow-definition
定義ファイルに登録されます。
タスク・フロー(デフォルトのadfc-config
フローまたはバインド・タスク・フロー)内で使用するマネージドBeanを作成できます。マネージドBeanおよびJSFページのバッキングBeanとしてのマネージドBeanの使用方法の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』のマネージドBeanの作成と使用に関する項を参照してください。
タスク・フロー定義のエディタを使用すると、マネージドBeanを作成し、同時にJSFアプリケーションに登録できます。
始める前に:
マネージドBeanの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。
また、マネージドBeanに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「ページ・テンプレートおよびマネージドBeanの追加機能」を参照してください。
次のタスクを完了する必要があります。
faces-config.xml
、adfc-config.xml
またはバインド・タスク・フロー定義ファイルを使用できます。 adfc-config.xmlまたはタスク・フローのマネージドBeanを作成するには:
構成エディタを使用してマネージドBeanを作成し、Javaファイルの生成を選択すると、JDeveloperによって、指定された名前のスタブ・クラスおよびデフォルトのコンストラクタが作成されます。次の例に、ビュー・パッケージに格納されたMyBean
クラスに追加されるコードを示します。
package view; public class MyBean { public MyBean() { } }
この時点で、タスク・フローまたはページによって要求されるロジックを追加する必要があります。その後、マネージドBeanに対して指定されたmanaged-bean-name
値を参照するEL式を使用して、そのロジックを参照できます。たとえば、BeanのmyInfo
プロパティにアクセスする場合のEL式は、次のようになります。
#{my_bean.myInfo}
また、JDeveloperによってmanaged-bean
要素が適切なタスク定義ファイルに追加されます。次は、MyBean
クラスに対して作成されたmanaged-bean
要素を示しています。
<managed-bean> <managed-bean-name>my_bean</managed-bean-name> <managed-bean-class>view.MyBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>
通常、クラスタ環境で実行されるアプリケーションでは、アプリケーションの状態がクラスタ内の他のサーバーで使用できるように、各リクエストの最後にその状態がシリアライズされ、別のサーバーまたはデータ・ストアにコピーされます。
注意:
ADF Facesコンポーネントはシリアライズ可能でないため、マネージドBeanによってADF Facesコンポーネントのset
およびget
メソッドがコールされる場合は、マネージドBeanをシリアライズできません。別の方法でADF Facesコンポーネントにアクセスする必要があります。
クラスタ環境で実行するようにアプリケーションを設計している場合は、次の点が必要です。
存続期間が1つのリクエストより長いマネージドBeanは、すべてシリアライズ可能にします(つまり、java.io.Serializable
インタフェースを実装します)。具体的には、セッション・スコープ、ページ・フロー・スコープおよびビュー・スコープに格納されているBeanは、シリアライズ可能である必要があります。
ヒント:
ページ・フロー・スコープおよびビュー・スコープに格納されているオブジェクトでの失敗を識別するには、writeObject()
を使用します。このメソッドにより、シリアライズに失敗したオブジェクトおよびスコープに関する例外の追加情報が提供されます。追加情報は、リージョンのページ・フロー・スコープおよびオブジェクトのキーなどの可能性があります。
ADFスコープ(ビュー・スコープおよびページ・フロー・スコープ)に格納されるマネージドBeanへの変更がフレームワークで認識されるようにします。
ビュー・スコープとページ・フロー・スコープのいずれかで、マネージドBean内の値が変更された場合には、アプリケーションがフレームワークに通知して、Beanの新しい値がレプリケートされるようにする必要があります。
この例では、ビュー・スコープ内のオブジェクトの属性が変更されます。
Map<String, Object> viewScope = AdfFacesContext.getCurrentInstance().getViewScope(); MyObject obj = (MyObject)viewScope.get("myObjectName"); Obj.setFoo("newValue");
コードを追加しないかぎり、この変更はフレームワークに通知されないため、新しい値をクラスタ内でレプリケートする必要があることも認識されません。ADFスコープ内のオブジェクトが変更されたためにレプリケーションが必要であることをフレームワークに通知するには、次の例に示すように、markScopeDirty()
メソッドを使用します。markScopeDirty()
メソッドは、viewScope
およびpageFlowScope
のみをパラメータとして受け入れます。
ControllerContext ctx = ControllerContext.getInstance(); ctx.markScopeDirty(viewScope);
このコードは、ADFスコープのいずれかにある既存のオブジェクトを変更するリクエストに対して必要になります。スコープ自体がスコープのput()
、remove()
またはclear()
メソッドによって変更された場合は、フレームワークに通知する必要はありません。
アプリケーションをクラスタ環境にデプロイしない場合、ADFメモリー・スコープに対する変更を追跡する必要はなく、デフォルトでこの機能は無効になっています。サーバー・クラスタ内において、ADF ControllerでADFメモリー・スコープに対する変更を追跡し、ページ・フロー・スコープおよびビュー・スコープをレプリケートできるようにするには、adf-config.xml
ファイルの<adf-scope-ha-support>
パラメータをtrue
に設定します。スコープのレプリケーションでは小さいパフォーマンス・オーバーヘッドが生じるため、サーバー/クラスタ環境でアプリケーションを実行する場合にかぎり、この機能を有効にしてください。
次は、adf-config.xml
ファイルでtrue
に設定された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>