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