29 Webインタフェースの概説

この章では、Fusion WebアプリケーションでADF Facesコンポーネントを使用してデータバインドされたUIコンポーネントを作成するために、ADFデータ・コントロールの操作を開始する方法について説明します。ページ・テンプレートおよびページ・フラグメントを使用したページの作成方法を説明します。マネージドBeanを使用してページのロジックを格納する方法についても説明します。

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

ADF Facesを使用したWebアプリケーション開発について

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つ作成して複数のページに適用することで、一貫性のあるルック・アンド・フィールを実現できます。ページを作成するたびに同じ要素を配置する必要がなくなるため、時間と労力を節約できます。

ページ・テンプレートおよびマネージドBeanのユースケースと例

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

図29-1の説明が続きます
「図29-1 create-edit-orders-task-flow-definitionのマネージドBean」の説明

ページ・テンプレートおよびマネージドBeanの追加機能

ADFモデル・レイヤーを構成または使用する前に、他のOracle ADF機能を理解しておくと役立つ場合があります。また、モデル・レイヤーの構成によって可能になることについても、確認しておくことをお薦めします。次に、関連する他の機能へのリンクを示します。

ページ・テンプレートの使用

ADFページ・テンプレートを使用すると、ページの特定の属性値を含め、ページ全体のレイアウトを定義できます。クイック・レイアウト設計のいずれかを使用することも、テンプレートのレイアウトを自分で作成することもできます。

アプリケーション・フローを設計すると同時に、ページのデザインの検討も開始できます。アプリケーション全体の整合性を保持するには、ADFページ・テンプレートを使用します。これらのページ・テンプレートは、Webページを作成する開発者に構造および整合性を提供します。ページ・テンプレートには通常、使用時に変更できない静的領域、および開発者が作成するページに固有のコンテンツを配置できる動的領域があります。

たとえば、ページ・テンプレートには、ブランド表示およびナビゲーションのための上部領域、著作権情報を表示する下部領域、およびページのメイン・コンテンツ用の中央領域が提供されます。このテンプレートを使用するページ開発者は、ブランド表示および著作権情報について何もする必要はありません。メイン・コンテンツ領域のみを開発します。

ADF Facesコンポーネントを使用してページ・テンプレートを作成し、さらにテンプレート定義に属性を追加できます。これらの属性は、ページ・テンプレートを使用するときにページ開発者が提供する必要がある特定の情報のプレースホルダとなります。たとえば、ようこそメッセージに属性を追加している場合、およびページ開発者がこのページ・テンプレートを使用する際に、ページごとに異なるようこそメッセージを追加できます。

また、ページ・テンプレートにファセット参照を追加することもできます。この参照は、ページ上のコンテンツのプレースホルダとして機能します。図29-2に、ページ・テンプレートで使用可能なファセットのレンディションを示します。

図29-2 ページ・テンプレートのファセット

図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データ・バインディングの使用方法

ADFビジネス・コンポーネントおよびADFモデル・レイヤー・データ・バインディングを使用するアプリケーションで使用するページ・テンプレートの作成方法は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』ページ・テンプレートの使用方法に関する項に記載されているように、標準のADF Facesページ・テンプレートの作成方法と同様です。テンプレートを作成すると、「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップできます。このパネルから項目をドラッグ・アンド・ドロップすると、ページ定義ファイルが自動的に追加されます。

ページ・テンプレートの作成ウィザードを使用しても、テンプレートで使用するためのモデル・パラメータを作成できます。

始める前に:

基本的なページ・テンプレートの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「ページ・テンプレートの使用方法」を参照してください。

また、ページ・テンプレートで使用可能な追加機能についても理解しておくと役立ちます。詳細は、「ページ・テンプレートおよびマネージドBeanの追加機能」を参照してください。

次のタスクを完了する必要があります。

  • 『Oracle ADF FacesによるWebユーザー・インタフェースの開発』ページ・テンプレートの作成方法に関する項の説明に従って、ADFビジネス・コンポーネントおよびADFモデル・レイヤー・データ・バインディングを使用するページ・テンプレートを作成します。ただし、ダイアログを完成させないでください。

