プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発
12c (12.2.1.1.0)
E77397-02
目次へ移動
目次

前
次

26 リージョンとしてのタスク・フローの使用

この章では、Fusion Webアプリケーションで、ADFリージョンを使用してページまたはページ・フラグメントにADFタスク・フローをレンダリングする方法を説明します。パラメータの指定、ADFリージョンのリフレッシュまたは起動方法、親ページへの移動、動的ADFリージョンの作成などの主要機能についても説明します。

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

26.1 ADFリージョンでのタスク・フローの使用について

ADFリージョンを使用して、JSFページまたはページ・フラグメント(.jsff)にバインド・タスク・フローを実行できます。バインド・タスク・フローをADFリージョンとして実行する主な理由として、再利用があります。特定のアプリケーション機能をバインド・タスク・フローおよびADFリージョンに分離することで、アプリケーション全体で再利用できます。バインド・タスク・フロー内のアプリケーション機能を抽出、構成およびパッケージ化すると、ADFリージョンを使用して他のページに追加できます。ADFリージョンは、必要に応じてどこでも再利用できます(つまり、親ページに依存しません)。さらに、親ページの表示をADFリージョンから分離することも可能で、メニュー、ボタンおよびナビゲーション領域はADFリージョンの表示内容に影響されません。バインド・タスク・フローを変更すると、変更内容はそのタスク・フローを使用するすべてのADFリージョンに適用されます。

ADFリージョンは次で構成されます。

  • リージョンをレンダリングするページまたはページ・フラグメントに表示されるaf:regionタグ

  • 次のパッケージのRegionModelを実装するインスタンス・オブジェクト

    oracle.adf.view.rich.model

    RegionModelの詳細は、Oracle ADF FacesのJava APIリファレンスを参照してください

  • 次のいずれかを実行します。

    • ADFリージョンで使用するバインド・タスク・フローを識別する、ページ定義内のタスク・フロー・バインディング(taskFlow)

    • ADFリージョンで使用するバインド・タスク・フローのリストを識別する、ページ定義内の複数タスク・フロー・バインディング(multiTaskFlow)

初めてレンダリングされるときのADFリージョンのコンテンツは、バインド・タスク・フロー内の最初のビュー・アクティビティのものです。バインド・タスク・フローで使用するビュー・アクティビティは、ページではなくページ・フラグメントに関連付ける必要があります。

タスク・フロー・バインディングの入力パラメータまたはコンテキスト・イベントを使用して、ADFリージョンに値を渡すことができます。また、タスク・フロー・バインディングのparametersMapプロパティを構成すると、そのタスク・フロー・バインディングによってバインド・タスク・フローからADFリージョンへ渡される入力パラメータを指定できます。

ADFリージョンを構成して、リージョンのアクティブ化やリフレッシュのタイミングを指定できます。また、ADFリージョンおよびバインド・タスク・フローを構成することで、バインド・タスク・フロー内でナビゲーション・コントロールを停止させ、ADFリージョンを含むページに渡すこともできます。さらに、リージョンにレンダリングされるバインド・タスク・フローをタスク・フロー・バインディングが実行時に決定する動的リージョン(ADF動的リージョン)を作成し、動的リージョン・リンクを構成すると、実行時にADF動的リージョンにレンダリングされるバインド・タスク・フローをエンド・ユーザーが変更できるようになります。

図26-1は、ADFリージョンをホストするページのページ定義ファイルにあるタスク・フロー・バインディングを使用して、ADFリージョンによるバインド・タスク・フローの参照方法を示しています。

図26-1 バインド・タスク・フローを参照するADFリージョン

この図は周囲のテキストで説明しています

26.1.1 ページ・フラグメントおよびADFリージョンについて

ページ・フラグメントとは、別のJSFページのコンテンツとしてレンダリングするJSFドキュメント(ファイル拡張子は.jsff)です。ページ・フラグメントに複数のルート・コンポーネントを使用することはできません。ページ・フラグメントの表示パフォーマンスを最適化するために、複数のルート・コンポーネントを1つのルート・コンポーネントにラップすると役立ちます。また、ページ・フラグメントに1つのビジュアル・ルート・コンポーネントおよび(起動するまでエンド・ユーザーに表示されない)popupコンポーネントのみが含まれる場合も、これらのコンポーネントを1つのルート・コンポーネントにラップすることを検討してください。たとえば、bottomHeight属性を0ピクセルに設定して、popupコンポーネントをpanelStretchLayoutコンポーネントの一番下のファセットに配置します。

ページ・フラグメントに複数のルート・コンポーネントがある場合は、次の例に示すとおり、Fusion Webアプリケーションによって実行時にメッセージが記録されます(ここで、r1はページ・フラグメントをレンダリングするADFリージョンを識別します)。

<RegionRenderer> <encodeAll> The region component with id: r1 has detected a page
 fragment with multiple root components. Fragments with more than one root
 component may not display correctly in a region and may have a negative impact
 on performance. It is recommended that you restructure the page fragment to have
 a single root component.

ルート・コンポーネント要素を1つのみにすることとは別に、ページ・フラグメントには次のいずれのタグも含めることはできません。

  • <af:document>

  • <f:view>

  • <f:form>

  • <html>

  • <head>

  • <body>

これらのタグはドキュメント内で1回のみ使用可能で、JSFページでのネストはサポートされません。たとえば、ページに実装されたページ・フラグメントに<html>タグを含められないのは、JSFページにすでに存在するからです。

次の例は、単純なページ・フラグメントを示しています。JSFページとは異なり、<f:view>タグや<f:form>タグは含まれていません。

<?xml version='1.0' encoding='UTF-8'?>
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                     xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
  <af:button text="button 1" id="b1"/>
</ui:composition>

別のJSFページに含めるページ・フラグメントは、リージョン(af:regionタグ)内でネストする必要があります。JSFページにリージョンとして追加されるバインド・タスク・フローはページをコールできないため、ページ・フラグメントをコールする必要があります。

26.1.2 ビュー・ポートおよびADFリージョンについて

ビュー・ポートは、他のビュー・ポートに関係なく移動できる表示領域です。ブラウザ・ウィンドウとADFリージョンはいずれもビュー・ポートの例です。ルート・ビュー・ポートには、ブラウザ・ウィンドウのメイン・ページが表示されます。ルート・ビュー・ポートには、子ビュー・ポート(ページ上のリージョンなど)を含めることができますが、親ビュー・ポートはありません。

oracle.adf.controllerパッケージのViewPortContextインタフェースを実装するJavaクラスを使用すると、ビュー・ポートの詳細が表示されます。詳細は、Oracle ADF ControllerのJava APIリファレンスを参照してください。

26.1.3 タスク・フローおよびADFリージョンのユースケースと例

図26-2に、ADFタスク・フローのSummitサンプル・アプリケーションのedit-customer-task-flow-definition.xmlタスク・フローからの「一般情報」ページ・フラグメント(GeneralInfo.jsff)を示しています。このタスク・フローはADFリージョンでレンダリングし、認証されたユーザーが提供されたコントロールを使用して移動および編集可能な一連のページ・フラグメントで顧客に関する情報を表示します。このタイプのリージョンの作成の詳細は、「ADFリージョンの作成」を参照してください。

図26-2 Summit ADFタスク・フロー・サンプル・アプリケーションのADFリージョン

この図は周囲のテキストで説明しています

図26-2には、Welcomeとラベル付けされたshowDetailItemコンポーネントがレンダリングするADF動的リージョンで様々なタスク・フローを起動する(Register as EmployeeおよびRegister as Customerとラベル付けされた)リンクも示されています。このタイプのリージョンの作成の詳細は、「ADF動的リージョンの作成」を参照してください。

図26-3に、JDeveloperにおけるedit-customer-task-flow-definition.xmlタスク・フローを示します。エンド・ユーザーに顧客に関する情報を表示する3つのビュー・アクティビティが含まれます。

図26-3 ADFタスク・フローのADF Summitアプリケーションの顧客タスク・フローの編集

この図は周囲のテキストで説明しています

26.1.4 ADFリージョンにレンダリングされるタスク・フローの追加の機能

ADFリージョンにレンダリングされるタスク・フローが他のタスク・フローおよびADF機能とどのように対話するかを理解しておくと役立ちます。次に、関連する他の機能へのリンクを示します。

26.2 ADFリージョンの作成

ADFリージョンを作成するには、ADFリージョンをレンダリングするページに対するビュー・アクティビティまたはタスク・フロー・コール・アクティビティが少なくとも1つ含まれているバインド・タスク・フローをドラッグ・アンド・ドロップします。これにより、作成されるADFリージョンには、実行時に表示されるコンテンツが必ず含まれます。

バインド・タスク・フローのビュー・アクティビティは、ページ・フラグメント(.jsff)に関連付ける必要があります。ページ・フラグメントではなくページに関連付けられたバインド・タスク・フローをドラッグ・アンド・ドロップしようとした場合、ADFリージョンを作成するためのポップアップ・メニューは表示されません。ページを使用するバインド・タスク・フローを、ページ・フラグメントを使用するものに変換できます。詳細は、「バインド・タスク・フローの変換方法」を参照してください。

ADFリージョンの作成用に表示されるポップアップ・メニューには、非動的リージョンおよび動的リージョンを作成するためのオプションが表示されます。動的リージョン(ADF動的リージョン)では、レンダリングされるバインド・タスク・フローは実行時に決まります。ADF動的リージョンの作成の詳細は、「ADF動的リージョンの作成」を参照してください。非動的リージョン(ADFリージョン)に表示されるバインド・タスク・フローは、設計時に決定します。

26.2.1 ADFリージョンの作成方法

「アプリケーション」ウィンドウからADFリージョンをレンダリングするページにバインド・タスク・フローをドラッグします。

始める前に:

ADFリージョンで使用するバインド・タスク・フローの要件を理解しておくと役に立つ場合があります。詳細は、「ADFリージョンの作成」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

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

  • ページ・フラグメントに関連付けられている1つ以上のビュー・アクティビティ、またはビュー・アクティビティを伴うタスク・フローに対する1つのタスク・フロー・コール・アクティビティを持つ、バインド・タスク・フローを作成します。

    詳細は、「タスク・フローの作成」を参照してください。

  • ADFリージョンをホストするJSFページを作成します。

    詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』のJSFページの作成方法に関する項を参照してください。