モデル・パラメータをテンプレートに追加するには:

  1. ページ・テンプレートの作成ウィザードの「データ・バインディング」ページで、「ページ定義ファイルの作成」を選択します。

    ノート:

    パラメータを追加する場合は、このチェック・ボックスのみを選択します。「データ・コントロール」パネルから項目をドラッグ・アンド・ドロップすると、ページ定義ファイルが自動的に追加されます。

  2. 「追加」アイコンをクリックします。
  3. パラメータに、次のように入力します。
    • ID: パラメータの名前を入力します。

    • : 値に、解決可能な値またはEL式を入力します。必要に応じて、「式ビルダーの起動」(...)ボタンをクリックして「式ビルダー」を開きます。式ビルダーを使用して式を作成できます。EL式およびEL式ビルダーの詳細は、「ADFデータ・バインディングのEL式の作成」を参照してください。

    • オプション: パラメータ値の指定方法を決定するオプションを選択します。

      • オプション: コール元によって特にパラメータが設定されていない場合のみ、バインディング定義の値が使用されます。これはデフォルトです。

      • 最終: このパラメータに使用する値にアクセスするための式が、バインディング定義に含まれています。

      • 必須: コール元がパラメータ値を設定する必要があります。

    • 読取り専用: パラメータ値が読取り専用であり、上書きしない場合に選択します。

  4. 必要に応じてさらにパラメータを作成します。「順序」ボタンを使用し、評価する順序にパラメータを整列させます。

これで、この部の残りの章で説明しているように、標準JSFページと同様、「データ・コントロール」パネルを使用してデータバインドされたUIコンポーネントをページに追加できるようになりました。

ノート:

テンプレートにメソッド・イテレータにバインドされたメソッド・アクションが含まれる場合、イテレータのrefresh属性の値をDefault以外の値に変更できません。Default以外の値に設定すると、メソッドは実行されません。

ページ・テンプレートにADFモデル・レイヤー・バインディングを使用するときに行われる処理

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の追加機能」を参照してください。

次のタスクを完了する必要があります。

データバインドされたページ・テンプレートをページに動的に追加するには:

  1. JSFページ・ソース・エディタで、viewId属性を削除してvalue属性をpageTemplateModelに変更します。明示的にpageTemplateModelを作成する必要はありません。対応するページ定義ファイルのページ実行可能バインディングのpageTemplateModelを使用できます。たとえば、pageTemplate1というページ実行可能バインディングでは、af:pageTemplateタグの下に次の行を追加します。
    value="#{bindings.pageTemplate1.templateModel}"/>
    
  2. ページ定義ファイルの<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>
    
  3. 現在のページ・テンプレートIdを戻すメソッドを使用してpageFlowScopeマネージドBeanを作成します。

    マネージドBeanのコードは、次の例に含まれるもののようになります。この例の場合、gettemplateViewId()は、ユーザーのページ・テンプレートの選択を取得してページ・テンプレートIdを戻します。setMDTemplateViewId()は、ページ・テンプレートをMDPageTemplateに設定し、setPopupTemplateViewId()は、ページ・テンプレートをPopupPageTemplateに設定します。

    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データ・バインディングを含むテンプレートを使用してページが作成される場合(テンプレートがないページなど)は、ページの作成にページ定義ファイルが使用されます。ライフサイクル中に、ページ・テンプレートのバインディング・コンテナも作成され、ページとテンプレートの両方に対するUIコンポーネントおよびバインディングが処理されます。

具体的には、次のような処理が行われます。

  1. 「Fusionページ・ライフサイクルの理解」で説明しているように、コール元のページは標準JSF/ADFライフサイクルに準拠します。ページがビューのリストア・フェーズを開始すると、コール元のページのURLはバインディング・コンテキストに送信され、対応するページ定義ファイルが検索されます。

  2. 内容の初期化フェーズ中に、コール元のページのバインディング・コンテナはページ定義ファイルに基づいて作成されます。

  3. モデル準備フェーズ中に、実行可能なページ・テンプレートがリフレッシュされます。この時点で、テンプレートのバインディング・コンテナはテンプレートのページ定義ファイルに基づいて作成され、バインディング・コンテキストに追加されます。

  4. ライフサイクルは、処理対象のページとテンプレートの両方のUIコンポーネントおよびバインディングとともに継続します。

Webページの作成

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モデル・データバインディングを使用して作成できる異なるタイプのデータバインドされたコンポーネントとページの詳細を説明します。

Webページの作成方法

「JSFページの作成」ダイアログを使用して、Webページを作成します。

始める前に:

ページの作成時には様々なオプションに関する知識が役立つ場合があります。詳細は、「Webページの作成」を参照してください。

Webページを作成するには:

  1. 「アプリケーション」ウィンドウで、ページを保存するノード(ディレクトリ)を右クリックし、「新規」→「ページ」を選択します。
  2. 「JSFページの作成」ダイアログに従って操作を進めます。ヘルプを参照するには、ダイアログで「ヘルプ」をクリックします。

ページの作成時の使用可能なテンプレートおよび処理の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』ビュー・ページの作成に関する項を参照してください。

空白Webページの作成に関する必知事項

新規の空白Webページを作成する場合は、作業しているプロジェクトのタイプおよびプロジェクトでインポートされているタグ・ライブラリによって、生成されるコードが異なる場合があります。たとえば、「カスタム・プロジェクト」テンプレートから作成したプロジェクトで作業している場合、および「JSFページの作成」ダイアログで「空白ページの作成」オプションを選択した場合、ADF Fusion Webアプリケーション・ワークスペースのUIプロジェクトの同様な状況下と同様に生成されたコードには、ADF Facesタグが含まれない場合があります。

ADF Facesタグを含む事前定義済レイアウトなしでページを作成する場合、「JSFページの作成」ダイアログの「クイック・スタート・レイアウトのコピー」オプションを選択し、単純なレイアウトを選択するほうが容易な場合があります。このオプションを選択すると、プロジェクト内にADF Facesタグ・ライブラリのインポートがトリガーされます。また、プロジェクトに作成する後のページは、「空白ページの作成」オプションを選択して作成された場合でも、ADF Facesタグを使用します。

Webページのセキュリティ保護に関する必知事項

Webページを作成する場合は、セキュリティを適用する方法について計画を立てる必要があります。

ADFセキュリティ・フレームワーク内でWebページを保護するには、ページのページ定義ファイルを実際にセキュリティ保護します。ページがバインド・タスク・フロー内にある場合、バインド・タスク・フローが保護されます(そのバインド・タスク・フローに適用されるセキュリティ・ポリシーは、そのタスク・フロー内のページのすべてに適用されます)。ページがバインド・タスク・フロー内である場合、ユーザーはそのページに直接アクセスできるので、ページ定義ファイルにセキュリティ・ポリシーを適用しないでください。

Webページの保護の詳細は、「ADFセキュリティ・ポリシーの定義」を参照してください。

Fusion WebアプリケーションでのマネージドBeanの使用

標準の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の配置 効果

adfc-config.xml

  • マネージドBeanは任意のスコープにできます。ただし、ページ・フラグメントまたは宣言コンポーネントのバッキングBeanはBackingBeanスコープを使用する必要があります。スコープの詳細は、「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

  • バインドなしタスク・フロー内で実行した場合、adfc-config.xmlファイルの前にfaces-config.xmlでマネージドBeanの定義を確認します。

  • 参照の優先順位はスコープごとに実行されます。リクエスト・スコープのマネージドBeanは、セッション・スコープのマネージドBeanより優先されます。このため、adfc-config.xmlファイル内のfooという名前のリクエスト・スコープのマネージドBeanは、現在のタスク・フロー定義ファイルのfooという名前のセッション・スコープのマネージドBeanより優先されます。

  • すでにインスタンス化されたBeanは、インスタンス化される新しいインスタンスより優先されます。このため、fooという名前の既存のセッション・スコープのマネージドBeanは、現在のタスク・フロー定義ファイルで定義されたfooという名前のリクエスト・スコープBeanより常に優先されます。

タスク・フロー定義ファイル

  • マネージドBeanは任意のスコープにできます。ただし、タスク・フロー定義内でアクセスされるpageFlowスコープまたはviewスコープのマネージドBeanは、タスク・フロー定義ファイル内で定義する必要があります。タスク・フロー内のページ・フラグメントのバッキングBeanは、BackingBeanスコープを使用する必要があります。

  • タスク・フロー定義ファイル内のマネージドBean定義は、同じタスク・フロー内で実行されているアクティビティからのみ参照できます。

  • バインド・タスク・フロー内で実行した場合、現在実行中のタスク・フロー定義の前にfaces-config.xmlでマネージドBeanの定義を確認します。どちらの場所でも一致するものがない場合、adfc-config.xmlおよび他のブートストラップ構成ファイルを参照します。ただし、他のadfc-config.xmlおよびブートストラップ構成ファイルの参照は、セッション・スコープまたはアプリケーション・スコープのマネージドBeanでのみ発生します。

  • 参照の優先順位はスコープごとに実行されます。リクエスト・スコープのマネージドBeanは、セッション・スコープのマネージドBeanより優先されます。このため、adfc-config.xmlファイル内のfooという名前のリクエスト・スコープのマネージドBeanは、現在のタスク・フロー定義ファイルのfooという名前のセッション・スコープのマネージドBeanより優先されます。

  • すでにインスタンス化されたBeanは、インスタンス化される新しいインスタンスより優先されます。このため、fooという名前の既存のセッション・スコープのマネージドBeanは、現在のタスク・フロー定義ファイルで登録されたfooという名前のリクエスト・スコープBeanより常に優先されます。

  • カスタマイズ可能です。