ADFリージョンを作成するには:

  1. 「アプリケーション」ウィンドウで、ADFリージョンを検索するJSFページをダブルクリックします。
  2. 「アプリケーション」ウィンドウで、JSFページにバインド・タスク・フローをドラッグ・アンド・ドロップして、ポップアップ・メニューから「作成」「リージョン」を選択します。
  3. 「タスク・フロー・バインディングの編集」ダイアログが表示される場合は、「OK」をクリックします。

    「バインド・タスク・フローに入力パラメータを渡す方法」の説明のとおり、「タスク・フロー・バインディングの編集」ダイアログは、JSFページ上にドロップするバインド・タスク・フローで入力パラメータが定義されている場合に表示されます。

    ADFリージョンのパラメータの指定の詳細は、「ADFリージョンのパラメータの指定」を参照してください。

    図26-4 ADFリージョンの「タスク・フロー・バインディングの編集」ダイアログ

    この図は周囲のテキストで説明しています
  4. 「構造」ウィンドウで、追加したADFリージョンのノード(af:region)を右クリックし、「プロパティに移動」を選択します。
  5. ADFリージョンの「プロパティ」ウィンドウのデフォルト値が自動的に移入される次のプロパティを、必要に応じて確認または変更します。
    • ID: ADFリージョンを参照するためにJSFページで使用されるID(たとえば、r1)。

    • 値: ADFリージョン・モデルへのEL参照(たとえば、#{bindings.region1.regionModel})。これはリージョンの動作を記述するリージョン・モデルです。

    • レンダリング: true(デフォルト値)の場合、JSFページのレンダリング時にADFリージョンがレンダリングされます。

  6. JSFページに関連付けられているビュー・アクティビティとADFリージョンの間でパラメータをマップする方法の詳細は、「ADFリージョンのパラメータの指定」を参照してください。

26.2.2 ADFリージョン作成時の処理

ADFリージョンを作成するためにバインド・タスク・フローをJSFページにドロップすると、ページにaf:regionタグが追加されます。af:regionタグは、RegionModelを実装するオブジェクトを参照します。次の例は、Summit ADFタスク・フロー・サンプル・アプリケーションのCustomers.jsffページ・フラグメントに表示されるaf:regionタグを示しています。

<af:region value="#{bindings.editcustomertaskflowdefinition1.regionModel}"
                   id="r2"/>

さらに、ADFリージョンをホストするページのページ定義ファイルに、タスク・フロー・バインディングが追加されます。次の例は、JDeveloperによって追加されるメタデータのサンプルを示しています。このタスク・フロー・バインディングにより、ADFリージョンとバインド・タスク・フローの間のブリッジが提供されます。これにより、ADFリージョンの特定のインスタンスが、関連付けられているバインド・タスク・フローにバインドされ、そのバインド・タスク・フローに固有のあらゆる情報が保持されます。taskFlowId属性により、バインド・タスク・フローのソース・ファイルのディレクトリ・パスおよび名前が指定されます。

<taskFlow id="editcustomertaskflowdefinition1"
    taskFlowId="/WEB-INF/flows/edit-customer-task-flow-definition.xml#edit
    -customer-task-flow-definition"
    activation="deferred" 
    xmlns="http://xmlns.oracle.com/adf/controller/binding"/>

バインド・タスク・フローをJSFページにドロップした際、すべてのデータバインディングは保持されます。実行時、ADFリージョンを含むJSFページに対するリクエストは、最初はJSFページに対するその他のリクエストと同様に処理されます。JSFページ定義が実行されると、JSFページにデータがロードされます。親JSFページのコンポーネント・ツリーで<af:region>タグが検出されると、表示するコンテンツの最初のページ・フラグメントを特定するために、それが実行されます。コンテンツの最初のページ・フラグメントが特定されると、ページ・フラグメントから親JSFページのコンポーネント・ツリーへ、適切なUIコンポーネントが追加されます。

タスク・フロー・バインディングにより、そのタスク・フロー用に、現在のビュー・アクティビティを取得するための次のインタフェースを実装するオブジェクトが作成されます。

oracle.adf.controller.ViewPortContext

タスク・フロー・バインディングのtaskFlowId属性を使用して、次のいずれかに評価されるEL式を参照することもできます。

  • java.lang.String

  • oracle.adf.controller.TaskFlowId

この機能は、ADF動的リージョンを作成する場合に使用します。詳細は、「ADF動的リージョンの作成」を参照してください。

26.3 ADFリージョンのパラメータの指定

ADFリージョンによって参照されるタスク・フロー・バインディングに追加することで、バインド・タスク・フロー用に定義した入力パラメータをADFリージョンで使用可能にすることができます。メモリー・スコープ、マネージドBeanまたはADFバインディング・レイヤーで使用可能な入力パラメータを参照するには、EL式を使用します。

入力パラメータの指定は、ADFリージョンに情報を提供する方法の1つです。別の方法として、コンテキスト・イベントの使用があります。ADFリージョンに提供する情報の種類によって、情報提供の方法が決まります。たとえば、次を選択します。

  • 入力パラメータ: 必要な情報がタスク・フローの最初にあり、この情報の値を変更するとタスク・フローの再開が必要になる場合に使用します。

    たとえば、従業員の表を含むページがあるとします。このページのADFリージョンには、選択した従業員を福利厚生プログラムに登録するためのタスク・フローが含まれています。従業員の選択を変更すると、新たに選択した従業員について最初から福利厚生の登録タスク・フローを再開する必要があります。このユースケースでは、タスク・フローの入力パラメータを使用することが正しい判断です。

    入力パラメータは、参照渡しでも値渡しでもかまいません。参照渡しの場合、選択した従業員の情報(姓など)に関するメイン・ページでの更新は、タスク・フローを再開しなくてもADFリージョンで実行されるタスク・フローに自動的に反映されます。

  • コンテキスト・イベント: タスク・フローが開始されるまでは交換する情報を特定できず、情報を変更してもタスク・フローの再開が必要ない場合に使用します。たとえば、Summit ADFタスク・フロー・サンプル・アプリケーションの「Inventory Control」タブでは、あるリージョンの製品在庫に適したチャートを、別のリージョンでユーザーが選択する製品に応じて表示するために、コンテキスト・イベントを使用します。詳細は、「コンテキスト・イベントの使用方法」を参照してください。

ADFリージョンの作成およびタスク・フロー・バインディングの追加の詳細は、「ADFリージョンの作成」を参照してください。バインド・タスク・フローに入力パラメータを定義する方法の詳細は、「バインド・タスク・フローへのパラメータ渡し」を参照してください。

26.3.1 ADFリージョンにパラメータを指定する方法

メモリー・スコープ、マネージドBeanまたはADFバインディング・レイヤーで使用可能なパラメータをADFリージョンの入力として指定するには、EL式を使用します。

始める前に:

ADFリージョンのパラメータの指定に関する要件を理解しておくと役に立つ場合があります。詳細は、「ADFリージョンのパラメータの指定」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

ADFリージョンの入力パラメータを指定するには:

  1. 「アプリケーション」ウィンドウで、ADFリージョンを保持するJSFページを右クリックし、「ページ定義に移動」を選択します。
  2. 概要エディタの「バインディングと実行可能ファイル」ナビゲーション・タブをクリックし、パラメータを指定するタスク・フロー・バインディングを選択して、「編集」アイコンをクリックします。
  3. 「タスク・フロー・バインディングの編集」ダイアログで、ADFリージョンを指定する各入力パラメータの値を取得するEL式を記述します。必須として定義したパラメータに対して、EL式を記述する必要があります。たとえば、次のようなEL式を記述します。

    #{pageFlowScope.inputParameter1}

    図26-5に、「バインド・タスク・フローへのパラメータ渡し」の説明のとおり、「入力パラメータ」セクションにバインド・タスクに対して定義された複数の入力パラメータをリストする「タスク・フロー・バインディングの編集」ダイアログを示します。

    注意:

    「タスク・フロー・バインディングの編集」ダイアログの「入力パラメータ・マップ」フィールドを使用して、マネージドBeanで指定された入力パラメータのリストを参照するEL式を記述できます。この機能の実装の詳細は、「パラメータ・マップを使用したADFリージョンのパラメータの指定」を参照してください。

    図26-5 「タスク・フロー・バインディングの編集」ダイアログ

    この図は周囲のテキストで説明しています
  4. 「OK」をクリックします。

26.3.2 ADFリージョンのパラメータ指定時の処理

次の例のように、JSFページのページ定義に、taskFlow要素の子要素であるエントリが書き込まれます。

<taskFlow id="tflow_tf11"
   taskFlowId="/WEB-INF/tflow_tf1.xml#tflow_tf1"
   activation="deferred" 
   xmlns="http://xmlns.oracle.com/adf/controller/binding">
  <parameters>
    <parameter id="inputParameter1"
      value="#{pageFlowScope.inputParameter1}"/>
    <parameter id="inputParameter2"
      value="#{pageFlowScope.inputParameter2}"/>
  </parameters>
</taskFlow>

実行時に、EL式の値attributeで指定された値がADFリージョンに渡されます。

26.4 パラメータ・マップを使用したADFリージョンのパラメータの指定

「ADFリージョンのパラメータの指定」で説明している、タスク・フロー・バインディングにすべての入力パラメータを表示する方法に加えて(もしくはその代替方法として)、タスク・フロー・バインディングのparametersMapプロパティを使用してマネージドBean上のパラメータ・マップ・オブジェクトを指定できます。参照するパラメータ・マップ・オブジェクトは、次のインタフェースを実装するタイプであることが必要です。

java.util.Map

参照するパラメータ・マップ・オブジェクトにより、ADFリージョンに入力する値にマップされるキーが指定されます。この方法を使用すると、そのページのページ定義内でタスク・フロー・バインディング(taskFlow)要素または複数タスク・フロー・バインディング(multiTaskFlow)の下に表示されるparameter子要素の数が減ります。また、この方法ではADFリージョンに渡される入力パラメータをより柔軟に指定できます。特に、ここでは、ADF動的リージョンの各種タスク・フロー・バインディング間で、入力パラメータの個数としてADF動的リージョンにパラメータを渡す方法が異なる可能性が規定されています。詳細は、「ADF動的リージョンの作成」を参照してください。

ADFリージョンまたはADF動的リージョンのタスク・フロー・バインディングを構成して、パラメータ・マップを参照できます。また、複数タスク・フロー・バインディングを構成して、パラメータ・マップを参照できます。バインド・タスク・フローに対して定義する入力パラメータの名前と、パラメータ・マップ・オブジェクトで定義するキー名を、必ず一致させてください。

<parameter>要素および<parametersMap>要素にある同じid属性を使用してパラメータを指定する場合は、<parametersMap>要素が常に優先されます。これは、「ADF動的リージョンの作成」で説明するように、ADF動的リージョンを作成すると、<parametersMap>要素でパラメータの静的値をオーバーライドすることが必要となる可能性があるためです。

26.4.1 ADFリージョンの入力パラメータを指定するためのパラメータ・マップの作成方法

ADFリージョンに渡すキーと値のペアを定義するパラメータ・マップ・オブジェクトを参照するために、タスク・フロー・バインディングのparametersMapプロパティを構成します。

始める前に:

ADFリージョンへ入力パラメータを渡す際に使用できる構成オプションについて理解しておくと役に立つ場合があります。詳細は、「パラメータ・マップを使用したADFリージョンのパラメータの指定」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

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

  • マネージドBeanを作成するか、java.util.Mapインタフェースを実装するオブジェクトが戻されるように既存のマネージドBeanを編集します。ADFリージョンに渡す値とともにキーと値のペアがオブジェクトによって戻されるように、マネージドBeanを構成します。マネージドBeanの詳細は、「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。

ADFリージョンの入力パラメータを指定するためのパラメータ・マップを作成するには:

  1. 「アプリケーション」ウィンドウで、ADFリージョンを保持するJSFページを右クリックし、「ページ定義に移動」を選択します。
  2. 概要エディタの「バインディングと実行可能ファイル」ナビゲーション・タブをクリックし、パラメータ・マップを指定するタスク・フロー・バインディングまたは複数のタスク・フロー・バインディングを選択して、「編集」アイコンをクリックします。

    選択したタスク・フロー・バインディングのタイプにより、表示されるダイアログが決定されます。

  3. 「タスク・フロー・バインディングの編集」ダイアログまたは「複数タスク・フロー・バインディングの編集」ダイアログで、「入力パラメータ・マップ」ドロップダウン・メニューから「式ビルダー」を選択します。
  4. パラメータ・マップを参照するEL式を記述または作成します。たとえば、次のようなEL式を記述します。

    #{pageFlowScope.userInfoBean.parameterMap}

  5. 「OK」をクリックします。

26.4.2 入力パラメータを指定するためのパラメータ・マップ作成時の処理

実行時に、タスク・フロー・バインディングまたは複数タスク・フロー・バインディングによって、そのparametersMapプロパティに指定したEL式が評価されます。ADFリージョンでレンダリングするバインド・タスク・フローに対して定義された入力パラメータの名前と一致するキーのマネージドBeanからADFリージョンに値が返されます。

例26-1は、2つの値(isLoggedInおよびprincipalName)をparameterMapという名前のパラメータ・マップに書き込む、マネージドBeanのコード・スニペットを示しています。

図26-6は、例26-1に示したパラメータ・マップ・オブジェクト(parameterMap)を指定して、「式ビルダー」ダイアログを閉じた後の「タスク・フロー・バインディングの編集」ダイアログを示しています。「タスク・フロー・バインディングの編集」ダイアログの「入力パラメータ」フィールドには、このADFリージョン(checkout-flow)に関連付けらているバインド・タスク・フロー用に定義された入力パラメータが表示されています。タスク・フロー・バインディングにより、例26-1に示したマネージドBeanから、これらのパラメータの値が取得されます。

図26-6 タスク・フロー・バインディング上のパラメータ・マップを参照するEL式

この図は周囲のテキストで説明しています

次の例は、ADFリージョンをレンダリングするページのページ定義ファイルにあるタスク・フロー・バインディングで表示されるメタデータを示しています。タスク・フロー・バインディングのメタデータは、バインド・タスク・フロー(taskFlowId属性)およびマネージドBean (parametersMap)の両方を参照します。

<taskFlow id="checkoutflow1"
              taskFlowId="/WEB-INF/checkout-flow.xml#checkout-flow"
              activation="deferred"
              xmlns="http://xmlns.oracle.com/adf/controller/binding"
              parametersMap="#{pageFlowScope.userInfoBean.parameterMap}"/>

<parameterMap>要素は、ページ定義に指定します。

注意:

Refresh="ifNeeded"を指定した場合、パラメータは<parameterMap>要素内でサポートされません。リージョンのリフレッシュが必要かどうかを判断する唯一の条件は、RefreshConditionの評価によって戻されるブール値です。詳細は、「ADFリージョンのリフレッシュの構成に関する必知事項」を参照してください。

例26-1 パラメータ・マップを定義するマネージドBean

import java.util.HashMap;
import java.util.Map;
 
public class UserInfoBean {
    private Map<String, Object> parameterMap = new HashMap<String, Object>();
 
    public Map getParameterMap() {
        
        parameterMap.put("isLoggedIn", getSecurity().isAuthenticated());
        parameterMap.put("principalName", getSecurity().getPrincipalName());
        return parameterMap;
    }
}

26.5 ADFリージョンのリフレッシュの構成

ADFリージョンをリフレッシュするタイミングとタスク・フローを起動するかどうかを構成できます。ADFリージョンによってタスク・フローを起動できるのは、ADFリージョンがアクティブな状態のときのみです。非アクティブ状態のADFリージョンでは、タスク・フローを起動できず、参照先タスク・フローのIDのNULL値が親ページに戻されます。

26.5.1 ADFリージョンのリフレッシュの構成方法

ADFリージョンを非アクティブからアクティブの状態へ切り替えるタイミングを決定し、ADFリージョンをリフレッシュするタイミングを決定するには、ADFリージョンに関連付けられているタスク・フローのタスク・フロー・バインディングの値を設定します。

始める前に:

ADFリージョンで使用するバインド・タスク・フローの要件を理解しておくと役に立つ場合があります。詳細は、「ADFリージョンのリフレッシュの構成」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

ADFリージョンのリフレッシュを構成するには:

  1. 「アプリケーション」ウィンドウで、ADFリージョンが含まれているページを選択し、右クリックして「ページ定義に移動」を選択します。
  2. ページ定義ファイルで、図26-7に示すように、「実行可能ファイル」セクションのタスク・フロー・バインディングまたは複数タスク・フロー・バインディングを選択します。

    図26-7 タスク・フロー・バインディング

    この図は周囲のテキストで説明しています
  3. ADFリージョンをリフレッシュする適切なオプションを選択します。
    • タスク・フロー・バインディング・パラメータの値が変更されると、リフレッシュされます。

      「プロパティ」ウィンドウで「リフレッシュ」ドロップダウン・リストから「ifNeeded」を選択します。

      RefreshConditionプロパティの値を設定する場合は 「ifNeeded」を選択しないでください。RefreshConditionプロパティは、Refreshプロパティに「ifNeeded」を選択する場合は評価されません。

    • 指定する条件がtrueを戻す場合にリフレッシュされます。

      「プロパティ」ウィンドウで、RefreshConditionフィールドにブール値を返すEL式を記述します。EL式がtrueを返した場合は、ADFリージョンがリフレッシュされます。

  4. 「プロパティ」ウィンドウで、次のリストの説明に従って、「アクティブ化」ドロップダウン・リストから値を選択します。
    • conditional: タスク・フロー・バインディングのactiveプロパティの値として設定されたEL式によってtrueが戻された場合に、ADFリージョンがアクティブ化されます。

    • deferred: アプリケーションのビュー・レイヤーでFacelets XHTMLページを使用し、Facelets XHTMLページによってviewIDが初めてリクエストされたときにADFリージョンをアクティブ化する場合は、このオプションを選択します。アプリケーションのビュー・レイヤーでJSPテクノロジが使用されている場合にこのオプションを選択すると、immediate(ADFリージョンがただちにアクティブになる)を選択した場合と同じ結果になりますが、これは、ADFリージョンの親コンポーネントがpopupまたはpanelTabbedコンポーネントでそのchildCreation属性がdeferredに設定されている場合を除きます。後者のシナリオが発生した場合は、親コンポーネント(popupまたはpanelTabbed)によって動作が決まります。

      アプリケーションでFacelets XHTMLページが使用される場合は、このオプションを使用します。ADF FacesでのFaceletsの使用の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「ADF FacesとJDeveloperのスタート・ガイド」を参照してください。

    • immediate: ADFリージョンがただちにアクティブになります。これはデフォルト値です。

    ドロップダウン・リストで選択した値により、ADFリージョンが非アクティブからアクティブの状態に切り替わるタイミングが決まります。ADFリージョンがタスク・フローを起動するには、アクティブ状態であることが必要です。

  5. activationプロパティの値として「conditional」を選択した場合は、activeプロパティの実行時にブール値を戻すEL式を記述します。EL式によってtrueが戻されると、ADFリージョンはタスク・フローを起動します。

26.5.2 ADFリージョンのリフレッシュの構成に関する必知事項

ADFリージョンが最初にリフレッシュされるのは、リージョンが配置されている親JSFページが最初に表示されるときです。最初のリフレッシュでは、ADFリージョンのタスク・フロー・バインディングのパラメータ値がすべて親ページから渡されます。パラメータ値は、ADFリージョン内で初期ページ・フラグメントを表示するために使用されます。バインド・タスク・フローがページの初回作成時に使用できない入力パラメータ値に依存している場合は、NullPointerExceptionオブジェクトなどを使用して、入力パラメータ値がNULLのときにタスク・フローが正しく動作することを確認します。もしくは(または追加的に)、タスク・フロー・バインディングのactiveプロパティを構成して、入力パラメータが使用可能になるまでタスク・フローがアクティブ化されないようにしてください。

ADFリージョンのタスク・フロー・バインディングは、次のタスク・フロー・バインディング属性のいずれかに基づいて再度リフレッシュできます。

  • taskFlowId

    この属性により、バインド・タスク・フローのソース・ファイルのディレクトリ・パスおよび名前が指定されます。この属性値が変更されるとADFリージョンはリフレッシュされます。

  • Refresh属性とRefreshCondition属性の両方が未指定(デフォルト)

    タスク・フロー・バインディング属性のRefreshまたはRefreshConditionのどちらも指定していない場合は、タスク・フロー・バインディングのactiveプロパティの値を構成しないかぎり、ADFリージョンのリフレッシュは親ページの初回表示時に1回のみ行われます。

  • RefreshCondition="#{EL.expression}"

    RefreshConditionプロパティがtrueと評価される場合、ADFリージョンは1回のみリフレッシュされます。RefreshConditionはブール値で評価される必要があります。RefreshConditionの評価時にEL式でbindings変数が使用されていると、ADFリージョン内に表示されるページ・フラグメントではなく、親ページのバインディング・コンテナが参照されます。

    RefreshConditionは、バインディング・パラメータの値の変更とは無関係です。タスク・フロー・バインディングのパラメータに変更がなければ、ADFリージョン内では何も変化しません。

  • Refresh="ifNeeded"

    タスク・フロー・バインディングのパラメータ値が変更されると、ADFリージョンはリフレッシュされます。ADFリージョンのタスク・フロー・バインディングにパラメータがない場合、Refresh="ifNeeded"Refresh属性を指定していないのと同じことになります。

    動的パラメータ・マップを使用してタスク・フロー・バインディングにパラメータを渡す場合、Refresh="ifNeeded"はサポートされません。その場合、RefreshCondition="#{EL.Expression}"を使用する必要があります。

    パラメータ・マップを使用したパラメータ値の指定の詳細は、「パラメータ・マップを使用したADFリージョンのパラメータの指定」を参照してください。

Refresh="ifNeeded"プロパティはRefreshConditionよりも優先され、Refresh="ifNeeded"を設定する場合は、RefreshConditionは評価されません。

RefreshConditionの評価時にEL式でバインディング変数が使用されていると、ADFリージョン内に表示されるページ・フラグメントではなく、親ページのバインディング・コンテナが参照されます。ADFページ・ライフサイクルのPrepareRenderフェーズ中に式は評価されます。詳細は、「Fusionページ・ライフサイクルの理解」を参照してください。

次の例は、ADFリージョンが追加されているページのページ定義にあるタスク・フロー・バインディングのサンプルを示しています。

<taskFlow id="Department1" taskFlowId="/WEB-INF/Department#Department"
    xmlns="http://xmlns.oracle.com/adf/controller/binding">
  <parameters>
    <parameter id="DepartmentId" value="#{bindings.DepartmentId.inputValue}"
        xmlns="http://xmlns.oracle.com/adfm/uimodel"/>
  </parameters>
</taskFlow>

ADFリージョン内のデータ・コントロールをリフレッシュするために、ADFリージョンをリフレッシュする必要はありません。ADFのライフサイクルにおいて、更新対象のイテレータを通知するリフレッシュ・イベントは、ADFリージョンの現在のページのバインディング・コンテナに伝播されます。

26.6 ADFリージョンのアクティブ化の構成

ADFリージョンをアクティブ化するタイミングを構成できます。これは、ADFリージョンに含まれるタスク・フローをアクティブ化するタイミングの決定に影響を及ぼします。ADFリージョンのアクティブ化を構成することで、Fusion Webアプリケーションのページのパフォーマンスを最適化できます。たとえば、5つのADFリージョンを含むページが5つのタスク・フローを参照するとします。Fusion Webアプリケーション・ページのロード時にこれらの5つのタスク・フローが同時に実行されないようにするには、activationプロパティを構成してタスク・フロー実行のタイミングを指定します。

26.6.1 ADFリージョンのアクティブ化の構成方法

ADFリージョンに関連付けられているタスク・フロー・バインディングのactivationプロパティを構成して、ADFリージョンをアクティブ化するタイミングを指定します。

始める前に:

ADFリージョンのアクティブ化に関する構成オプションを理解しておくと役に立つ場合があります。詳細は、「ADFリージョンのアクティブ化の構成」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

ADFリージョンのアクティブ化を構成するには:

  1. 「アプリケーション」ウィンドウで、ADFリージョンが含まれているページを選択し、右クリックして「ページ定義に移動」を選択します。
  2. ページ定義ファイルで、図26-8に示すように、「実行可能ファイル」セクションのタスク・フロー・バインディングまたは複数タスク・フロー・バインディングを選択します。

    図26-8 アクティブ化用に構成するADFリージョンのタスク・フロー・バインディング

    この図は周囲のテキストで説明しています
  3. 「プロパティ」ウィンドウで、次のリストの説明に従って、「アクティブ化」ドロップダウン・リストから値を選択します。
    • conditional: タスク・フロー・バインディングのactiveプロパティの値として設定されたEL式によってtrueが戻された場合に、ADFリージョンがアクティブ化されます。

    • deferred: アプリケーションのビュー・レイヤーでFacelets XHTMLページを使用し、Facelets XHTMLページによってviewIDが初めてリクエストされたときにADFリージョンをアクティブ化する場合は、このオプションを選択します。アプリケーションのビュー・レイヤーでJSPテクノロジが使用されている場合にこのオプションを選択すると、immediate(ADFリージョンがただちにアクティブになる)を選択した場合と同じ結果になります。

      アプリケーションでFacelets XHTMLページが使用される場合は、このオプションを使用します。ADF FacesでのFaceletsの使用の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「ADF FacesとJDeveloperのスタート・ガイド」を参照してください。

    • immediate: ADFリージョンがただちにアクティブになります。これはデフォルト値です。

    ドロップダウン・リストで選択した値により、ADFリージョンが非アクティブからアクティブの状態に切り替わるタイミングが決まります。ADFリージョンがタスク・フローを起動するには、アクティブ状態であることが必要です。

  4. 「アクティブ化」ドロップダウン・リストの値としてconditionalを選択した場合は、activeプロパティの実行時にブール値を戻すEL式を記述します。EL式によってtrueが戻されると、ADFリージョンはタスク・フローを起動します。EL式によってfalseが戻された場合、ADFリージョンはADFリージョン内でアクティブだったタスク・フローを非アクティブ化します。

26.6.2 ADFリージョンのアクティブ化構成時の処理

ADFリージョンの実行時の動作は、activationプロパティ用に設定したオプションによって異なります。

図26-9は、ページにADFリージョン(タブ#1、タブ#2、タブ#3)がロードされるとADFリージョン内のすべてのタスク・フローが実行される、デフォルトの動作を示しています。

図26-9 ADFリージョンのデフォルトのアクティブ化

この図は周囲のテキストで説明しています

図26-10は、activationプロパティがdeferredに設定されており、アプリケーションでFaceletsが使用される場合の例を示しています。タブ#1およびタブ#2のリージョンがアクティブ状態にあるのは、エンド・ユーザーがこれらのリージョンに移動したためです。タブ#3のリージョンは非アクティブです。

図26-10 ADFリージョンの遅延アクティブ化

この図は周囲のテキストで説明しています

図26-11は、activationプロパティがconditionalに設定されており、activeプロパティが実行時にboolean値を戻すEL式に設定されている場合の例を示しています。タブ#1のリージョンがアクティブ状態にあるのは、activeプロパティ用に指定されたEL式によってtrueが戻されるためです。タブ#2およびタブ#3のリージョンが非アクティブ状態にあるのは、activeプロパティ用に指定されたEL式によってfalseが戻されるためです。

リージョンによってタスク・フローが非アクティブ化される(activeプロパティによって戻される値がtrueからfalseに変わる)と、次のイベントが発生します。

図26-11 ADFリージョンの条件付きアクティブ化

この図は周囲のテキストで説明しています

26.7 ADFリージョンのタスク・フロー外への移動

ADFリージョンで実行されるバインド・タスク・フローでは、その親ビュー・アクティビティのナビゲーションのトリガー、またはそのアプリケーションのルート・ページへの移動が必要な場合があります。そのどちらかのユースケースを実装する場合に構成するプロパティ(parent-outcomeおよびroot-outcome)は、親アクション・アクティビティによって公開されます。

たとえば、従業員情報、および従業員の登録ボタンを含むADFリージョンを表示するページがある場合は、parent-outcomeの値を指定できます。登録ページが完了してADFリージョンに戻ると、従業員情報ページは次の従業員でリフレッシュされます。

注意:

ADFリージョンから移動した場合、リージョンの状態は維持されません。

26.7.1 ADFリージョンのタスク・フロー外へのナビゲーションをトリガーする方法

ADFリージョンで実行されるバインド・タスクに親アクション・アクティビティを追加して、親のビュー・アクティビティへ移動するように構成します。

始める前に:

ADFリージョンのアクティブ化に関する構成オプションを理解しておくと役に立つ場合があります。詳細は、「ADFリージョンのアクティブ化の構成」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

ADFリージョンのタスク・フロー外へのナビゲーションをトリガーするには:

  1. 「アプリケーション」ウィンドウで、ADFリージョンで実行されるバインド・タスク・フローをダブルクリックします。
  2. 「コンポーネント」ウィンドウの「ADFタスク・フロー」ページで、「コンポーネント」パネルから、「アクティビティ」グループにある「親アクション」をバインド・タスク・フローのダイアグラムにドラッグ・アンド・ドロップします。
  3. バインド・タスク・フローのダイアグラムで、親アクション・アクティビティを選択します。
  4. 「プロパティ」ウィンドウで、適切なオプションを選択します。
    • 親結果: 親アクション・アクティビティが親ビュー・アクティビティへ移動するように、リテラル値を入力するか結果を戻すEL式を記述します。生成された結果は、ADFリージョンのバインド・タスク・フローではなく、親ビュー・アクティビティのタスク・フローに移動するために使用されます。

      親ビュー・アクティビティのタスク・フローには、parent-outcomeに対して指定した値を受け入れる制御フロー・ケースまたはワイルドカード制御フロー・ルールを含める必要があります。

    • ルート結果: 親アクション・アクティビティがアプリケーションのルート・ページへ移動するように、リテラル値を入力するか結果を戻すEL式を記述します。

      たとえば、ADFリージョンからアプリケーションのホーム・ページに移動するには、図26-12の説明のように、「ルート結果」の値を指定します。

      図26-12 ホーム・ページへの移動

      この図は周囲のテキストで説明しています

    注意:

    「親結果」および「ルート結果」は相互に排他的です。

  5. (オプション) 親アクション・アクティビティがparent-outcomeまたはroot-outcomeを適切なキューに追加した後のADFリージョン内のコントロール・フローの結果を指定するリテラル値を、「結果」フィールドに入力します。

    outcome要素の指定が役立つのは、親アクション・アクティビティによって送られるparent-outcomeまたはroot-outcomeの結果として親ビュー・アクティビティまたはルート・ページが移動しない場合です。さらに、ADFリージョンにそのまま同じビューが表示されないようにする場合です。outcomeの値を指定しない場合、ADFリージョンのviewIdは変更されません。

26.7.2 タスク・フロー外へのナビゲーション構成時の処理

実行時に、親アクション・アクティビティ用に設定したプロパティ値に基づいて、バインド・タスク・フローのソース・ファイルにエントリが書き込まれます。次の例は、親アクション・アクティビティの「親結果」および「結果」プロパティのリテラル値を記述すると生成されるサンプル・エントリを示しています。

<parent-action id="parentAction1">
    <parent-outcome>parent_outcome</parent-outcome>
    <outcome id="__2">outcome</outcome>
</parent-action>

次の例は、親アクション・アクティビティの「ルート結果」および「結果」プロパティのリテラル値を記述すると生成されるサンプル・エントリを示しています。

<parent-action id="parentAction1">
      <root-outcome>root_outcome</root-outcome>
      <outcome id="__2">outcome</outcome>
</parent-action>

実行時、親アクション・アクティビティ用に構成したプロパティに応じて、バインド・タスク・フローは親ビュー・アクティビティまたはFusion Webアプリケーションのルート・ページへ移動します。

26.7.3 ページによるADFリージョンの機能の特定方法に関する必知事項

ページに含まれるADFリージョンの1つで現在使用できる機能の特定をページで行うことが必要な場合もあります。たとえば、queueActionEventInRegion()メソッドを使用して、現在の状態に基づいてページがADFリージョン内のコントロール・フローを初期化する必要がある場合です。親ページはリージョン機能を使用して、そのページの1つのリージョンについて、現在の状態に基づいて現在の結果を識別します。親ページに対して、リージョン内に結果の可能性があるかどうかが示されます。

次のシナリオに、アプリケーションでの一般的なリージョン機能の使用方法を示します。

  1. ページ内のADFリージョンに、関連付けられているページ・フラグメントが表示されます。

  2. ユーザーが、ADFリージョン内でボタンを選択したり、他のアクションを実行します。

  3. 親ページにより、ADFリージョンの結果(リージョン機能)が識別されます。

  4. ADFリージョンの機能に基づいて、親ページのボタンが更新されます。

ADFリージョンの機能を決定するEL式の構文は次のとおりです。

#{bindings.[regionId].regionModel.capabilities['outcome']}

regionIdはページ上のADFリージョン・コンポーネントのIDで、outcomeはADFリージョン内で検証される、可能性がある結果です。

リージョン機能では、EL式を介して、指定されたADFリージョンのregionModelを使用できることが求められます。EL式では、現在のバインディング・コンテナ以外のバインディング・コンテナにあるバインディングには、アクセスしないでください。リージョン機能は、使用できない場合があります。ADFリージョンがネストされており、現在のバインディング・コンテナ内でregionModelに到達できない場合などです。これは、ネストされたリージョンのネストされたバインディング・コンテナがまだ存在しないか、すでに解放されている可能性があるためです。

26.8 ADFリージョンのトランザクション管理の構成

「タスク・フローのトランザクションの管理」で説明するように、ADFコントローラ・レイヤーで、バインド・タスク・フローは、必要に応じて基礎となるADFモデル・レイヤーにトランザクションの独自の抽象化の実装を提供します。「タスク・フロー間のデータ・コントロールの共有」で説明するように、そのdata-control-scopeプロパティの値を設定することによって、タスク・フローがそのデータ・コントロールをコール元のタスク・フローと共有するか分離するかを選択できます。「データ・コントロールの共有およびトランザクションの管理に関する必知事項」で説明するように、タスク・フローによって新規トランザクションが作成されるかどうかは、transactionプロパティおよびdata-control-scopeプロパティに対して選択した値に応じて異なります。

たとえば、タスク・フローのデータ・コントロールをコール元タスク・フローと共有する場合、タスク・フローのtransactionオプションを「常に新規トランザクションを開始」 (new-transaction)または「可能であれば既存のトランザクションを使用」 (requires-transaction)に構成すると、ADFコントローラ・レイヤー・レベルで新規トランザクションが作成されます。requires-transactionオプションでは、トランザクションが存在していない場合にのみ新しいトランザクションが作成されます。作成されたトランザクションは、タスク・フローをレンダリングするADFリージョンと同じ存続期間を持ちます。これにより、タスク・フローがADFリージョンでレンダリングされる場合に意図しない動作を引き起こす場合があります。たとえば、ADFリージョンがリフレッシュされる場合は、ADFリージョンにレンダリングされるタスク・フローが再度開始され、次のイベントが発生します。

  • ADFリージョンで使用する現在のビュー・ポートを破棄します。

    注意:

    セーブポイントでは、ルート・ビュー・ポートが機能する必要があります。ビュー・ポートの詳細は、「ビュー・ポートおよびADFリージョンについて」を参照してください。セーブポイントの詳細は、「タスク・フローでのセーブポイントの使用」を参照してください。

  • タスク・フローで使用するデータ・コントロールを解放します。

    これにより、ADFリージョンにレンダリングされるタスク・フローのデータ・コントロールが共有されるため、コール元のタスク・フローの親ページで行われた変更が失われる可能性があります。

  • タスク・フローのタスク・フロー・リターン・アクティビティの「トランザクションの終了」プロパティがこれらのアクションのいずれかを指定する場合は、コミットまたはロールバックを実行します。詳細は、「タスク・フロー・リターン・アクティビティの使用」を参照してください。

ADFリージョンのリフレッシュによるタスク・フローのトランザクションの不注意による終了を回避する方法は多数あります。これらのすべてのオプションにより、ADFリージョンにレンダリングされるタスク・フローのトランザクションの存続期間とADFリージョンの存続期間の関連付けが解除されます。これらのオプションにより、リージョンの親ページがトランザクションを所有し、リージョンにレンダリングされる前にトランザクションが開始されることが確認されます。アプリケーションに最も適したオプションを選択します。

  • ADFリージョンにレンダリングするタスク・フローのトランザクション・オプションを「常に既存のトランザクションを使用」(requires-existing-transaction)に設定します。これにより、トランザクションが存在しない場合に例外がスローされ、ADFリージョンがトランザクションを所有できなくなります。

  • トランザクションの存続期間が親ページの存続期間に関連付けられるように、コール元のタスク・フローのトランザクション・オプションを「常に新規トランザクションを開始」(new-transaction)に設定します。

  • リージョンを含む親ページに移動するアクションでDataControlFrameインタフェースのbeginTransaction()メソッドを起動します。

  • ADFリージョンの親ページに移動する前に、リクエスト・スコープを使用してマネージドBeanからDataControlFrameインタフェースのbeginTransaction()メソッドを起動するメソッド・コール・アクティビティを構成します。

    次のコードにより、トランザクションが開始されます。

      public void beginTransaction()
      {
        BindingContext context = BindingContext.getCurrent();
     
        String dcFrameName = context.getCurrentDataControlFrame();
        DataControlFrame dcFrame = context.findDataControlFrame(dcFrameName);
        dcFrame.beginTransaction(new TransactionProperties());
      }
    

タスク・フローのデータ・コントロールをコール元のタスク・フローと共有する場合は、タスク・フローのタスク・フロー・リターン・アクティビティによって公開されるrollbackまたはcommitオプションを使用して、ADFモデル・レイヤーのDataControlFrameインタフェースによって公開されるメソッドをプログラム的に使用するのではなく、変更をコミットまたはロールバックします。DataControlFrameインタフェースによって公開されるメソッドを使用することにより、トランザクションは終了し、ADFリージョンにレンダリングされるタスク・フローによって新しいトランザクションを作成できます。

26.9 ADF動的リージョンの作成

ADF動的リージョンは、実行時に、タスク・フロー・バインディングによってtaskFlowId属性の値が動的に決定されるADFリージョンです。これにより、Fusion Webアプリケーションは、タスク・フロー・バインディングのtaskFlowId属性の評価結果に基づいて、ADF動的リージョン内で実行するタスク・フローを決定できます。

図26-13は、エンド・ユーザーがクリックするリンク・コンポーネントに応答して、index.jsfページの「Welcome」というラベルのshowDetailItemコンポーネントに異なる登録タスク・フローがレンダリングされる、Summit ADFタスク・フロー・サンプル・アプリケーションの実行時の例を示しています。たとえば、エンド・ユーザーが「Register as Employee」をクリックした場合は、アプリケーションでADF動的リージョンにemp-reg-task-flow-definition.xmlタスク・フローがレンダリングされます。エンド・ユーザーが「Register as a customer」をクリックした場合は、アプリケーションでADF動的リージョンにedit-customer-task-flow-definition.xmlタスク・フローがレンダリングされます。

実行時、ADF動的リージョンは、レンダリング準備ライフサイクル・フェーズでレンダリングされるタスク・フローを切り替えます。前のタスク・フローのコンポーネントがライフサイクル・フェーズにスムーズに追加されるように、JSFのアプリケーションの起動ライフサイクル・フェーズまではregionModelから移動しないでください。したがって、コンテキスト・イベントに応答して動的リージョン内のタスク・フローを移動しないことをお薦めします。ライフサイクル・フェーズの詳細は、「Fusionページ・ライフサイクルの理解」を参照し、コンテキスト・イベントの詳細は、「コンテキスト・イベントの使用方法」を参照してください。

図26-13 Summit ADFタスク・フロー・サンプル・アプリケーションのADF動的リージョン

この図は周囲のテキストで説明しています

ADF動的リージョンを作成するには、ADF動的リージョンをレンダリングするページへ、バインド・タスク・フローをドラッグ・アンド・ドロップします。バインド・タスク・フローのビュー・アクティビティは、ページ・フラグメント(.jsff)に関連付ける必要があります。

ページ・フラグメントではなくページに関連付けられたバインド・タスク・フローをドラッグ・アンド・ドロップしようとした場合、ADF動的リージョンを作成するためのポップアップ・メニューは表示されません。ページを使用するバインド・タスク・フローを、ページ・フラグメントを使用するものに変換できます。詳細は、「バインド・タスク・フローの変換方法」を参照してください。

「ADF動的リージョンへのタスク・フローの追加」で説明するように、ADF動的リージョンの作成後は、ADF動的リージョン・リンクを作成して動的リージョンにバインド・タスク・フローを追加できます。

26.9.1 ADF動的リージョンの作成方法

ADF動的リージョンをレンダリングするページへ、バインド・タスク・フローをドラッグ・アンド・ドロップします。

始める前に:

ADF動的リージョンを作成する際に使用できる構成オプションについて理解しておくと役に立つ場合があります。詳細は、「ADF動的リージョンの作成」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる他の機能についても理解しておくと役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

ADF動的リージョンを作成するには:

  1. 「アプリケーション」ウィンドウで、ADF動的リージョンを作成するJSFページをダブルクリックします。

  2. 「アプリケーション」ウィンドウで、JSFページに最初のバインド・タスク・フローをドラッグ・アンド・ドロップして、ポップアップ・メニューから「作成」「動的リージョン」を選択します。

  3. 「動的リージョンのマネージドBeanの選択」ダイアログで、適切なオプションを選択します。

    • 既存のマネージドBeanにバインド・タスク・フローのIDを格納するには、「マネージドBean」ドロップダウン・リストから既存のマネージドBeanを選択します。

      マネージドBeanからADF動的リージョンのタスク・フロー・バインディングへ、バインド・タスク・フローのID値が渡されます。選択するマネージドBeanが別のADF動的リージョンで使用されていないことを確認します。

    • ページにマネージドBeanがない場合は、「マネージドBean」ドロップダウン・リストの横にある「追加」アイコンをクリックして、新たに作成します。次の手順で、表示されるダイアログに値を入力します。

      1. Bean名: 新しいマネージドBeanの名前を入力します。たとえば、DynamicRegionBeanと入力します。

      2. クラス名: 新しいマネージドBeanクラスの名前を入力します。

      3. パッケージ: マネージドBeanを含むパッケージの名前を入力するか、参照して特定します。

      4. 拡張対象: マネージドBeanで拡張するJavaクラスの名前を入力します。デフォルト値はjava.lang.Objectです。

      5. スコープ: このフィールドは読取り専用であり、値はbackingBeanに設定されています。マネージドBeanのメモリー・スコープの詳細は、「タスク・フローのメモリー・スコープに関する必知事項」を参照してください。

      6. 「OK」をクリックして、マネージドBeanを構成するダイアログを閉じます。

  4. 「タスク・フロー・バインディングの編集」ダイアログで適切なオプションを選択します。

    • ADF動的リージョンの入力パラメータまたは入力パラメータ・マップを指定しない場合は、「OK」をクリックします。

    • ADF動的リージョンの入力パラメータを指定します。

      詳細は、「ADFリージョンのパラメータの指定」を参照してください。

    図26-14は、マネージドBeanの構成後に表示される「タスク・フロー・バインディングの編集」ダイアログを示しています。

    注意:

    「タスク・フロー・バインディングの編集」ダイアログの「入力パラメータ・マップ」フィールドを使用して、マネージドBeanで指定された入力パラメータのリストを参照するEL式を記述できます。この機能の実装の詳細は、「パラメータ・マップを使用したADFリージョンのパラメータの指定」を参照してください。

    図26-14 ADF動的リージョンの「タスク・フロー・バインディングの編集」ダイアログ

    この図は周囲のテキストで説明しています
  5. 「OK」をクリックします。

26.9.2 ADF動的リージョン作成時の処理

ADF動的リージョンを作成するためにバインド・タスク・フローをJSFページにドロップすると、ページにaf:regionタグが追加されます。af:regionタグにはタスク・フロー・バインディングへの参照が含まれています。次の例は、Summit ADFタスク・フロー・サンプル・アプリケーションのindex.jsfページにADF動的リージョンをレンダリングするaf:regionタグを示しています。

<af:region value="#{bindings.dynamicRegion1.regionModel}" id="r4"
                             rendered="#{WelcomePageBean.isRegistration}"/>

さらに、ADF動的リージョンをホストするページのページ定義ファイルに、タスク・フロー・バインディングが追加されます。次の例は、JDeveloperによって追加されるメタデータのサンプルを示しています。このタスク・フロー・バインディングにより、ADF動的リージョンとバインド・タスク・フローの間のブリッジが提供されます。ADF動的リージョンがバインド・タスク・フローにバインドされ、そのバインド・タスク・フローに固有のあらゆる情報が保持されます。

<taskFlow id="dynamicRegion1"
       taskFlowId="${WelcomePageBean.dynamicTaskFlowId}"
       activation="deferred"
       xmlns="http://xmlns.oracle.com/adf/controller/binding"/>

タスク・フロー・バインディング・メタデータのtaskFlowId属性により、ADF動的リージョンに関連付けられるバインド・タスク・フローを実行時に決定するマネージドBeanが指定されます。JDeveloperにより、このマネージドBeanが作成されるか、このデータを格納するために既存のマネージドBeanが変更されます。次の例は、JDeveloperによってマネージドBeanに書き込まれるコードの抜粋を示しています。

import oracle.adf.controller.TaskFlowId;
 ...
    private String taskFlowId = "/directoryPath/toTaskFlow";
 ...
    public TaskFlowId getDynamicTaskFlowId() {
        return TaskFlowId.parse(taskFlowId);
    }
...

実行時には、ADF動的リージョン内に表示されるバインド・タスク・フローのID (taskFlowId)が、マネージドBeanに格納されます。マネージドBeanは、様々なバインド・タスク・フローをADF動的リージョンのタスク・フロー・バインディングに切り替えます。

ADF動的リージョンが再初期化される場合、Fusion WebアプリケーションではADF動的リージョンに関連付けられているタスク・フロー・バインディングを再初期化する必要があります。その際、ADF動的リージョンに渡す新しい入力パラメータや入力パラメータ値があるかどうかが評価されます。

26.10 ADF動的リージョンへのタスク・フローの追加

ADF動的リージョン・リンクは、ADF動的リージョン内でバインド・タスク・フローを別のバインド・タスク・フローに切り替えます。エンド・ユーザーは、コマンド・コンポーネント(ボタンやリンク)をクリックして、ADF動的リージョンを新しいバインド・タスク・フローで更新します。

たとえば、ADF動的リージョンのバインド・タスク・フローにより、従業員に関する一般情報(IDや写真など)が表示されるとします。エンド・ユーザーが「詳細」というコマンド・コンポーネントをクリックすると、その従業員の詳細情報を含む別のバインド・タスク・フローの表で、ADF動的リージョンが更新されます。エンド・ユーザーのアクション(リンクのクリック)により、ADF動的リージョンのマネージドBean上のメソッドが起動します。新しいバインド・タスク・フローの値がメソッドに渡され、ADF動的リージョンは新しいバインド・タスク・フローでリフレッシュされます。その後、新しいバインド・タスク・フローがADF動的リージョン内に表示されます。

デフォルトでは、ADF動的リージョン・リンクは、バインド・タスク・フローを別のものに切り替えますが、再び元のバインド・タスク・フローに切り替えることはできません。元のバインド・タスク・フローに戻すには、クリック時に現在のタスク・フローを元のタスク・フローに切り替える2つ目のADF動的リージョン・リンクをページに追加します。

すでに1つ以上のADF動的リージョンがページにあり、同じページに新しいバインド・タスク・フローをADF動的リージョンとして追加する場合は、ADF動的リージョン・リンクを追加できます。図26-15のように、ページにバインド・タスク・フローをドロップして、ADF動的リージョン・リンクの作成を選択すると、現在ページ上にある動的リージョンがすべてメニューに表示されます。

ドキュメント内の既存の動的リージョンにオプションとして追加するバインド・タスクをドラッグ・アンド・ドロップするとメニューが表示され、そこから「動的リージョン・リンク」を選択すると、ドキュメントに含まれる現在の動的リージョンのリストが図26-15のように表示されます。

図26-15 「動的リージョン・リンク」メニュー

この図は周囲のテキストで説明しています

このメニューを使用して、バインド・タスク・フローの内容を表示するADF動的リージョンを選択します。

ヒント:

動的リージョン・リンクの値は他のUIコンポーネント内で使用できます。たとえば、リスト内の各項目が別のバインド・タスク・フローにリンクしている選択リストを作成できます。リンクされているバインド・タスク・フローはすべて同じ動的リージョンに表示されます。リンクにより、表示するバインド・タスク・フローを切り替えるために作成したマネージドBeanの背後で、クラス内のメソッドが実行されます。

26.10.1 ADF動的リージョン・リンクの作成方法

ADF動的リージョンがすでに含まれているページにバインド・タスク・フローをドラッグ・アンド・ドロップし、表示されるポップ・アップ・メニューで「動的リージョン・リンク」を選択して、リンクを作成できるADF動的リージョンのリストを表示します。

始める前に:

ADF動的リージョン・リンクを作成する前に必要な構成ついて理解しておくと役に立つ場合があります。詳細は、「ADF動的リージョンへのタスク・フローの追加」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

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

  • ADF動的リージョン・リンクを作成するJSFページに最低1つのADF動的リージョンを追加します。JSFページへのADF動的リージョンの追加の詳細は、「ADF動的リージョンの作成」を参照してください。

ADF動的リージョン・リンクを作成するには:

  1. 「アプリケーション」ウィンドウで、ADF動的リージョン・リンクを作成するJSFページをダブルクリックします。
  2. 「アプリケーション」ウィンドウで、JSFページにバインド・タスク・フローをドラッグ・アンド・ドロップして、ポップアップ・メニューから「動的リージョン・リンク」を選択します。

    注意:

    バインド・タスク・フローのビュー・アクティビティは、ページ・フラグメントに関連付ける必要があります。ページを使用するバインド・タスク・フローを、ページ・フラグメントを使用するものに変換できます。詳細は、「バインド・タスク・フローの変換方法」を参照してください。

  3. ページにすでに追加されているADF動的リージョンのリストが表示されるポップアップ・メニューで、バインド・タスク・フローの内容を表示するADF動的リージョンの名前を選択します。
  4. 「OK」をクリックします。

26.10.2 ADF動的リージョン作成時の処理

次の例に示すように、ページへのリンクが追加されます。また、ADF動的リージョンのマネージドBeanが更新され、対応するタスク・フロー・バインディングが新しいパラメータで更新されます。

<af:link text="region2" action="#{RegionBean.region2}"
  id="dynamicRegionLink1"/>

26.11 複数の不明なリージョンをレンダリングするページの構成

実行時にページにレンダリングされたリージョンの個数がわからない場合は、設計時にページを構成できます。たとえば、panelTabbedコンポーネントを使用してリージョンをタブに追加するかタブから削除することが必要な場合があります。追加または削除を行うタブでは、それぞれにバインド・タスク・フローを参照するリージョンがレンダリングされます。

この機能を実装するには、JSFページ定義ファイルのmultiTaskFlow要素を構成して、次のタイプのマネージドBeanに含まれるタスク・フローのリストを参照します。

oracle.adf.controller.binding.TaskFlowBindingAttributes

次の例は、2つのタスク・フローを含むリストを返すMultiBeanと呼ばれるマネージドBeanクラスのコードを示しています。

package view;
 
import java.util.ArrayList;
import java.util.List;
 
import oracle.adf.controller.TaskFlowId;
import oracle.adf.controller.binding.TaskFlowBindingAttributes;
 
public class MultiBean {
    private List<TaskFlowBindingAttributes> mTaskFlowBindingAttrs = new 
                   ArrayList<TaskFlowBindingAttributes>(5);
 
    public MultiBean() {
        TaskFlowBindingAttributes tfAttr = new TaskFlowBindingAttributes();
        tfAttr.setId("region1");
        tfAttr.setTaskFlowId(new TaskFlowId("/WEB-INF/r1.xml", "r1"));
        mTaskFlowBindingAttrs.add(tfAttr);
 
        tfAttr = new TaskFlowBindingAttributes();
        tfAttr.setId("region2");
        tfAttr.setTaskFlowId(new TaskFlowId("/WEB-INF/r2.xml", "r2"));
        mTaskFlowBindingAttrs.add(tfAttr);
 
    }
 
    public List<TaskFlowBindingAttributes> getTaskFlowList() {
        return mTaskFlowBindingAttrs;
    }
}

TaskFlowBindingAttributesクラスの詳細は、Oracle ADF ControllerのJava APIリファレンスを参照してください。

実行時に、multiTaskFlowバインディングでは、公開するコマンド・コンポーネントを使用して、エンド・ユーザーがページに追加またはページから削除できる1つまたは複数のタスク・フローのリストが参照されます。図26-16は、このユース・ケースを作成した各種パート間の関係を示しています。

注意:

バインド・タスク・フローでレンダリングされるページ・フラグメントではFaceletsドキュメント・タイプを使用する必要があります。

図26-16 複数タスク・フロー・バインディングから導出されたADFリージョン

この図は周囲のテキストで説明しています

26.11.1 複数の不明なリージョンをレンダリングするページの構成方法

JSFページ定義ファイルのmultiTaskFlow要素を構成して、バインド・タスク・フローのリストを参照します。TaskFlowBindingAttributesタイプの要素を追加または削除することで、実行時にこのリストを変更できます。

始める前に:

複数の不明なADFリージョンをレンダリングするページの構成時に利用可能な構成オプションついて理解しておくと役に立つ場合があります。詳細は、「複数の不明なリージョンをレンダリングするページの構成」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる他の機能についても理解しておくと役立ちます。詳細は、「タスク・フローおよびADFリージョンのユースケースと例」を参照してください。

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

複数の不明なリージョンをレンダリングするページを構成するには:

  1. 「アプリケーション」ウィンドウで、実行時にADFリージョンを追加または削除するJSFページを右クリックし、「ページ定義に移動」を選択します。
  2. 確認ダイアログが表示されたら、「はい」をクリックします。
  3. 概要エディタで、「バインディングと実行可能ファイル」タブをクリックし、「実行可能ファイル」セクションで「追加」アイコンをクリックします。
  4. 「アイテムの挿入」ダイアログで、ドロップダウン・メニューから「ADFタスク・フロー・バインディング」を選択して、作成するアイテムとして「multiTaskFlow」を選択し、「OK」をクリックします。
  5. 「multiTaskFlowの挿入」ダイアログで、次の値を入力します。
    • ID *: 複数タスク・フロー・バインディングの一意のIDを入力します。

    • taskFlowList *: 実行時にTaskFlowBindingAttributesのリストを返すEL式を入力します。たとえば、次のようにEL式を入力します。

      #{pageFlowScope.multiBean.taskFlowList}

  6. 「アプリケーション」ウィンドウで、エンド・ユーザーがADFリージョンを実行時に追加または削除するJSFページをダブルクリックします。
  7. 「コンポーネント」ウィンドウの「ADF Faces」ページで、「操作」パネルから「各」を、「各」コンポーネントの包含が必要な「構造」ウィンドウのコンポーネント上にドロップします。
  8. 「各」コンポーネントの「プロパティ」ウィンドウで、次のフィールドに値を入力します。
    • アイテム: 複数タスク・フロー・バインディングの実行時オブジェクトからタスク・フロー・バインディングのリストを返すメソッドを参照するEL式を入力します。

      たとえば、次のようにEL式を入力します。

      #{bindings.multiRegion1.taskFlowBindingList}

    • Var: タスク・フロー・バインディングのリストを識別する値を入力します。

  9. 「各」コンポーネントを含むJSFページで、次の例に示すように、EL式を使用して「リージョン」コンポーネントのリージョン・モデルを参照する「各」コンポーネント内にある「リージョン」コンポーネントを挿入します。
    <af:forEach var="tf" items="#{bindings.multiRegion1.taskFlowBindingList}">
      <af:panelBox text="#{tf.name}" id="pb1">
        <f:facet name="toolbar"/>
        <af:region value="#{tf.regionModel}" id="r1"/>
      </af:panelBox>
    </af:forEach>
    

26.11.2 複数の不明なリージョンをレンダリングするページの構成時の処理

複数タスク・フロー・バインディングのJSFページ定義ファイルに、次の例で示されたものと類似するメタデータが含められます。

<multiTaskFlow id="multiRegion1"              
    taskFlowList="${pageFlowScope.multiBean.taskFlowList}" activation="deferred"
    xmlns="http://xmlns.oracle.com/adf/controller/binding"/>

複数タスク・フロー・バインディングのメタデータのtaskFlowList属性ではマネージドBeanが指定されます。マネージドBeanでは、実行時にページに追加可能なタスク・フローを記載するオブジェクトのリストが格納されています。

26.11.3 複数の不明なリージョンをレンダリングするページの構成に関する必知事項

  • JSFページにレンダリングできるリモート・リージョンの数に制限はありませんが、この機能は慎重に使用する必要があります。タブが使用されていない単純なページの場合、リージョンをページにまとめ、リージョンの設計やそれが実行するビュー・オブジェクト問合せによってリージョンの最大数が決定されるようにできます。または、タブを使用する複雑なページの場合、パフォーマンスを最大化するためにリージョンの使用を制限します。複雑なタブ付きページの場合、ADFでは、リージョンがロードされた後は、タスク・フロー・トランザクションを非アクティブ化しません。タブを切り替える場合は、パフォーマンスを最大化するために進行中のトランザクションを停止する必要があります。タスク・フローとリージョン間の対話の詳細は、「ADFリージョンのトランザクション管理の構成」を参照してください。

  • 各タスク・フロー・バインディングは、TaskFlowBindingAttributesによって公開されたメソッドを使用して動作をオーバーライドしないかぎり、複数タスク・フロー・バインディングに定義された属性を継承します。

  • 「パラメータ・マップを使用したADFリージョンのパラメータの指定」の説明のとおり、各タスク・フロー・バインディングは、複数タスク・フロー・バインディングで定義されたパラメータとともに、parametersMapプロパティを使用して定義されたパラメータも継承します。

26.12 未認可のユーザーによるセキュリティ保護されたタスク・フローへのアクセスの処理

バインド・タスク・フローは、アクセスするセキュリティ権限のないユーザーによって起動される場合、ADFリージョンでレンダリングされません。リージョンは、これが発生する場合、リクエストされたタスク・フローのかわりに空白エリアをレンダリングします。起動しようとしたタスク・フローが表示されない理由に関してフィードバックを提供されないため、これによりユーザーが困惑する場合があります。ユーザーの操作性を向上させるために、ユーザーが必要とされるセキュリティ権限がないバインド・タスクにアクセスしようとする場合は、レンダリングする別のバインド・タスク・フローを指定できます。たとえば、ユーザーに必要なセキュリティ権限がないことを伝えるページを表示する別のバインド・タスク・フローを構成できます。より複雑なアプローチにより、システム管理者から必要な権限を要求するためのプロセスを通して、ユーザーが段階的に行うことができるバインド・タスク・フローをレンダリングできます。

セキュリティ権限のないバインド・タスク・フローにアクセスできない場合に、ユーザーが確実に表示できるように別のバインド・タスク・フローのセキュリティ・レベルを構成します。場合によっては、このことに伴い、「ADFリソースを公開する方法」の説明に従って、別のバインド・タスク・フローを公開することが必要になります。バインド・タスク・フローを含むFusion Webアプリケーションのセキュリティ保護の詳細は、「Fusion WebアプリケーションでのADFセキュリティの有効化」を参照してください。

26.12.1 未認可のユーザーによるセキュリティ保護されたタスク・フローへのアクセスの処理方法

セキュリティ権限がないためバインド・タスク・フローにアクセスできない場合にユーザーに表示する内容で、別のバインド・タスク・フローを構成します。Fusion Webアプリケーションadf-config.xmlファイルで「未許可リージョン・タスクフロー」プロパティの値として別のバインド・タスク・フローを指定します。

始める前に:

タスク・フローにセキュリティ権限がないユーザーにメッセージを表示する必要がある場合について理解しておくと役立ちます。詳細は、「未認可のユーザーによるセキュリティ保護されたタスク・フローへのアクセスの処理」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

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

  1. セキュリティ権限がないためバインド・タスク・フローにアクセスできない場合に、ユーザーに表示する別のバインド・タスク・フローを作成します。

    バインド・タスク・フローの作成の詳細は、「タスク・フローの作成」を参照してください。

  2. ユーザーがアクセスできるようにこのタスク・フローを構成します。

    詳細は、「ADFリソースを公開する方法」を参照してください。

タスク・フローにセキュリティ権限がないユーザーにメッセージを表示するには:

  1. 「アプリケーション・リソース」パネルで、「ディスクリプタ」および「ADF META-INF」ノードを開き、「adf-config.xml」ファイルをダブルクリックします。
  2. 概要エディタで、「コントローラ」ナビゲーション・タブをクリックします。
  3. 「コントローラ」ページの「未許可リージョン・タスクフロー」フィールドで、起動するバインド・タスク・フローの名前を入力するか、「参照」をクリックして選択します。

26.12.2 未認可のユーザーによるセキュリティ保護されたタスク・フローへのアクセスの処理

次の例に示すように、JDeveloperでは、adf-config.xmlファイルの<unauthorized-region-taskflow>要素の値として選択したバインド・タスク・フローの名前を記述します。

<?xml version="1.0" encoding="windows-1252" ?>
<adf-config xmlns="http://xmlns.oracle.com/adf/config"
    xmlns:config="http://xmlns.oracle.com/bc4j/configuration"
     xmlns:adf="http://xmlns.oracle.com/adf/config/properties">
...
<adf-controller-config xmlns="http://xmlns.oracle.com/adf/controller/config">
    <unauthorized-region-taskflow>/WEB-INF/task-flow-definition.xml
       </unauthorized-region-taskflow>
  </adf-controller-config>
...
</adf-config>

実行時に、Fusion Webアプリケーションでは、ユーザーがセキュリティ権限のないバインド・タスク・フローを起動しようとすると、この別のバインド・タスク・フローをレンダリングします。

26.13 Fusion Webアプリケーションでのリモート・リージョンの作成

リモート・リージョンを作成するには、Fusion Webアプリケーション(コンシューマ)のページで、別のFusion Webアプリケーション(プロデューサ)からタスク・フローを起動します。リモート・リージョンを作成すると、同じ機能を実装する複数のタスク・フローを開発することなく、独自のデータ・コントロール・フレームを持っているタスク・フローで大まかな機能を再利用できます。ADF FacesコンポーネントをレンダリングしているJSFページでJSF portletを実装する場合と比較して、パフォーマンス、対話、実装の容易さの点でも有利です。実行時に、コンシューマ・アプリケーションは、プロデューサ・アプリケーションからリモート起動可能タスク・フローを起動およびレンダリングします。リモート起動可能タスク・フローは、複数のアプリケーションで使用される場合があります。

リモート起動されるように構成したプロデューサ・アプリケーションからのタスク・フローは、ページ・フラグメントをレンダリングする、バインド・タスク・フローである必要があります。また、data-control-scopeプロパティの値がisolatedであり、remote-invocableプロパティを含んでいる必要もあります。data-control-scopeプロパティの値がisolatedである場合に使用できるトランザクション・オプションはすべて、リモート起動されるように構成したプロデューサ・アプリケーションからのタスク・フローに対して構成できます。プロデューサ・アプリケーションでリモート起動可能タスク・フローのために選択されるオプションがトランザクションの動作を決定するため、プロデューサおよびコンシューマ・アプリケーションはトランザクションを共有しません。タスク・フローのトランザクション・オプションの詳細は、「タスク・フローのトランザクションの管理」を参照してください。

注意:

ここで説明する(リモート・リージョンを作成して、別のFusion WebアプリケーションからJSFページ・フラグメント(.jsff)を表示するバインド・タスク・フローをレンダリングする方法の説明)機能は、「URLを使用したバインド・タスク・フローのコール方法」で説明する機能とは異なります。後の項では、Fusion WebアプリケーションのJSFページで、別のFusion WebアプリケーションからJSFページをレンダリングするバインド・タスク・フローを起動する方法を説明します。

プロデューサおよびコンシューマ・アプリケーションは、同じバージョンのOracle ADF上で実行される必要があります。つまり、Oracle ADFのあるバージョンで実行されているプロデューサ・アプリケーションからリモート起動可能タスク・フローを起動して、Oracle ADFの別のバージョンで実行されているコンシューマ・アプリケーションのリモート・リージョンでレンダリングすることはできません。このタイプの実装を試行すると、プロデューサ・アプリケーションを起動しようとするユーザーに対して、コンシューマ・アプリケーションにより次のメッセージが表示されます。

Remote region error: Version of the richclient on the producer at "[producer URL]" is incompatible with this consumer.  
Consumer version: [Consumer Version] Producer version: [Producer Version]

リモート起動されるように構成したプロデューサ・アプリケーションからのタスク・フローでは、次のことはできません。

  • アクティブ・データ・サービスを使用するADF Facesコンポーネントをレンダリングすること

    アクティブ・データ・サービスの詳細は、「アクティブ・データ・サービスの使用」を参照してください。

  • リモート起動可能タスク・フローを作成する別のアプリケーションから、リモート起動可能タスク・フローを起動すること。つまり、コンシューマ・アプリケーションを構成して、別のプロデューサ・アプリケーションからリモート起動可能タスク・フローを起動するプロデューサ・アプリケーションから、リモート起動可能タスク・フローを起動するようにすることはできません。リモート・リージョンは、別のリモート・リージョンの内部にネストできません。

  • 外部ダイアログを起動すること。次を参照してください。

  • 「タスク・フローでのセーブポイントの使用」の説明に従って、セーブポイントを使用します。

  • 『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「ドラッグ・アンド・ドロップ機能の追加」の説明に従って、ドラッグ・アンド・ドロップ機能を実装します。

  • iFrameを介して起動すること。リモート・リージョンの作成には、Oracle ADF機能のみ使用します。

  • その入力パラメータが参照渡しで、コール元から認識可能と想定すること。リモート・リージョン実装では、すべてのパラメータ値のコピーが、リモート起動可能タスク・フロー(値渡し)のプロデューサに送信されます。通常、このプロデューサはコンシューマ・アプリケーションとは異なるWebアプリケーションに存在するためです。

さらに、リモート起動可能タスク・フローに関連付けられた次のオブジェクトはすべて、シリアライズ可能である必要があります。

  • タスク・フローに対して定義された、入力パラメータと戻りパラメータの値

  • タスク・フローが送出する例外

  • コンテキスト・イベントが渡すあらゆるペイロード・データ

図26-17は、コンシューマ・アプリケーションが、プロデューサ・アプリケーションからリモート起動可能タスク・フローを起動するリモート・リージョンをレンダリングする、サンプル・シナリオを例示しています。

図26-17 リモート・リージョンをレンダリングするアプリケーション

リモート・タスク・フローを使用するアプリケーション

ここまでで説明した機能を実装するには、次のタスクが完了している必要があります。

  • タスク・フローを作成するアプリケーションで:

    • アプリケーションの「リモート・リージョンのプロデューサ・サポートの有効化」プロパティの構成

    • リモート・リージョンでレンダリングするタスク・フロー上での、「リモート起動可能」プロパティの設定

    • コンシューマ・アプリケーションで、コンシューマにイベントをブロードキャストする、アプリケーションで公開するコンテキスト・イベントに対して次のプロパティを構成します。

      • dispatchModeremoteに設定します

      • シリアライズ可能オブジェクトを参照するcustomPayloadのEL式を記述します

      • オブジェクトのカスタム・ペイロードのタイプ指定します

      これらのプロパティを構成すると、コンテキスト・イベントを公開するページ定義に、次のようなコンテキスト・イベントのエントリが含められます。コンテキスト・イベントの詳細は、「コンテキスト・イベントの使用方法」を参照してください。

      <event name="valueChangeEvent" dispatchMode="remote"  
             customPayload="<EL to a serializable object>" customPayloadType=<type of the custom payload> />

      イベントをリモート・コンシューマに公開する方法の詳細は、「コンテキスト・イベントの公開方法」を参照してください。

    • プロデューサ・アプリケーションからコンシューマ・アプリケーションのエンド・ユーザーに対してセッション・タイムアウト警告が表示されないように、セッション・タイムアウトをコンシューマ・アプリケーションのセッション・タイムアウトより大きな値に設定することを検討すること。セッション・タイムアウトの構成の詳細は、「Fusion WebアプリケーションでのHttpSessionの管理」を参照してください。

  • プロデューサ・アプリケーションからのタスク・フローを使用するアプリケーションで:

    • アプリケーションの「リモート・リージョンのコンシューマ・サポートの有効化」プロパティの構成

    • リモート・リージョンをレンダリングするJSFページへの、リモート起動可能タスク・フローの追加

      ヒント:

      JSFページにレンダリングできるリモート・リージョンの数に制限はありませんが、この機能は慎重に使用する必要があります。タブが使用されていない単純なページの場合、リージョンをページにまとめ、リージョンの設計やそれが実行するビュー・オブジェクト問合せによってリージョンの最大数が決定されるようにできます。または、タブを使用する複雑なページの場合、パフォーマンスを最大化するためにリージョンの使用を制限します。複雑なタブ付きページの場合、ADFでは、リージョンがロードされた後は、タスク・フロー・トランザクションを非アクティブ化しません。タブを切り替える場合は、パフォーマンスを最大化するために進行中のトランザクションを停止する必要があります。タスク・フローとリージョン間の対話の詳細は、「ADFリージョンのトランザクション管理の構成」を参照してください。

Oracle ADF用のSummitスタンドアロン・サンプル・アプリケーションのTaskFlowProducerプロジェクトには、コンシューマ・アプリケーションで使用できるリモート起動可能タスク・フローが含まれています。TaskFlowProducerプロジェクトのRemoteViewer.jsfページを実行して、リモート起動可能タスク・フローを含むサンプル・アプリケーションをデプロイします。このサンプル・アプリケーションをデプロイすると、「リモート・リージョンをレンダリングするようにアプリケーションを構成する方法」で説明するように、リモート起動可能タスク・フローを使用できます。

Oracle ADF用Summitスタンドアロン・サンプル・アプリケーションの詳細は、「SummitADF_Examplesワークスペースからのスタンドアロン・サンプルの実行」を参照してください。

26.13.1 リモート・リージョンで使用するタスク・フローを作成するようにアプリケーションを構成する方法

タスク・フローを作成するアプリケーションで、プロジェクトを構成します。また、各タスク・フローは、リモート起動可能になり、コール元のタスク・フローとデータ・コントロール・フレームを共有しないように、リモート・リージョンでレンダリングするプロジェクト内で構成します。

始める前に:

リモート・リージョンで使用するタスク・フローを作成するようにアプリケーションを構成する場合は、その前に必要な構成について理解しておくと役立ちます。詳細は、「Fusion Webアプリケーションでのリモート・リージョンの作成」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

リモート・リージョン用のタスク・フローを作成するアプリケーションを構成する手順:

  1. 「アプリケーション」ウィンドウで、リモート起動可能タスク・フローを作成するように構成するプロジェクトを右クリックし、「プロジェクト・プロパティ」を選択します。
  2. 「ADFタスク・フロー」ノードをクリックして、「リモート・リージョンのプロデューサ・サポートの有効化」チェック・ボックスを選択します。
  3. 実行時に、コンシューマ・アプリケーションのユーザーが、プロデューサ・アプリケーション内のサーブレット(rtfquery)に対して、ユーザー資格証明を提示せずにリモート起動可能タスク・フローのリストを問い合せることを許可する場合、「未認証のリモート・リージョン問合せサーブレット・リクエストを許可する」を選択します。JDeveloper(設計時)でコンシューマ・アプリケーションを開発する際に、プロデューサ・アプリケーションから使用できるリモート起動可能タスク・フローのリストを表示する場合は、このチェック・ボックスも選択します。

    rtfqueryにリクエストを送信するユーザーに対して認証を要求するプロデューサ・アプリケーションのweb.xmlファイルにセキュリティ制約を追加する場合は、このチェック・ボックスを選択しないままにしておきます。このオプションがデフォルトです。詳細は、「リモート・リージョンの保護に関する必知事項」を参照してください。

  4. 「アプリケーション」ウィンドウで、リモート起動するタスク・フローをダブルクリックします。
  5. 概要エディタで、「一般」ナビゲーション・タブをクリックし、「可視性」セクションを開きます。
  6. 「リモート起動可能」チェック・ボックスを選択します。
  7. 「動作」ナビゲーション・タブをクリックして、「トランザクション」セクションを展開し、「タスク・フローのコールとデータ・コントロールを共有」ドロップダウン・リストから「独立」を選択します。

    データ・コントロールの共有の詳細は、「タスク・フロー間のデータ・コントロールの共有」を参照してください。

  8. リモート起動可能にする各タスク・フローについて、ステップ4から7を繰り返して、リモート・リージョンでレンダリングできるようにします。

26.13.2 リモート・リージョンで使用するタスク・フロー作成時の処理

アプリケーションを構成して、リモート起動可能タスク・フローを作成するようにする場合、JDeveloperは次のファイルを作成/変更します。

  • アプリケーションのweb.xmlファイル

  • アプリケーションのポリシー・ストア(jazn-data.xmlファイル)

  • リモート起動できるように構成するタスク・フローのソース・ファイル

次の例に示すように、JDeveloperはプロデューサ・アプリケーションのjazn-data.xmlファイルにあるADFセキュリティ・ポリシーを定義します。そのファイルがプロデューサ・アプリケーションの中に存在しない場合、JDeveloperにより作成されます。このADFセキュリティ・ポリシーは、リモート起動可能タスク・フローのコンテナの働きをするブートストラップ・ページへのアクセス権を付与する権限付与を指定します。権限付与を指定することによって、ブートストラップ・ページに表示する個々のリモート起動可能タスク・フローに対してアクセス・ポリシーを定義する必要があります。詳細は、「ADFバインド・タスク・フローのポリシーを定義する方法」を参照してください。ADFセキュリティの詳細は、「Fusion WebアプリケーションでのADFセキュリティの有効化」を参照してください。

...
<jazn-policy>
  <grant>
    <grantee>
      <principals>
        <principal>
          <class>oracle.security.jps.internal.core.principals.JpsAnonymousRoleImpl</class>
          <name>anonymous-role</name>
        </principal>
      </principals>
    </grantee>
    <permissions>
      <permission>
        <class>oracle.adf.share.security.authorization.RegionPermission</class>
        <name>oracle.adfinternal.view.rich.bootstrap.remoteRegionBootstrapPageDef</name>
        <actions>view</actions>
      </permission>
    </permissions>
  </grant>
</jazn-policy>
...

JDeveloperはまた、次の例に示すように、remote-invocableプロパティをtrueに設定し、data-control-scopeプロパティをisolatedに設定する際に、リモート起動できるように構成するタスク・フローのソース・ファイルに、次のプロパティを挿入します。data-control-scopeプロパティをisolated手段に設定することは、実行時にタスク・フローが独自のデータ・コントロール・フレームを持つことを意味します。データ・コントロールとタスク・フローの詳細は、「タスク・フロー間のデータ・コントロールの共有」を参照してください。

...
<data-control-scope>
   <isolated/>
</data-control-scope>
...
<visibility>
   <remote-invocable/>
</visibility>
...

JDeveloperがアプリケーションのweb.xmlファイルに追加または構成するエントリには、次のものが含まれます。

  • remoteApplicationServletADFFilterADFLibraryFilterおよびadfBindingsと言う名前のフィルタ(および関連付けられたフィルタ・マッピング)

  • Faces ServletadflibResourcesおよびrtfqueryServletという名前のサーブレット(および関連付けられたサーブレット・マッピング)

例26-2は、リモート・リージョンのタスク・フローを作成するように構成されるプロデューサ・アプリケーションの、これらのエントリを示しています。例26-2に示したエントリの他、JDeveloperは、リモート起動可能タスク・フローを作成するようにアプリケーションを構成する際に、<security-constraint>および<login-config>要素を生成します。これらの要素は、例26-2に示されていません。これらの要素に指定された値の詳細は、「リモート・リージョンの保護に関する必知事項」を参照してください。

注意:

web.xmlファイルで、remoteApplicationフィルタが次の位置に現れることを確認します。

  • この後者のフィルタが構成される場合、JpsFilterフィルタの直後。

    JpsFilterフィルタの詳細は、「ADF認証に関する必知事項」を参照してください。

  • ADFLibraryFilterフィルタの前(例26-2参照)。

例26-2 リモート起動可能タスク・フローを作成するアプリケーションのweb.xmlファイルのエントリ

<filter> 
   <filter-name>remoteApplication</filter-name>
   <filter-class>oracle.adfinternal.view.rich.remote.RemoteApplicationFilter</filter-class>
</filter>
...
<filter>
   <filter-name>ADFLibraryFilter</filter-name>
   <filter-class>oracle.adf.library.webapp.LibraryFilter</filter-class>
</filter>
...
<filter-mapping>
   <filter-name>remoteApplication</filter-name>
   <url-pattern>/rr/*</url-pattern>
   <dispatcher>REQUEST</dispatcher>
</filter-mapping>
...
<filter-mapping>
   <filter-name>ADFLibraryFilter</filter-name>
   <url-pattern>/*</url-pattern>
   <dispatcher>FORWARD</dispatcher>
   <dispatcher>REQUEST</dispatcher>
</filter-mapping>
...
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
...
<!-- The remote region query servlet. -->
<servlet>
   <servlet-name>rtfqueryServlet</servlet-name>
   <servlet-class>oracle.adfinternal.controller.rtfquery.RemoteTaskFlowQueryServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>
...
<!-- The servlet name here should be the same as the Faces Servlet. -->
<servlet-mapping>
   <servlet-name>Faces Servlet</servlet-name>
   <url-pattern>/rr/*</url-pattern>
</servlet-mapping>
...
<servlet-mapping>
  <servlet-name>rtfqueryServlet</servlet-name>
  <url-pattern>/rtfquery</url-pattern>
</servlet-mapping>

26.13.3 リモート・リージョンの保護に関する必知事項

デフォルトで、JDeveloperは、リモート・リージョンにリモート起動可能タスク・フローを作成するようにアプリケーションを構成する際に、次の例に示す<security-constraint>要素を追加します。このセキュリティ制約は、リモート・リージョン問合せサーブレット(rtfquery)へのアクセスを、<role-name>要素により指定されたロールを持つユーザーに制限します。

<security-constraint>
  <web-resource-collection>
     <web-resource-name>rtfquery</web-resource-name>
     <url-pattern>/rtfquery</url-pattern>
  </web-resource-collection>
  <auth-constraint>
     <role-name>valid-users</role-name>
  </auth-constraint>
</security-constraint>

リモート起動可能タスク・フローを作成するようにアプリケーションを構成する場合、「未認証のリモート・リージョン問合せサーブレット・リクエストを許可する」チェック・ボックスを選択することによって、web.xmlファイルからこの制約を削除できます。このチェックボックスにアクセスする方法の詳細は、「リモート・リージョンで使用するタスク・フローを作成するようにアプリケーションを構成する方法」を参照してください。

JDeveloperはまた、リモート起動可能タスク・フローを作成するようにアプリケーションを構成する際に、次の例に示された認証メカニズムを生成します。この認証メカニズムは、保護されたADFリソース(たとえば、タスク・フロー)へのアクセスが許可されるかどうかを決定します。プロデューサ・アプリケーションが保護されたリソースへのアクセスをリクエストするクライアントを認証できるように、ここに値CLIENT-CERTが存在する必要があります。クライアントが保護されていないリソースへのアクセスをリクエストする場合、プロデューサ・アプリケーションはこの設定を無視します。

<login-config>
  <auth-method>CLIENT-CERT,FORM</auth-method>
  <realm-name>Identity Assertion</realm-name>
</login-config>

セキュリティ制約(デフォルト動作)を定義するプロデューサ・アプリケーションで、関連付けられた認証メカニズムの<auth-method>要素の値は、最低でもCLIENT-CERTを含む必要があります。リモート起動可能タスク・フローを作成するようにアプリケーションを構成した後、他の変更をweb.xmlファイルに加えた場合(たとえば、ADF Securityの構成)、リモート起動可能タスク・フローが認証されたユーザーにアクセスできるようにするために必要な値を上書きすることがあります。セキュリティ制約と認証メカニズムのために指定される値を検証して、有効であることを確認してください。

セキュリティの詳細は、「Fusion WebアプリケーションでのADFセキュリティの有効化」を参照してください。

26.13.4 リモート・リージョンをレンダリングするようにアプリケーションを構成する方法

リモート・リージョンをレンダリングするFusion Webアプリケーションで、プロデューサ・アプリケーションからリモート起動可能タスク・フローを使用できるようにプロジェクトを構成します。プロデューサ・アプリケーションへの接続を作成します。

この接続を作成すると、接続を定義した任意の場所(「リソース」ウィンドウまたは「アプリケーション・リソース」パネル)からリモート起動可能タスク・フローをドラッグし、JSFページ、またはコンシューマ・アプリケーションのページの、リモート・リージョンが実行時にレンダリングするページ・フラグメントにドロップできます。リモート起動可能タスク・フローが接続に表示されるためには、起動するリモート起動可能タスク・フローのプロデューサ・アプリケーションが実行中である必要があります。

始める前に:

リモート・リージョンをレンダリングするようにアプリケーションを構成する場合は、その前に必要な構成について理解しておくと役立ちます。詳細は、「Fusion Webアプリケーションでのリモート・リージョンの作成」を参照してください。

他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。

リモート・リージョンをレンダリングするようにアプリケーションを構成する手順:

  1. 「アプリケーション」ウィンドウで、リモート・リージョンをレンダリングするように構成するプロジェクトを右クリックし、「プロジェクト・プロパティ」を選択します。
  2. 「ADFタスク・フロー」ノードをクリックして、「リモート・リージョンのコンシューマ・サポートの有効化」チェック・ボックスを選択します。
  3. 「リソース」ウィンドウで、「新規」をクリックし、「接続の作成」「リモート・リージョン・プロデューサ」の順に選択します。
  4. 接続をアプリケーション内でのみ利用可能にする場合は、「リモート・リージョン接続の作成」ダイアログで、「アプリケーション・リソース」を選択します。「リソース」ウィンドウを使用する他のアプリケーションにも接続を使用できるようにする場合は、「リソース」ウィンドウを選択します。
  5. 「名前」フィールドに、アプリケーションが使用して、リモート起動可能タスク・フローのプロデューサ・アプリケーションへの接続を識別する名前を入力します。
  6. 「クエリーURL」セクションの「URLエンドポイント」フィールドに、リモート起動可能タスク・フローを作成するFusion WebアプリケーションのURLエンドポイントを入力します。通常、このURLは、次のような形式になります。

    http://<host>:port/<context root>/rtfquery

    ここで、rtfqueryは、プロデューサ・アプリケーション内のリモート起動可能タスク・フローのリストを提供するサーブレットです。

  7. 「接続テスト」をクリックすると、URLエンドポイントが有効であることを検証できます。
  8. 「起動URL」セクションの「URLエンドポイント」フィールドに、リモート起動可能タスク・フローを作成するFusion WebアプリケーションのURLエンドポイントを入力します。通常、このURLは、次のような形式になります。

    http://<host>:port/<context root>/rr

    ここで、rrは、リモート起動可能タスク・フローを作成するFusion Webアプリケーションのweb.xmlファイルのremoteApplicationフィルタに指定されたurl-patternです。

  9. コンシューマ・アプリケーションがリモート起動可能タスク・フローにアクセスするために、プロデューサ・アプリケーションがユーザー資格証明を要求することがわかっている場合、「常にユーザー・アイデンティティを送信」チェック・ボックスを選択します。これは、コンシューマ・アプリケーションが初期接続時にプロデューサ・アプリケーションに送信する識別トークンを生成します。

    プロデューサ・アプリケーションがユーザー資格証明を要求するかどうかわからない場合は、「常にユーザー・アイデンティティを送信」チェック・ボックスを選択しないままにしておきます。詳細は、「実行時の処理: アプリケーションによるリモート・リージョンのレンダリング方法」を参照してください。

  10. 「接続テスト」をクリックしてURLエンドポイントが有効であることを検証し、「OK」をクリックします。
  11. 「リモート・リージョン・プロデューサ」ノードを展開して、Fusion Webアプリケーションが起動するリモート起動可能タスク・フローをドラッグし、JSFページ、または実行時にリモート・リージョンでレンダリングするページ・フラグメントにドロップします。
  12. 表示されるポップアップ・メニューで、ページに作成するリージョンのタイプを選択します(「リージョン」または「動的リージョン」)。

    「動的リージョン」を選択した場合、実行時にADF動的リージョンでレンダリングするバインド・タスク・フローを決定するマネージドBeanを選択または作成する必要があります。詳細は、「ADF動的リージョンの作成」を参照してください。

  13. 「タスク・フロー・バインディングの編集」ダイアログで、「リモート接続」ドロップダウン・リストから、ステップ5で定義したリモート起動可能タスク・フローを作成するFusion Webアプリケーションへの接続を選択します。

    通常は、これはデフォルトで選択されています。

  14. 「OK」をクリックします。

26.13.5 リモート・リージョンをレンダリングするようにアプリケーションを構成する場合の処理

次の例に示すように、リモート起動可能タスク・フローを使用するプロジェクトでリモート・リージョンのコンシューマ・サポートを有効化すると、JDeveloperはアプリケーションのweb.xmlファイルにコンテキスト・パラメータを追加します。

<context-param>
  <param-name>oracle.adf.view.rich.remote.AUTH_PROVIDER</param-name>
  <param-value>oracle.adf.view.rich.remote.security.ADFAuthorizationProvider</param-value>
</context-param>

このコンテキスト・パラメータは、ADF Securityで作業するために構成されるデフォルトの認可プロバイダを指定します。次のインタフェースを実装するオブジェクトを作成することによって、他の認可プロバイダを追加できます。

oracle.adf.view.rich.remote.AuthorizationProvider

アプリケーションでJSFページまたはページ・フラグメントにリモート起動可能タスク・フローをドラッグ・アンド・ドロップする場合、JDeveloperは、JSFページと、JSFページのページ定義ファイルへのバインド・タスク・フローに、af:regionタグを追加します。これらの追加は、「アプリケーション」ウィンドウから同じアプリケーションのJSFページにタスク・フローをドラッグ・アンド・ドロップするときに生成されるものと類似しています。1つの相違点は、例26-3に示すように、JSFページにリモート起動可能タスク・フローをドラッグ・アンド・ドロップする場合、JSFページのページ定義ファイルに追加されるタスク・フロー・バインディングに、プロデューサ・アプリケーションの接続名を参照するremoteConnectionName属性が含まれるということです。

タスク・フロー・バインディングのremoteConnectionName属性は、プロデューサ・アプリケーションに接続の名前を実行時に戻すEL式を参照することもできます。これは、たとえば、プロデューサ・アプリケーションの名前が変更され、そのイベントに応じてADFリージョンをリフレッシュする場合に便利です。詳細は、「ADFリージョンのリフレッシュの構成」を参照してください。

ADFリージョンまたはADF動的リージョンを作成する場合にJDeveloperが生成するエントリの詳細は、「ADFリージョン作成時の処理」および「ADF動的リージョン作成時の処理」を参照してください。

例26-3 タスク・フロー・バインディングの作成用にページ定義に追加されるメタデータ

<taskFlow id="dynamicRegion2"
      taskFlowId="${viewScope.ParentActionRegion.dynamicTaskFlowId}"
      activation="deferred" remoteConnectionName="RemoteAppProducingTFs"
      xmlns="http://xmlns.oracle.com/adf/controller/binding"/>

26.13.6 実行時の処理: アプリケーションによるリモート・リージョンのレンダリング方法

リモート起動可能タスク・フローを作成し、リモート・リージョンをレンダリングするように構成したアプリケーションの初期ランタイム動作は、プロデューサ・アプリケーションに構成されたセキュリティ関連オプションに依存します。

  • その前のコンシューマ・アプリケーションからのユーザー証明書が、rtfqueryサーブレットにアクセスして、リモート起動可能タスク・フローのリストを取得するのを許可する必要があります。

    このシナリオでは、プロデューサ・アプリケーションは、初期リクエストにエラー・コードで応答します。それに応じて、コンシューマ・アプリケーションは、プロデューサ・アプリケーションに送信する暗号化された識別トークンをレンダリングします。プロデューサ・アプリケーションは、この識別トークンを使用してコンシューマ・アプリケーションを認証し、成功した場合コンシューマ・アプリケーションのリクエストをサービスします。

    プロデューサ・アプリケーションがユーザー資格証明を必要とすることが前もってわかっている場合、「常にユーザー・アイデンティティを送信」チェックボックスを選択することによって、コンシューマ・アプリケーションに、初期接続で暗号化された識別トークンを送信させることができます(「リモート・リージョンをレンダリングするようにアプリケーションを構成する方法」を参照)。これは、接続プロセスを最適化します。

  • それは、未認証リクエストをrtfqueryサーブレットに対して許可します。

    コンシューマ・アプリケーションは、プロデューサ・アプリケーションがリモート起動されるように構成するrtfqueryサーブレットから、リモート起動可能タスク・フローのリストを取得します。

プロデューサ・アプリケーションからリモート起動可能タスク・フローにアクセスした後、コンシューマ・アプリケーションは、この目的に構成されたADFリージョン(リモート・リージョン)のタスク・フローからのコンテンツをレンダリングします。このコンテンツの表示は、コンシューマ・アプリケーションのADFスキンのstyleプロパティによって定義されます。このADFスキンのstyleプロパティは、プロデューサ・アプリケーションのADFスキンで定義されているstyleプロパティと一致する必要があります。詳細は、「ADFスキンとリモート・リージョンに関する必知事項」を参照してください。

コンシューマ・アプリケーションが、プロデューサ・アプリケーションとの間で確立したセッションを無効にすると、プロデューサ・アプリケーションは、コンシューマ・アプリケーションがセッションを無効にした時点で進行中だったあらゆるトランザクションをロールバックします。コンシューマ・アプリケーションがセッションを無効にする原因になる可能性があるイベントの例には、次のようなものがあります。

  • コンシューマ・アプリケーションでセッション・タイムアウトに指定された時間に達した

  • エンド・ユーザーがコンシューマ・アプリケーションをログアウトした

  • エンド・ユーザーがブラウザの「戻る」ボタンをクリックした

  • リモート・リージョンをレンダリングしない異なるページへのナビゲーション

26.13.7 カスタム・エラー・メッセージをリモート・リージョンに追加する方法

リモート・リージョンの実装でエラーが発生すると、コンシューマ・アプリケーションに様々なエラー・メッセージが表示されます。たとえば、図26-18に示したものに類似したメッセージが表示される場合があります。

図26-18 リモート・リージョンのエラー・メッセージ

デフォルト・エラー・メッセージ

次の例は、図26-18で表示されたメッセージに対応するログ・メッセージを示しています。

...
<oracle.adf.view> <RegionRenderer> <_logError> <RR_HTTP_ERROR>
...
...
<oracle.adf.view> <RegionRenderer> <_logError> <Jan 29, 2014 12:50:51 PM oracle.adfinternal.view.faces.renderkit.rich.RegionRenderer _logError
ALL: Remote Region error #2: An uncaught exception was thrown on the producer at "http://127.0.0.1:7101/prod/rr/" while trying to run an ADF Taskflow.
> 
oracle.adf.controller.ControllerException: ADFC-14032: A required remote task flow input parameter value was not specified. Requested remote taskFlowId
 '/WEB-INF/task-flow-definition.xml#task-flow-definition'; requested from 'localhost.localdomain'.
	at oracle.adf.controller.internal.binding.TaskFlowRegionModelRemoteProducer.createRegionViewPortContext(TaskFlowRegionModelRemoteProducer.java:173)
	at oracle.adf.controller.internal.binding.TaskFlowRegionModelViewPort.getViewPort(TaskFlowRegionModelViewPort.java:649)
...

多くのシナリオでは、リモート・リージョンの実装の問題を診断して解決するのに、図26-18のメッセージとログ・ファイル・エントリで十分です。他のシナリオでは、エンド・ユーザーに通信して追加の情報を提示する場合があります。図26-19は、現在、追加情報(エラー・タイプやプロデューサ・アプリケーションの場所など)を表示している図26-18のコンシューマ・アプリケーション・ページの、修正バージョンを示しています。図26-19のように、追加情報を表示するようにコンシューマ・アプリケーションを構成するには、コンシューマ・アプリケーションのweb.xmlファイルにコンテキスト・パラメータを追加して、次のパッケージのRemoteRegionErrorListenerを拡張する同じアプリケーションにJavaクラスを作成する必要があります。

oracle.adf.view.rich.model

図26-19 リモート・リージョンのカスタム・エラー・メッセージ

カスタム・メッセージ

リモート・リージョンにカスタム・エラー・メッセージを追加する手順:

  1. コンシューマ・アプリケーションのユーザー・インタフェース・プロジェクトで、oracle.adf.view.rich.model.RemoteRegionErrorListenerクラスを拡張するJavaクラスを作成します。

    次の例は、リモート・リージョンでエラーをリッスンして、エラー・メッセージの詳細を示す文字列を戻すJavaクラスを示しています。

    package example;
     
    import oracle.adf.view.rich.model.RemoteRegionErrorEvent;
    import oracle.adf.view.rich.model.RemoteRegionErrorListener;
    import oracle.adf.view.rich.model.RemoteRegionHttpErrorEvent;
     
    public class MyRemoteRegionErrorListener extends RemoteRegionErrorListener {
     
        @Override
        public String getAdditionalUserInformation(RemoteRegionErrorEvent event) {
     
            RemoteRegionErrorEvent.Type type = event.getErrorType();
            StringBuilder sb =
                new StringBuilder().append("Received a(n) ").append(type);
     
            if (RemoteRegionErrorEvent.Type.HTTP_ERROR.equals(type)) {
                sb.append(" number ").append(((RemoteRegionHttpErrorEvent)event).getHttpErrorCode());
            }
     
            sb.append(" from ").append(event.getProducerURL());
     
            String viewId = event.getViewID();
            if (null != viewId) {
                sb.append(" for viewId ").append(viewId);
            }
     
            return sb.toString();
        }
    }
    
    
  2. 「アプリケーション」ウィンドウのユーザー・インタフェース・プロジェクトで、「Webコンテンツ」「WEB-INF」ノードを開き、web.xmlをダブルクリックします。
  3. web.xmlファイルの概要エディタで、「アプリケーション」ナビゲーション・タブをクリックし、「コンテキスト初期化パラメータ」セクションで「作成」アイコンをクリックして、次のように、ステップ1で作成したJavaクラスを参照するパラメータを追加します。

    名前: コンテキスト・パラメータoracle.adf.view.rich.REMOTE_REGION_ERROR_LISTENERを入力します。

    :ステップ1で作成したJavaクラスへのパスを入力します。たとえば、手順1のクラスを参照するには、example.MyRemoteRegionErrorListenerと入力します。

26.13.8 ADFスキンとリモート・リージョンに関する必知事項

コンシューマとプロデューサ・アプリケーションのADFスキンのstyleプロパティが一致しないと、リモート・リージョンはレンダリングできません。ADFスキンが一致しない場合、リモート・リージョンはそのコンテンツをレンダリングしません。ADFスキンが一致すると、リモート・リージョンは、コンシューマ・アプリケーションのADFスキンをレンダリングおよび使用して、表示を決定します。

コンシューマおよびプロデューサ・アプリケーションのADFスキンの間に不一致が発生した場合、1つまたは両方のADFスキンを修正して、不一致が発生しないようにする必要があります。不一致の発生箇所で、コンシューマ・アプリケーションのクライアントは、次のようなメッセージを表示します。

コンテンツを取得できません。詳細は、サーバー・ログの"リモート・リージョン・エラー#1"を参照してください。

サーバー・ログは、コンシューマ・アプリケーションのアプリケーション・サーバーのログ・ファイルに表示されるメッセージを参照します。これらのログ・メッセージは、ADFスキンの間の不一致を識別するため、またはADFスキンの問題を診断するために使用できる情報を提供している場合があります。次のリストは、ログ・メッセージを生成するコンシューマ・アプリケーションに帰着する問題の説明です。

  • ADF_FACES-30209は、ADFスキンの間の不一致を識別します。これは、プロデューサ・アプリケーションはコンシューマ・アプリケーションが使用するスキンを検出できますが、ADFスキンが同じではないことを意味しています。次のようなメッセージが表示されます。

    リモート・リージョン・エラー#1: "http://myproducer.com/rr"のプロデューサには、このコンシューマに一致するスキンがありません。コンシューマのスキン情報: {...}、プロデューサのスキン情報: {...}

    提供されるADFスキン情報には、ADFスキンのチェックサムが含まれており、各ADFスキンによって使用される、スキン化拡張機能(チェックサムなど)と機能のすべてがリストされます。コンシューマおよびプロデューサ・アプリケーションは、同じADFスキンおよび拡張機能を持つ必要があります。このデータを使用すると、2つのアプリケーションの間に相違があるかどうかを識別する助けになる場合があります。

  • ADF_FACES-30210は、コンシューマ・アプリケーションが使用するADFスキンがプロデューサ・アプリケーションに含まれていないことを示します。次のようなメッセージが表示されます。

    リモート・リージョン・エラー#1: "http://myproducer.com/rr"のプロデューサには次のスキンがありません: simple

  • プロデューサ・アプリケーションに、スキン・ファクトリがありません。これは、プロデューサ・アプリケーションが正しく構成されておらず、次のパッケージから、SkinFactoryを拡張するインスタンス・オブジェクトを検出できないことを意味します。

    org.apache.myfaces.trinidad.skin

    次のようなメッセージが表示されます。

    リモート・リージョン・エラー#1: "http://yourproducer.com/rr"のプロデューサには、使用できるスキン・ファクトリがありません

コンシューマ・アプリケーションは、VERBOSE設定を使用してスキン・デバッグ情報を記録します。プロデューサ・アプリケーションのweb.xmlファイルに次のコンテキスト・パラメータを追加して、プロデューサ・アプリケーションからのログ出力レベルを決定します。

oracle.adf.view.rich.remote.PRODUCER_STYLESHEET_DEBUG_LEVEL

記録されたメッセージをプログラムで解析しやすいように、プロデューサ・アプリケーションは、すべてのスキン・デバッグ情報をJSON形式で出力します。

コンテキスト・パラメータに適切な値を設定します。

  • TERSE

    ログ出力には、プロデューサ・アプリケーションのADFスキンと、それが拡張するすべてのスキンに関する、スキンID、ファミリ、バージョン、レンダー・キットおよびドキュメントID(チェックサム)が含まれます。ドキュメントIDは、どのスキンが不一致を引き起こすかを診断する助けになりますが、個々のスタイル・シートがある場所に関する情報は提供しません。これは、アプリケーションのweb.xmlファイルでコンテキスト・パラメータを指定していない場合に、プロデューサ・アプリケーションが使用する値です。

  • NORMAL

    ログ出力には、TERSE設定に記載されたデータの他に、ADFスキンのCSSソース・ファイルの場所、スキンの機能のリスト、すべてのスキン追加に対応するドキュメントの場所とドキュメントIDが含まれるようになりました。ほとんどの場合、どのスタイル・シートがファイル・システム上の実ファイルへの完全なパス情報を示さずに不一致を引き起こしている可能性があるかは、NORMAL設定で十分に診断できます。CSSファイルへのパスは、常に現在のclasspathに対して相対的であり、ファイル・システム上のどこにファイルがあるか、または、どのJARに含まれているかに関する情報を含みません。

  • VERBOSE

    ログ出力には、TERSE設定に記載されたデータの他に、ファイル・システム上での実ファイルの場所が含まれ、ADFスキンに対応するCSSソース・ファイルを含むJARファイルが識別されるようになりました。この設定は、ADFスキンの不一致が正確にどこで発生しているかを、コンシューマ・アプリケーションに対して示します。ただし、それを使用すると、コンシューマ・アプリケーションのログにプロデューサ情報が表示される危険があるため、プロデューサ・アプリケーションへのアクセスが保護されている場合のみ使用してください。

ADFスキンの概要は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「スタイルおよびスキンを使用した外観のカスタマイズ」を参照してください。