faces-config.xml

  • マネージドBeanは、pageFlowスコープまたはviewスコープ以外の任意のスコープにできます。

  • マネージドBeanを検索する場合、常に最初にfaces-config.xmlファイルが参照されます。他の構成ファイルは、一致しない場合のみ検索されます。このため、faces-config.xmlファイルに登録された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を使用した情報の格納方法

タスク・フロー定義のエディタを使用すると、マネージドBeanを作成し、同時にJSFアプリケーションに登録できます。

始める前に:

マネージドBeanの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。

また、マネージドBeanに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「ページ・テンプレートおよびマネージドBeanの追加機能」を参照してください。

次のタスクを完了する必要があります。

  • マネージドBeanを関連付けるための構成ファイルを作成します(存在しない場合)。これには、faces-config.xmladfc-config.xmlまたはバインド・タスク・フロー定義ファイルを使用できます。

adfc-config.xmlまたはタスク・フローのマネージドBeanを作成するには:

  1. 「アプリケーション」ウィンドウで、adfc-config.xmlファイルまたはその他のタスク・フロー定義ファイルをダブルクリックします。
  2. 概要エディタで、「マネージドBean」ナビゲーション・タブをクリックします。図29-3adfc-config.xmlファイルのエディタを示しています。

    図29-3 adfc-config.xmlファイルのマネージドBean

    図29-3の説明が続きます
    「図29-3 adfc-config.xmlファイルのマネージドBean」の説明
  3. 「マネージドBean」ページで、「マネージドBean」表に行を追加するには、「追加」アイコンをクリックします。
  4. フィールドに次のように入力します。
    • 名前: Beanの名前。

    • クラス: Beanに対応するクラスがすでに作成されている場合、managed-bean-classフィールドの参照(...)ボタンを使用してクラスを検索し、選択します。クラスが存在しない場合、使用する名前を入力します。同様に、すべてのパッケージ名が含まれていることを確認してください。その後、ドロップダウン・メニューを使用して「クラスの生成」を選択すると、Javaファイルが自動的に作成されます。

    • スコープ: このBeanのスコープ。様々なオブジェクト・スコープの詳細は、「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

      ノート:

      マネージドBeanの登録または値の格納に使用するスコープを決める際には、次に留意してください。

      • 常に、できるかぎり狭いスコープを使用すること。

      • 使用するマネージドBeanが、コンポーネント・インスタンスを受け入れて戻すことでコンポーネント・バインディングに関与する場合(つまり、ページ上のUIコンポーネントがbinding属性を使用してBean上のコンポーネント・プロパティにバインドされる場合)、そのマネージドBeanをBackingBeanスコープに格納する必要があります。これらのスコープのいずれかに格納できない(たとえば、高可用性のためにsessionScopeに格納する必要がある)場合は、コンポーネント・バインディングを使用するかわりにComponentReference APIを使用する必要があります。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』コンポーネント・バインディングおよびマネージドBeanに関する必知事項に関する項を参照してください

      • sessionScopeスコープは、ユーザー情報やコンテキスト情報などのセッション全体に関係する情報にのみ使用します。あるページから別のページへの値の受渡しには、sessionScopeスコープは使用しないようにします。

      • スコープをnoneに設定することもできます。厳密にはスコープではありませんが、noneは、そのBeanが特定のスコープ内に存在するのではなく、参照されるたびにインスタンス化されることを意味します。別のBeanによって参照される場合は、Beanのスコープをnoneに設定する必要があります。

  5. Beanに必要なプロパティをオプションで追加できます。「Managed Bean」表でBeanを選択し、「管理プロパティ」表の「追加」アイコンをクリックします。プロパティ名を入力します(他のフィールドはオプションです)。

    ノート:

    このエディタを使用して管理プロパティを宣言することはできますが、対応するコードはJavaクラスで生成されません。このコードを追加するために、適切なタイプのプライベート・メンバー・フィールドを作成し、ソース・エディタのポップアップ・メニューの「アクセッサの生成」メニュー項目を使用して、これらのBeanプロパティに対応するgetterメソッドおよびsetterメソッドを生成する必要があります。

マネージド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>

サーバー/クラスタ環境でのマネージド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>