ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド
11gリリース1(11.1.1.6.0)
B52028-04
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

14 ADFタスク・フローの概説

この章では、アプリケーション内でナビゲーション、カプセル化、再利用、マネージドBeanのライフサイクルおよびトランザクションを使用できるようにするADFタスク・フローの作成方法について説明します。これにはタスク・フロー・ダイアグラムの作成、このダイアグラムへのアクティビティと制御フローの追加、および完成したタスク・フローの実行の基本的な手順が含まれています。

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

14.1 ADFタスク・フローの概要

ADFタスク・フローは、アプリケーション内のコントロール・フローを定義するためのモジュールのアプローチを提供します。アプリケーションは単一の大規模なJSFページ・フローとして表すのではなく、再利用可能な一連のタスク・フローに分割できます。各タスク・フローには、アプリケーションのナビゲーション・グラフが含まれます。タスク・フロー内のノードは、アクティビティです。アクティビティ・ノードはページの表示、アプリケーション・ロジックの実行、または別のタスクフローのコールなどの単純な論理的操作を表します。アクティビティ間のトランザクションは、制御フロー・ケースと呼ばれます。

図14-1に、CreateおよびConfirmと呼ばれる2つのビュー・アクティビティを示します。これらのビュー・アクティビティは、JSFページ・フロー内部のページ・ノードに類似しています。

図14-1 ADFタスク・フロー

シンプルなADFタスク・フロー

タスク・フローはマネージドBeanを起動します。タスク・フローで使用するマネージドBeanの定義、サポートしているメモリー・スコープ、その他の関連する情報の詳細は、14.2.4項「タスク・フロー用のメモリー・スコープについて」および20.4項「Fusion Web ApplicationでのマネージドBeanの使用]を参照してください。

14.1.1 タスク・フローの利点

表14-1に示すように、ADFタスク・フローは標準JSFページ・フローに比べ大きな利点があります。

表14-1 ADFタスク・フローの利点

JSFページ・フロー ADFタスク・フロー

アプリケーション全体を単一のページ・ナビゲーション・ファイルに配置する必要があります(faces-config.xml)。1つのプロジェクト内でfaces-config.xmlのコピーを複数持つことはできますが、アプリケーションはこれらのファイルを実行時にロードします。

アプリケーションは、相互にコールする一連のモジュール型のフローに分割できます。

JSFページ・フロー内のすべてのノードは、JSFページである必要があります。他のタイプのオブジェクトは、JSFページ・フロー内には存在しません。

ビュー、メソッド・コールおよび他のタスク・フローへのコールなどのタスク・フロー・ダイアグラム・ノードに追加できます。

ナビゲーションはページ間のみです。

ナビゲーションは複数のページや、ルーターを含む他のアクティビティにも及びます。詳細は、15.4項「ルーター・アクティビティの使用」を参照してください。

アプリケーション・フラグメントを再利用できません。

ADFタスク・フローは、同一、または完全に別のアプリケーション内で再利用可能です。

アプリケーションをタスク・フローに分割した後で、一般機能を備えたタスク・フローを再利用できます。

詳細は、第33章「アプリケーション・コンポーネントの再利用」を参照してください。

セッション・スコープを除き、複数のリクエスト間では共有メモリー・スコープがありません。

タスク・フロー内のアクティビティ間でのデータ渡しを可能にする共有メモリー・スコープ(ページ・フロー・スコープなど)があります。ページ・フロー・スコープは、ADFバインド・タスク・フローの各インスタンスに対して、一意の記憶域を定義します。


14.1.2 タスク・フロー・タイプ

ADFタスク・フローには次の2つのタイプがあります。

  • バインドなしタスク・フロー: ユーザーがタスクを完了できるように対話する一連のアクティビティ、制御フロー・ルールおよびマネージドBeanです。ADFバインドなしタスク・フローは、バインド・タスク・フローに組み込まれていないアプリケーション内のすべてのアクティビティと制御フローで構成されます。

  • ounバインド・タスク・フロー: タスク・フローの特殊な形式であり、バインドなしタスク・フローとは異なり、単一エントリ・ポイントと0以上の終了ポイントがあります。プライベート制御フロー・ルール、アクティビティおよびマネージドBeanの独自のセットが含まれています。ADFバインド・タスク・フローでは、再利用、パラメータ、トランザクション管理および再開が可能です。

    ADFのバインドなしまたはバインド・タスク・フローに追加可能なアクティビティ・タイプの説明は、第15章「タスク・フロー・アクティビティの使用」を参照してください。

    バインド・タスク・フローは、タスク・フロー定義とも呼ばれます。デフォルトでは、JDeveloperはバインド・タスク・フローのソース・ファイルに対して次のファイル名を使用します。

    task-flow-definitionN.xml

    ここでNは新しいバインド・タスク・フローを作成するたびに増分する番号です。

    このファイルにはバインド・タスク・フローのメタデータが含まれています。複数のタスク・フロー定義(バインド・タスク・フロー)を、同じタスク・フロー定義ファイル内に含むことができます。

一般的なアプリケーションは、1つのバインドなしタスク・フローと1つ以上のバインド・タスク・フローを組み合せたものです。たとえば、デフォルトではFusion Web Applicationテンプレートを使用してFusion Webアプリケーションを作成すると、JDeveloperがバインドなしタスク・フロー(ソース・ファイル名はadfc-config.xml)を作成します。実行時、Fusion Webアプリケーションはこのバインドなしタスク・フローに追加したアクティビティからバインド・タスク・フローをコールできます。

図14-2に示すように、多くの場合、アプリケーションで実行する最初のアクティビティは、ADFバインドなしタスク・フロー内のビュー・アクティビティです。ビュー・アクティビティは、アプリケーションの一部として表示するJSFページを表します。図14-2に示すアクティビティは、Homeビュー・アクティビティで始まり、バインド・タスク・フローをコールします。calltoLogin_taskFlowアクティビティは、ユーザーのアプリケーションへのログインを可能にするバインド・タスク・フローをコールします。

図14-2 バインド・タスク・フローをコールするバインドなしタスク・フロー

バインドなしタスク・フロー。

また、すべてのアプリケーション・アクティビティがADFバインドなしフロー内にあるアプリケーションも設計できます。これはStrutsやJSFアプリケーションを模倣したものですが、ADFバインド・タスク・フロー機能の利点が活用されていません。タスク・フロー機能を十分に活用するには、ADFバインド・タスク・フローを使用します。

14.1.2.1 バインドなしタスク・フロー

Fusion Webアプリケーションには常にADFバインドなしタスク・フローが組み込まれており、アプリケーションへのエントリ・ポイントが含まれています。図14-3は、Fusion Order Demoアプリケーションからのバインドなしタスク・フローのダイアグラムを示しています。このタスク・フローにはいくつかのビュー・アクティビティが含まれており、いずれもアプリケーションへのエントリ・ポイントになっています。

図14-3 Fusion Order Demoアプリケーションのバインドなしタスク・フロー

Fusion Order Demoのバインドなしタスク・フロー

次のような状況では通常、バインド・タスク・フローではなくバインドなしタスク・フローを使用します。

  • ビュー・アクティビティのブックマークなど、バインド・タスク・フローでは提供されないADFコントローラ機能を利用する場合。詳細は、15.2.3項「ビュー・アクティビティのブックマーク」を参照してください。

  • タスク・フローが別のタスク・フローによってコールされない場合。

  • アプリケーションに複数のエントリ・ポイントがある場合。図14-3では、バインドなしタスク・フロー上にビュー・アクティビティ・アイコンで表されるどのページからでも、タスク・フローを開始できます。

    ページはビュー・アクティビティに関連付けられます。ビュー・アクティビティのアイコンには、次のようなページ・イメージが表示されます。

    ビュー・アクティビティ・アイコンのページ・イメージ

  • タスク・フローで複数のアクティビティにブックマークを付ける場合。詳細は、15.2.3項「ビュー・アクティビティのブックマーク」を参照してください。

バインドなしタスク・フローではパラメータを宣言的に指定できません。さらに、バインドなしタスク・フローで最初に実行するアクティビティとして指定された、デフォルト・アクティビティは含むことができません。これは、バインドなしタスク・フローには単一エントリ・ポイントがないためです。これらのいずれかを実行するには、ADFバインド・タスク・フローが必要です。

完全に宣言的なADFコントローラ・トランザクションおよび再開サポートを利用するには、バインドなしタスク・フローではなくバインド・タスク・フローを使用します。

14.1.2.2 バインド・タスク・フロー

ADFバインド・タスク・フローを使用して、アプリケーションの再利用可能な部分をカプセル化します。バインド・タスク・フローは、次のようなJavaメソッドに類似しています。

  • 単一エントリ・ポイントがある。

  • 入力パラメータを受け入れることができる。

  • 戻り値を生成できる。

  • アクティビティおよび制御フロー・ルールの独自のコレクションがある。

  • 独自のメモリー・スコープおよびマネージドBeanの存続期間(ページ・フロー・スコープ・インスタンス)がある。

図14-3checkout-task-flowアクティビティは、ADFバインド・タスク・フローのコールです。バインドなしタスク・フローはADFバインド・タスク・フローをコールできますが、別のタスク・フローからはコールできません。バインド・タスク・フローからは別のバインド・タスク・フローをコールでき、さらにそのバインド・タスク・フローからも次々にコールできます。コールに深さ制限はありません。

チェックアウト・プロセスは、図14-4のように別個のADFバインド・タスク・フローとして作成されます。

図14-4 Fusion Order Demoアプリケーションのチェックアウト・バインド・タスク・フロー

チェックアウト・バインド・タスク・フロー

コール先のバインド・タスク・フローとしてcheckout-task-flowアクティビティを作成する理由は次のとおりです。

  • バインド・タスク・フローでは、常にバインド・タスク・フローの開始直後に実行する必要のある単一エントリ・ポイントとなる、デフォルト・アクティビティを指定します。

    チェックアウト・タスク・フローのreconcileShoppingCartというアクティビティは、無名ユーザー(アプリケーションにまだログインしていないユーザー)が購入するものとして選択した可能性のあるアイテムのリストを返すメソッドを呼び出します。認証前に選択されたアイテムは、ユーザーがログインするとショッピング・カートに追加されます。このメソッドはデフォルト・アクティビティであるため、常にショッピング・カート注文ページが表示される前に起動されます。

  • checkout-task-flowは再利用が可能です。たとえば、アイテムのチェックアウト・プロセスを必要とする他のアプリケーションに組み込むことができます。バインド・タスク・フローは、同じアプリケーション内でも再利用できます。

  • checkout-task-flow内で使用することにしたマネージドBeanは、ページ・フロー・スコープで指定できるため、残りのアプリケーションからは分離されます。

表14-2に、ADFバインド・タスク・フローの主要な機能をまとめます。

表14-2 ADFバインド・タスク・フローの機能

機能 説明

明確に定義された境界

ADFバインド・タスク・フローは、プライベート制御フロー・ルール、アクティビティおよびマネージドBeanの独自のセットで構成されます。コール元は、バインド・タスク・フロー境界内におけるページ名、メソッド・コール、子バインド・タスク・フロー、マネージドBean、制御フロー・ルールなどの内部知識を必要としません。入力パラメータはバインド・タスク・フローに渡すことができ、出力パラメータは終了時にバインド・タスク・フローから渡すことができます。データ・コントロールはタスク・フロー間で共有できます。

単一エントリ・ポイント

ADFバインド・タスク・フローには、タスク・フロー内の他のすべてのアクティビティの前に実行されるデフォルト・アクティビティである、単一のエントリ・ポイントがあります。詳細は、14.2.3項「ADFバインド・タスク・フローのデフォルト・アクティビティについて」を参照してください。

ページ・フロー・メモリー・スコープ

ADFバインド・タスク・フロー内でのデータの受渡し用に、ページ・フロー・スコープをメモリー・スコープとして指定できます。ページ・フロー・スコープは、ADFバインド・タスク・フローの各インスタンスに対して、一意の記憶域を定義します。その存続期間はADFバインド・タスク・フローであり、requestスコープより長く、sessionスコープより短くなっています。詳細は、14.2.4項「タスク・フローのメモリー・スコープについて」を参照してください。

アドレス可能

ADFバインド・タスク・フローにアクセスするには、バインド・タスク・フローのXMLソース・ファイルに記述されている一意の識別子とXMLソース・ファイルのファイル名を指定します。詳細は、15.6.8項「タスク・フロー・コール・アクティビティ追加時の処理」を参照してください。

再利用

あくてぃびてぃのグループ全体を単一のエンティティである、ADFバインド・タスク・フローとして識別し、そのバインド・タスク・フローをADFリージョン内の別なアプリケーション内で再利用することができます。たとえば、Fusion Order Demoアプリケーションのホーム・ページ上のホット・アイテムおよび買い物をスタートタブでは、リージョン内に組み込まれたものと同じタスク・フローを使用しています。各リージョンに異なるパラメータが渡され、表示される製品のリストが決定します。詳細は、17.2項「ADFリージョンの作成」を参照してください。

また、既存のバインド・タスク・フローは、コールするのみで再利用できます。たとえば、あるタスク・フローは、タスク・フロー・コール・アクティビティまたはURLを使用して別のバインド・タスク・フローをコールできます。

また、タスク・フロー・テンプレートを使用して、様々なADFバインド・タスク・フローで再利用するための共通の動作を取得します。詳細は、18.11項「タスク・フロー・テンプレートの作成」を参照してください。

パラメータおよび戻り値

コール元は、ADFバインド・タスク・フローに入力パラメータを渡し、そこから戻り値を受け入れます。詳細は、16.3項「ADFバインド・タスク・フローへのパラメータの渡し方」を参照してください。

また、バインド・タスク・フロー間でデータ・コントロールを共有できます。詳細は、16.4項「データ・コントロール・インスタンスの共有」を参照してください。

トランザクション管理

ADFバインド・タスク・フローは、トランザクションの作業ユニットを表します。タスク・フローの開始時に、新規のトランザクションを作成するか、既存のものを結合するか、または既存のトランザクションの一部ではないかどうかを決定するオプションをバウンド側のタスク・フローに宣言的に指定できます。詳細は、18.3項「トランザクションの管理」を参照してください。

再開

再開できるかどうかを決定するオプションを、バインド側のタスク・フローで指定できます。詳細は、18.4項「バインド・タスク・フローの再開」を参照してください。

メタデータのオンデマンド・ロード

ADFバインド・タスク・フロー・メタデータは、ADFバインド・タスク・フローの開始時にオンデマンドでロードされます。

セキュリティ

ADFバインド・タスク・フローは、ユーザーが使用する際に必要な権限を定義することによってセキュリティ保護します。


14.1.3 制御フロー

タスク・フローは、アクティビティ、およびアクティビティ間の遷移を定義する制御フロー・ケースで構成されます。図14-5では、toView2という制御フローは、ViewActivity1ViewActivity2間の遷移を定義しています。図14-5のタスク・フローを実行すると、ViewActivity1ViewActivity2より前に表示されます。

図14-5 アクティビティおよび制御フロー・ケースのあるタスク・フロー

タスク・フロー・アクティビティと制御フロー・ルール。

図14-5には、ViewActivity2の後、ただしtaskflowCall1バインド・タスク・フローのコール前に起動するメソッド・コール(methodCall1)が含まれています。タスク・フロー内で、ページのレンダリング前後のメソッドなどのアクティビティを起動します。特定ページの外でメソッドを起動することによって、そのメソッドを必要としないその他のコンテンツ(別なタスク・フローなど)でそのページを再利用できるため、再利用が促進できます。

制御フロー・ルールは、JSFナビゲーション・ルールに基づきますが、その他の情報を取得します。JSFナビゲーションは常にページ間のものですが、制御フロー・ルールはアクティビティ間の遷移を示します。たとえば、制御フロー・ルールは、ビュー・アクティビティとそれ以降のメソッド・コール・アクティビティ間の遷移を示します。また、ページから別のタスク・フローに制御が渡されることを示すことができます。

セーブポイント・リストア・アクティビティ、タスク・フロー・リターン・アクティビティ、およびURLビュー・アクティビティは、制御フロー・ルールのソースにはできません。

制御フロー・ルールの基本構造は、JSFナビゲーション・ルールを模倣したものです。表14-3に、JSFナビゲーション・ルールから制御フロー・ルールへのメタデータのマップ方法を示します。

表14-3 JSFナビゲーション・ルールから制御フロー・ルールへのマッピング

JSFナビゲーション・ルール 制御フロー・ルール

ナビゲーション・ルール

制御フロー・ルール

ビューID(自)

アクティビティID(自)

ナビゲーション・ケース

制御フロー・ケース

アクション(自)

アクション(自)

結果(自)

結果(自)

ビューID(至)

アクティビティID(至)



注意:

ADFタスク・フローの使用時、faces-config.xmlのナビゲーション・ルールではなく、ADFコントローラの制御フロー・ルールを使用してすべてのアプリケーションのナビゲーションを行います。ADFコントローラは、ADFコントローラ・メタデータ内に一致する制御フローがなければ、ナビゲーション処理を委譲します。ただし、ADF以外のコントローラのNavigationHandlerによってナビゲーションを行った場合、すべてのADFコントローラ機能は保証されません。

ワイルドカード制御フロー・ルールは、後方ワイルドカード(foo*)や単一ワイルドカード(*)のある制御フローfrom-activity-idを表します。タスク・フロー内の任意のアクティビティからワイルドカード制御フロー・ルールに制御を渡す場合は、単一ワイルドカード文字を使用します。あるいは、ワイルドカード制御フロー・ルールに制御を渡すアクティビティを制限する場合は、後方ワイルドカードを使用します。

図14-6では、ワイルドカード制御フロー・ルールに単一ワイルドカード文字が含まれており、タスク・フロー内のどのアクティビティからでもタスク・フロー・ダイアグラムで接続先となっているアクティビティに制御を渡せることを示しています。

図14-6 単一ワイルドカードのあるワイルドカード制御フロー・ルール

ワイルドカード制御フロー・ルール

図14-7の後方ワイルドカードは、activity-idstorefrontという文字で始まる有効なソース・アクティビティからloginPageビューに制御フローを渡せることを示しています。

図14-7 後方ワイルドカードのあるワイルドカード制御フロー・ルール

後方ワイルドカード

14.2 タスク・フローの作成

タスク・フローはタスク・フロー自体と、複数のアクティビティ、そしてそれらのアクティビティ間の制御フロー・ルールで構成されています。ほとんどの場合は、アクティビティの多くがフロー内の異なるページを示すビュー・アクティビティです。たとえばページのレンダリング前などに、あるメソッドや操作をコールする場合、そのアクティビティから次の適切なアクティビティへの制御フローを定義した、メソッド・コール・アクティビティを使用します。別なタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティを使用します。フローに何らかのブランチ化が必要な場合は、ルーター・アクティビティを使用します。バインド・タスク・フローの最後で、リターン・アクティビティを使用してフローを終了し、そのバインド・タスク・フローをコールしたフローに制御を戻します。


注意:

アプリケーションがビュー・レイヤ―でのFacelets XHTMLファイルを使用している場合、タスク・フローのソース・ファイルで、これらのFacelets XHTMLファイルを参照するビュー・アクティビティ間のナビゲーションを手動で構成します。

各コンポーネント用のメタデータと設定可能な追加構成を含む、タスク・フローの各コンポーネントの詳細および手順は、14.3項「タスク・フローへのアクティビティの追加」を参照してください。

14.2.1 タスク・フローの作成方法

ADFのバインド・タスク・フローとバインドなしタスク・フローを作成するプロセスは類似しています。主な相違は、「タスク・フローの作成」ダイアログの「バインド・タスク・フローとして作成」チェック・ボックスを選択してADFバインド・タスク・フローを作成する点です。


注意:

プロジェクトの作成時は、バインドなしタスク・フローを作成する必要はありません。「プロジェクト・プロパティ」ダイアログの「テクノロジ・スコープ」ページで、「ADFページ・フロー」を指定している場合は、プロジェクト内で新しいadfc-config.xmlソース・ファイルが自動的に作成されます。adfc-config.xmlソース・ファイルは、バインドなしタスク・フローの主なソース・ファイルです。

タスク・フローの作成方法:

  1. タスク・フローの作成:

    1. アプリケーション・ナビゲータで、タスク・フローを作成するプロジェクトを右クリックして、「新規」を選択します。

    2. 「新規ギャラリ」でWeb Tierを展開し、「JSF」「ADFタスク・フロー」の順に選択し、「OK」をクリックします。

      図14-8に示すダイアログが表示されます。

      図14-8 「タスク・フローの作成」ダイアログ

      「タスク・フローの作成」ダイアログ
    3. 「タスク・フローの作成」ダイアログでは、デフォルトで「バインド・タスク・フローとして作成」チェック・ボックスが選択されています。アプリケーションのバインドなしタスク・フローに組み込まれるソース・ファイルを作成するには、チェック・ボックスの選択を解除します。

      チェック・ボックスの選択を解除すると、「ファイル名」フィールドのデフォルト値が自動的に変更されます。この値は、作成するADFタスク・フローのXMLソース・ファイルの名前に使用されます。XMLソース・ファイルには、タスク・フローのアクティビティおよび制御フロー・ルールを記述するメタデータが含まれます。


      ヒント:

      バインドなしタスク・フローのデフォルト名は、adfc-config.xmlです。バインド・タスク・フローのデフォルトのソース・ファイル名は、「タスク・フローID」フィールドに指定された値と一致します。

      1つのプロジェクトには複数のタスク・フローを含めることができるので、ソース・ファイルに一意の名前を付けるために、「ファイル名」フィールドのデフォルト値に数字が追加されます(task-flow-definition3.xmlなど)。

      タスク・フローに追加するビュー・アクティビティでJSFページを参照する場合は、デフォルトで選択されている「ページ・フラグメントを使用して作成」チェックボックスをクリアします。タスク・フローに追加するビュー・アクティビティでページ・フラグメント・ファイル(.jsff)を参照する場合は、「ページ・フラグメントを使用して作成」チェックボックスを選択したままにします。

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

      タスク・フローを表すダイアグラムがエディタに表示されます。


      ヒント:

      タスク・フロー・ダイアグラム全体のサムネイルは、ダイアグラムをクリックし、メイン・メニューで「表示」「サムネイル」を選択すると表示できます。

    5. タスク・フローの作成後、ダイアグラム、概要およびソース・エディタを使用して更新できます。

      タスク・フローの更新には、構造ウィンドウも使用できます。


      ヒント:

      タスク・フローの作成には、既存のADFタスク・フローを新規のタスク・フローにリファクタするなどの別の方法もあります。詳細は、14.5項「新規ADFタスク・フローおよびテンプレート作成のためのリファクタ」を参照してください。

  2. コンポーネント・パレットの「ADFタスク・フロー」ページから、アクティビティをダイアグラムにドラッグします。通常は、ビュー・アクティビティから開始します。あらゆるタイプのアクティビティの詳細手順は、14.3.1項「ADFタスク・フローへのアクティビティ追加方法」を参照してください。

    • ダイアグラム上にビュー・アクティビティをドラッグすると、アクティビティをダブルクリックして、タスク・フローによる起動が設定されているページまたはページ・フラグメントのウィザードを表示できます。このウィザードを使用してページまたはページ・フラグメントの特性を定義します。詳細は、15.2項「ビュー・アクティビティの使用」を参照してください。


      注意:

      アプリケーション・ナビゲータからタスク・フローのダイアグラム上にページをドラッグ・アンド・ドロップして、タスク・フローにビュー・アクティビティを追加することもできます。

    • ルーター・アクティビティをダイアグラムにドラッグすると、プロパティ・インスペクタを使用して、どの制御フローに従うのかを判断するための式を作成できます。詳細は、15.4項「ルーター・アクティビティの使用」を参照してください。

    • コール・アクティビティをダイアグラム上にドラッグすると、プロパティ・インスペクタを使用して、コールするメソッドを構成できます。詳細は、15.5項「メソッド・コール・アクティビティの使用」を参照してください。

    • ダイアグラム上にタスク・フロー・アクティビティをドラッグすると、アクティビティをダブルクリックして、新しいバインド・タスク・フローの設定を定義できる「バインド・タスク・フローの作成」ウィザードを表示できます。詳細は、15.6項「タスク・フロー・コール・アクティビティの使用」を参照してください。

    • バインド・タスク・フローを作成し、ダイアグラム上にタスク・フロー・リターン・アクティビティをドラッグすると、プロパティ・インスペクタを使用してアクティビティを構成できます。詳細は、15.7項「タスク・フロー・リターン・アクティビティの使用」を参照してください。

  3. アクティビティ間の制御フロー・ケースを作成します(詳細および詳細な手順は、14.3.3項「制御フローの追加方法」)を参照してください)。

    1. コンポーネント・パレットの「ADFタスク・フロー」ページで、「制御フロー・ケース」を選択します。

    2. ダイアグラムで、ビューなどのソース・アクティビティをクリックし、次にターゲット・アクティビティをクリックします。たとえば図14-15では、制御フローに2つのアクティビティがリンクされています。ソースとターゲットの両方(view1およびview2)のアクティビティがリンクされています。

    3. 「アクション(自)」属性(結果がメソッドによって決定する場合)または「結果(自)」属性(結果をStringとして設定可能な場合)を使用して結果値を設定します。

  4. バインド・タスク・フローを作成する場合、いずれかのアクティビティをデフォルトに指定できます。そうすることで、タスク・フローの実行時に常に特定のアクティビティを最初に実行できます。デフォルトでは、タスク・フローに最初に追加したアクティビティがデフォルトになります。別なアクティビティに変更する場合は、ダイアグラム内で該当するアクティビティを右クリックし、「アクティビティのマーク」→「デフォルト・アクティビティ」の順に選択します。詳細は、14.2.3項「ADFバインド・タスク・フローのデフォルト・アクティビティについて」を参照してください。

14.2.2 タスク・フロー作成時の処理

新規ADFバインドなしまたはバインド・タスク・フローを作成するたびに、新しいXMLソース・ファイルが作成されます。デフォルトでは、ADFバインドなしタスク・フローのXMLソース・ファイルはadfc-config.xmlと呼ばれます。

例14-1に示すように、すべてのADFコントローラXMLソース・ファイルには、最上位の要素として<adfc-config>が最初に表示されます。バインド・タスク・フロー、アクティビティおよび制御フロー・ルールは、<adfc-config>要素の内部に定義されます。バインド・タスク・フローは、ソース・ファイル内で<task-flow-definition>メタデータ要素によって識別されます。

例14-1 ADFバインド・タスク・フローのXMLソース・ファイル

<?xml version="1.0" encoding="windows-1252" ?>
<adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2" id="__1">
  <task-flow-definition id="task-flow-definition">
    <use-page-fragments/>
  </task-flow-definition>
</adfc-config>

ADFバインド・タスク・フローは、識別子とドキュメント名の一意な組合せで構成されたタスク・フロー参照によって識別されます。例14-2は、タスク・フロー・コール・アクティビティ内のタスク・フロー参照の例を示しています。

例14-2 タスク・フロー参照

<adfc-config xmlns="http://xmlns.oracle.com/adf/Controller" version="1.2">
  <task-flow-definition id="task-flow-definition">
   <use-page-fragments/>
.
.
    <task-flow-call id="taskFlowCall">
      <task-flow-reference>
        <document>/WEB-INF/target-task-flow-definition.xml</document>
        <id>my-task-flow</id>
      </task-flow-reference>
    </task-flow-call>
.
.  
  </task-flow-definition>
</adfc-config>

注意:

JDeveloperを使用してADFバインド・タスク・フローを作成する場合、1つのバインド・タスク・フロー定義を表すIDを各ドキュメントに1つのみ指定します。

ADFバインド・タスク・フローを作成する場合、識別子とドキュメント名の両方を割り当てます。例14-2に示すように、識別子は、「タスク・フローID」フィールドの値です。ドキュメント名は、「ファイル名」フィールドの値です。

14.2.3 ADFバインド・タスク・フローのデフォルト・アクティビティについて

デフォルト・アクティビティは、ADFバインド・タスク・フローで実行される最初のアクティビティです。たとえば、デフォルト・アクティビティは、タスク・フロー・コール・アクティビティからADFバインド・タスク・フローに制御が渡されるとき、常に最初に実行されます。

ADFバインドなしタスク・フローにはデフォルト・アクティビティはありません。

図14-9に示すように、緑の円はタスク・フロー・ダイアグラムのデフォルト・アクティビティを示します。

図14-9 ADFバインド・タスク・フローのデフォルト・アクティビティ

バインドなしタスク・フローのデフォルト・アクティビティ。

新しいADFバインド・タスク・フロー・ダイアグラムに最初に追加するアクティビティが、デフォルト・アクティビティとして自動的に識別されます。タスク・フロー・ダイアグラム内の任意のアクティビティを右クリックし、「アクティビティのマーク」→「デフォルト・アクティビティ」の順に選択することもできます。デフォルトは任意のアクティビティ・タイプで、ADFバインド・タスク・フロー内の任意の場所に配置できます。デフォルト・アクティビティを検索するには、タスク・フロー・ダイアグラム上の任意の場所で右クリックし、「デフォルト・アクティビティに移動」を選択します。

ADFバインド・タスク・フローで使用できるデフォルト・アクティビティは1つのみです。デフォルトとして2つ目のアクティビティをマークすると、最初のマークが自動的に解除されます。アクティビティのマークを手動で解除するには、タスク・フロー上の任意のアクティビティを右クリックし、「アクティビティのマーク解除」→「デフォルト・アクティビティ」を選択します。

トレインの途中でトレイン・ストップをデフォルト・アクティビティとして指定しないでください(詳細は、18.9項「トレインの作成」を参照)。

例14-3に、バインド・タスク・フローのSurveyPromptというデフォルト・アクティビティのメタデータの例を示します。

例14-3 バインド・タスク・フローのデフォルト・アクティビティ・メタデータ

<task-flow-definition id="survey">
    <default-activity>SurveryPrompt</default-activity>
    <view id="SurveryPrompt">
      <page>/SurveryPrompt.jsff</page>
    </view>
    <use-page-fragments/>
</task-flow-definition>

14.2.4 タスク・フローのメモリー・スコープについて

Fusion Webアプリケーション内の各タスク・フローでは、状態を管理するためにpageFlowスコープを定義しています。pageFlowスコープはタスク・フローの開始時に始まり、タスク・フローの終了時に終わります。pageFlowスコープは、アプリケーション内のタスク・フローのインスタンスごとに、タスク・フロー内のアクティビティ間でデータをやり取りするために使用する一意の記憶域を定義します。あるタスク・フローが別なタスク・フローをコールする際、呼出し側のタスク・フローは呼出される側のpageFlowスコープにアクセスします。したがって、たとえばタスク・フローのビュー・アクティビティで参照されたページ上のUIコンポーネントは、たとえそれがタスク・フローがUIコンポーネントと同じページに組み込まれたADFリージョンであっても、別なタスク・フローのpageFlowスコープにアクセスできません。

タスク・フローには複数のマネージドBeanを登録できます。図14-10に、デフォルトのバインドなしタスク・フロー(adfc-config.xml)および顧客が登録したタスク・フローが、各種のスコープ値を使用して複数のマネージドBeanを参照している、Fusion Order Demoアプリケーションの例を示します。マネージドBeanに割り当てられたスコープを特定できます。

図14-10 タスク・フローに登録されたマネージドBean

タスク・フローに登録されたマネージドBean

表14-4に、マネージドBeanに使用可能なスコープを示します。また、タスク・フローに登録したマネージドBeanにおける各スコープの使用に適した状況も説明します。この表はスコープを存続期間順に示しています。たとえば、アプリケーション・スコープは、リクエスト・スコープよりも存続期間が長くなっています。

表14-4 ADFマネージドBeanのメモリー・スコープ

スコープ 説明

アプリケーション

アプリケーション・スコープはアプリケーション終了時まで続行します。このスコープのマネージドBeanに保存する値は、そのアプリケーションを使用する各セッションと各リクエストで使用できます。

タスク・フローに使用すると、タスク・フローが終了しても存続してしまうので、避けてください。

セッション

セッション・スコープはユーザーがアプリケーション内のページに最初にアクセスしたときに始まり、非アクティブ状態になった場合、またはアプリケーションによるセッション認証が失敗した場合に、ユーザー・セッションがタイムアウトしたときに終了します。

このスコープは、セッション全体に関連する情報(ユーザー情報やコンテキスト情報など)にのみ使用します。タスク・フロー間で値を渡すためにセッション・スコープを使用しないでください。タスク・フロー間での値のやり取りには、パラメータを使用します。パラメータを使用すると、タスク・フローは、コール元あるいはコール先となる他のタスク・フローと明確に結ばれます。セッション・スコープの使用を避けるもう1つの理由は、タスク・フローが終了しても存続する可能性がある点です。

pageFlow

タスク・フロー内のアクティビティ全体でマネージドBeanにアクセスできるようにしたい場合は、このスコープを選択します。pageFlowがあるマネージドBeanは、それにアクセスするタスク・フローのページと同じ状態にあります。pageFlowスコープが指定されたマネージドBeanはタスク・フローが終了するまで存続します。別なタスク・フローのページからマネージドBeanへの参照が行われた場合、マネージドBeanがこのオブジェクトの別なインスタンスを作成し、それをそのタスク・フローのpageFlowスコープに追加します。

ビュー

このスコープは、現在のビュー・アクティビティ内でのみ必要とされ、ビュー・アクティビティ間をまたがっていないマネージドBeanオブジェクトに使用します。ADFコントローラが管理する各ビュー・ポート、たとえばルート・ブラウザ・ウィンドウまたはADFリージョンなどのスコープを定義します。

このスコープの存続期間は、ビュー・ポートの現在のviewIdの変更開始から終了までです。ビューを指定すると、このアプリケーションは、ユーザーがそのページと対話し続けるかぎり、ページで使用するマネージドBeanオブジェクトを維持します。これらのオブジェクトは、ユーザーがページを終了すると自動的に解放されます。

リクエスト

リクエスト・スコープは、現在のリクエストより長期間、マネージドBeanが存続する必要がない場合に使用します。

backingBean

バッキングBeanは、JSFページ上のUIコンポーネントのアクセッサとイベント処理コードを保存するマネージドBeanの記述規則です。リクエストが終了するまで存続するもので、状態の維持には使用しないでください。

タスク・フローが同じJSFページの複数のADFリージョンに表示される可能性がある場合に、ADFリージョンの各インスタンスを分離するために使用します。


タスク・フローにマネージドBeanを登録すると、JDeveloperがタスク・フローのソース・ファイル内に次のようなエントリを生成します。

<managed-bean id="__15">
    <managed-bean-name id="__16">egBackingBean</managed-bean-name>
    <managed-bean-class id="__13">oracle....egBackingBean</managed-bean-class>
    <managed-bean-scope id="__14">backingBean</managed-bean-scope>
</managed-bean>

<managed-bean-scope>要素には、マネージドBeanのスコープの値(例ではbackingBean)が含まれています。

UIコンポーネントをマネージドBeanにバインドすると、JDeveloperはマネージドBeanの参照用に生成するEL式のスコープ名にScopeを付加します。たとえば、マネージドBeanを参照する表コンポーネントのバインド属性には次のEL式があります。

<af:table id="cartTab"
          ...
          binding="#{backingBeanScope.egBackingBean.table}"
         ...
</af:table>

UIコンポーネントのバインド属性で参照するマネージドBeanのスコープを、backingBeanまたはリクエスト・スコープに限定します。UIコンポーネントのインスタンスはシリアライズできません。backingBeanとリクエスト以外のスコープのオブジェクトは、シリアライズ可能と考えられています。そのため、backingBeanまたはリクエスト以外のスコープのマネージドBeanに、UIコンポーネントをバインドしてはなりません。JDeveloperでは、UIコンポーネントのバインディング属性およびリージョン・フラグメントが、backingBeanスコープを使用するようにデフォルト設定されています。


注意:

Oracle ADF固有のカスタム・スコープ(pageFlow、backingBean、ビュー・スコープなど)にアクセスするEL式を記述する場合、アクセスするスコープを明示的に指定するEL式を記述します.たとえばpageFlowスコープにアクセスするEL式は次のように記述します。

#{pageFlowScope.inpTxtBB.uiComponent}


14.2.5 実行時に行われる処理: ADFタスク・フローの使用

1つのアプリケーションで、複数のADFバインドなしタスク・フローXMLソース・ファイルと複数のADFバインド・タスク・フローXMLソース・ファイルを持つことができます。ADFバインドなしタスク・フローを生成するために組み合せたファイル・セットは、アプリケーションのADFコントローラ・ブートストラップ構成ファイルと呼ばれています。ADFバインドなしタスク・フローは、1つ以上のADFコントローラ・ブートストラップ構成ファイルを組み合せて、実行時にアセンブルされます。ADFバインド・タスク・フロー内にないブートストラップ構成ファイルのすべてのアクティビティは、ADFバインドなしタスク・フロー内にあるとみなされます。

1つのアプリケーション内のソース・ファイル名は、異なる名前である必要があります。図14-11の例には、2つのバインドなしタスク・フロー(adfc-configadfc-config2)と、1つのバインド・タスク・フロー(task-flow-definition)があります。

図14-11 2つのADFバインドなしタスク・フローXMLソース・ファイルのあるアプリケーション

2つのバインドなしタスク・フロー・ソース・ファイルのあるアプリケーション。

14.3 タスク・フローへのアクティビティの追加

タスク・フローの作成後、タスク・フローにアクティビティを追加し、アクティビティ間の制御フローを構成します。JDeveloperの「コンポーネント・パレット」に、使用可能なアクティビティおよび制御フローが表示されます。「コンポーネント・パレット」からタスク・フロー・ダイアグラムに、アクティビティおよび制御フローをドラッグ・アンド・ドロップします。次にアクティビティ間の制御フローを構成し、タスク・フローが必要なタスクを実行できるようにします。

14.3.1 ADFタスク・フローへのアクティビティの追加方法

タスク・フローを作成すると、タスク・フロー・ダイアグラムとコンポーネント・パレットが自動的に表示されます。タスク・フロー・ダイアグラムはビジュアル・エディタであり、そこでタスク・フローのアクティビティおよび制御フローを追加できます。これは、コンポーネント・パレットからドラッグしてダイアグラムに追加できます。

アクティビティをADFタスク・フローに追加する手順:

  1. アプリケーション・ナビゲータで、タスク・フロー・ソース・ファイルをダブルクリックします。

    たとえば、図14-12はタスク・フロー・ソース・ファイル(task-flow-definition.xml)をダブルクリックすると自動的に表示されるエディタおよび「コンポーネント・パレット」を示します。

    図14-12 タスク・フロー・ダイアグラム

    タスク・フロー・ダイアグラム
  2. コンポーネント・パレットの「ADFタスク・フロー」ページから、アクティビティをダイアグラムにドラッグします。

    • ビュー・アクティビティをダイアグラム上にドラッグすると、アクティビティをダブルクリックしてJSFページ・フラグメントの作成ウィザードを表示し、そこでページまたはページ・フラグメントの特性を定義できます。詳細は、15.2項「ビュー・アクティビティの使用」を参照してください。

    • ダイアグラム上にタスク・フロー・アクティビティをドラッグすると、アクティビティをダブルクリックして、新しいバインド・タスク・フローの設定を定義できる「バインド・タスク・フローの作成」ウィザードを表示できます。詳細は、15.6項「タスク・フロー・コール・アクティビティの使用」を参照してください。


ヒント:

タスク・フロー・ダイアグラムにドラッグする各アクティビティについて、オプションのステータス・アイコンとアクティビティに関する追加情報を表示するツールチップを表示できます。たとえば、タスク・フロー・ダイアグラムにビュー・アクティビティをドラッグすると、それをJSFページに関連付けるまで警告アイコンが表示されることがあります。

アイコンをオンにするには、タスク・フロー・ダイアグラムの上部にある「表示」を選択し、続いて「ステータス」と次のいずれかを選択します。

  • エラー: タスク・フロー・メタデータの実行を妨げる問題がある場合に表示されます。たとえば、メタデータ内のビュー・アクティビティには<bookmark>または<redirect>要素を組み込めますが、両方を組み込むことはできません。

  • 警告: アクティビティが不完全な場合に表示されます。たとえば、物理ページの関連付けが行われていないビュー・アクティビティ、またはタスク・フロー参照の関連付けがないタスク・フロー・コールは、ともに不完全なアクティビティとみなされます。その結果発生するタスク・フロー・メタデータは、実行が妨げられることがあります。

2次アイコンの上にマウスをドラッグすると、アイコンの意味を説明するツールチップを表示できます。


14.3.2 ADFタスク・フローへのアクティビティ追加時の処理

図14-13に示すように、コンポーネント・パレットには、コンポーネントとダイアグラムの注釈用の別個のセクションがあります。「コンポーネント」セクションの内容は、作成対象がADFバインド・タスク・フローか、ADFバインドなしタスク・フローかに応じて若干異なります。たとえば、ADFバインド・タスク・フローを作成する場合、「コンポーネント」セクションには、追加のタスク・フロー・リターン・アクティビティがあります。

ADFタスク・フローに追加できるアクティビティは、表14-13を参照してください。

図14-13 ADFバインドなしタスク・フローのコンポーネント・パレット

バインドなしタスク・フローのコンポーネント・パレット。

14.3.3 制御フローの追加方法

制御フロー・ケースは、アプリケーション内で、あるアクティビティから次のアプリケーションに制御を渡す方法を指定します。制御フローを作成するには、コンポーネント・パレットの「ADFタスク・フロー」ページで「制御フロー・ケース」を選択し、ソース・アクティビティからターゲット・アクティビティにドラッグします。2つのアクティビティ間で制御フロー・ケースをドラッグすると、次のもので構成される制御フローが自動的に作成されます。

  • control-flow-rule: from-activity-idを使用してソース・アクティビティを識別します。

  • control-flow-case: from-activity-idを使用してソース・アクティビティを識別します。

制御フロー・ケースのソースとしてアクティビティを識別すると、そのソースとしてアクティビティのある追加の制御フロー・ケースが、同じ制御フロー・ルールに基づいて構成されます。図14-14では、ソース・アクティビティとしてview1を識別するcontrol-flow-ruleが1つ、ターゲット・アクティビティview2およびview3を識別するcontrol-flow-caseが2つあります。


ヒント:

アクティビティを既存の制御フローにドラッグ・アンド・ドロップできます。これによって既存の制御フローが、アクティビティを中心として2つに分割されます。

1つの制御フロー・ルールに対して、複数の制御フロー・ケースが存在できます。

図14-14 1つのアクティビティからの複数の制御フロー・ケース

1つのアクティビティからの複数の制御フロー・ケース。

例14-4に、図14-14の複数の制御フロー・ケースのメタデータを示します。

例14-4 バインド・タスク・フロー内の制御フロー・ルールのメタデータ

<task-flow-definition id="task-flow-definition">
.
.
.    
    <control-flow-rule>
      <from-activity-id>view1</from-activity-id>
      <control-flow-case>
        <from-outcome>toView2</from-outcome>
        <to-activity-id>view2</to-activity-id>
      </control-flow-case>
      <control-flow-case>
        <from-outcome>toView3</from-outcome>
        <to-activity-id>view3</to-activity-id>
      </control-flow-case>
    </control-flow-rule>
.
.
.
 </task-flow-definition>

アクティビティ間の基本的な制御フロー作成の開始ポイントとして、タスク・フロー・ダイアグラムを使用します。その後、タスク・フロー・ダイアグラムの構造ウィンドウ、プロパティ・インスペクタまたは概要エディタで制御フロー・プロパティを編集できます。

タスク・フロー・ダイアグラムで制御フロー・ケースを直接定義する手順:

  1. アプリケーション・ナビゲータで、タスク・フロー・ソース・ファイル(adfc-config.xmlなど)をダブルクリックして、タスク・フロー・ダイアグラムを表示します。

  2. コンポーネント・パレットの「ADFタスク・フロー」ページで、「制御フロー・ケース」を選択します。

  3. ダイアグラムで、ビューなどのソース・アクティビティをクリックし、次にターゲット・アクティビティをクリックします。たとえば図14-15では、制御フローに2つのアクティビティがリンクされています。ソース(view1)とターゲットの両方のアクティビティがリンクされています。

    図14-15 制御フロー・ケース

    制御フロー・ケース。

    ダイアグラムに制御フロー・ケースが追加されます。アクティビティ間に追加された各線は、制御フロー・ケースを表します。矢印は、制御フロー・ケースの方向を示します。from-outcomeには、UIコンポーネントのaction属性に指定された値と照合される値が含まれています。

  4. from-outcomeを変更するには、ダイアグラムの制御フローの隣のテキストを選択します。図14-15に示すように、デフォルトでは、このテキストはワイルドカード(*)文字です。テキストは新規のfrom-outcome(toView2など)で上書きできます。

  5. from-activity-id(ソース・アクティビティを識別する)やto-activity-id(ターゲット・アクティビティを識別する)を変更するには、ダイアグラムの矢印のどちらかの端を新規のアクティビティにドラッグします。


ヒント:

タスク・フロー・ダイアグラムの制御フローを選択すると、プロパティ・インスペクタや構造ウィンドウでそのプロパティを変更することもできます。構造ウィンドウは、制御ルールとケースの間の関連の表示に役立ちます。

また、タスク・フロー・ダイアグラムの概要エディタの「制御フロー」をクリックしてケースを追加することもできます(図14-16を参照)。ケースを追加するには、ルールの「アクティビティ(自)」(ソース・アクティビティ)および「アクティビティ(至)」(ターゲット・アクティビティ)がタスク・フローに追加されていることを確認します。


図14-16 タスク・フローの概要エディタの制御フロー

「概要」タブの制御フロー。

14.3.4 ワイルドカード制御フロー・ルールの追加方法

バインドなしまたはバインド・タスク・フローにワイルドカード制御フロー・ルールを追加できます。追加の手順は、タスク・フロー・ダイアグラムへのアクティビティの追加の手順とほぼ同じです。

ワイルドカード制御フロー・ルールを追加する手順:

  1. アプリケーション・ナビゲータで、タスク・フロー・ソース・ファイル(adfc-config.xmlなど)をダブルクリックして、タスク・フロー・ダイアグラムを表示します。

  2. コンポーネント・パレットの「ADFタスク・フロー」ページから「ワイルドカード制御フロー・ルール」をドラッグして、タスク・フロー・ダイアグラムにドロップします。

  3. コンポーネント・パレットの「ADFタスク・フロー」ページから、「制御フロー・ケース」を選択します。

  4. タスク・フロー・ダイアグラムで、制御フロー・ケースをワイルドカード制御フロー・ルールからターゲット・アクティビティにドラッグします。

    ターゲットはどのアクティビティ・タイプでもかまいません。

  5. デフォルトでは、ワイルドカード制御フロー・ルールの下のラベルは*であり、これはそのfrom-activity-id値の単一の*文字に相当します。この値を変更するには、ダイアグラムでワイルドカード制御フロー・ルールを選択します。ワイルドカード制御フロー・ルールのプロパティ・インスペクタで、 「アクティビティID(自)」フィールドに新しい値を入力します。たとえば、project*と入力します。新しいラベルでは、ワイルドカードは後続の文字である必要があります。


    ヒント:

    from-activity-id値は、タスク・フロー・ダイアグラムの概要エディタで変更することもできます。

14.3.5 制御フロー・ルールの作成時の処理

タスク・フローのソース・ファイルにあるルールを定義する要素を理解すると、ADFタスク・フロー・ダイアグラム、ADFタスク・フローの概要エディタ、または構造ウィンドウで制御フロー・ルールを直接作成する際、あるいはXMLソース・ファイルに直接追加する際に役立ちます。例14-5に、タスク・フロー・ソース・ファイルの制御フロー・ルール要素の一般的な構文を示します。

例14-5 ソース・ファイルの制御フロー・ルールの構文

<control-flow-rule>
    <from-activity-id>from-view-activity</from-activity-id>
  <control-flow-case>
    <from-action>actionmethod</from-action>
    <from-outcome>outcome</from-outcome>
    <to-activity-id>destinationActivity</to-activity-id>
  </control-flow-case>
  <control-flow-case>
   .
   .
   .
  </control_flow-case>
</control-flow-rule>

制御フロー・ルールは、次のメタデータで構成されます。

  • control-flow-rule: 制御フロー・ケース要素の必須ラッパー要素。

  • from-activity-id: 制御フロー・ルールの発生元となるアクティビティの識別子(sourceなど)。

    from-activity-idの後方ワイルドカード(*)文字がサポートされています。ルールは、ワイルドカードのパターンに一致するすべてのアクティビティに適用されます。たとえば、login*は、リテラルloginで始まるすべての論理アクティビティID名と一致します。メタデータに(後方ワイルドカードではなく)単一のワイルドカード文字を指定すると、ダイアグラムで、制御フローが自動的にワイルドカード制御フロー・ルール・アクティビティに変換されます。詳細は、14.3.4項「ワイルドカード制御フロー・ルールの追加方法」を参照してください。

  • control-flow-case: 制御フロー・ルールの各ケースの必須ラッパー要素。それぞれのケースで、同じソース・アクティビティに対して異なる制御フローを定義します。制御フロー・ルールには、少なくとも1つの制御フロー・ケースが必要です。

  • from-action: 指定されたアクション・メソッドからの結果のみにルールの適用を制限する任意の要素。アクション・メソッドは、ELバインディング式(#{backing_bean.cancelButton_action}など)として指定されます。

    例14-5では、outcomeactionmethodから返された場合にのみ制御がdestinationActivityに渡されます。

    from-actionの値は、ビュー・アクティビティから発生する制御フローのみに適用され、その他のアクティビティ・タイプからのものには適用されません。from-actionでは、ワイルドカードはサポートされていません。

  • from-outcome: 特定の元のアクティビティ結果に基づき、続いて起こる制御フロー・ケースを識別する要素。考えられるすべての元のアクティビティの結果は、制御フロー・ケースと適合する必要があります。

    from-action要素とfrom-outcome要素の両方を空のままにすると、ケースはアクティビティに対して定義されたその他の制御フロー・ケースでは識別されないすべての結果に適用されるため、アクティビティのデフォルト・ケースが作成されます。from-outcomeでは、ワイルドカードはサポートされていません。

  • to-activity-id: 制御フロー・ケースが実行される場合にナビゲーションのルーティング先となるアクティビティの完全な識別子が含まれる必須要素。各制御フロー・ケースは、異なるto-activity-idを指定できます。

14.3.6 実行時に行われる処理: 制御フロー・ルール

実行時、ADFコントローラは、最も具体的な一致から最も具体的でない一致まで制御フロー・ルールを評価して、アクティビティ間の次の遷移を決定します。評価は次の優先順位に基づきますが、これはJSFナビゲーション・ルールと類似しています。

  1. from-activity-idfrom-actionfrom-outcome

  2. from-activity-idfrom-outcome

  3. from-activity-id

ADFコントローラは、最初にfrom-activity-idfrom-actionfrom-outcomeの3つの要素すべての一致を検索します。一致がない場合は、from-activity-idおよびfrom-outcome要素のみの一致を検索します。最後に、from-activity-id要素のみの一致を検索します。

ADFコントローラは、そのメタデータ内でリクエストと一致する制御フロー・ルールを検出できない場合、標準JSFナビゲーション・ハンドラによる一致の検出を許可します。

1つのバウンドなしタスク・フローに、ADFコントローラXMLソース・ファイルは複数存在できます。複数のADFコントローラXMLソース・ファイルに制御フロー・ルールを定義できるため、似たようなルールが異なるファイルに定義される場合もあります。2つ以上のケースに同じfrom-activity-idfrom-actionまたはfrom-outcomeの値が存在するといった競合がある場合は、(adfc-config.xml、ブートストラップまたはバインド・タスク・フローのソース・ファイルで記述される順序で)最後のケースが使用されます。異なるソース・ファイルに定義されたルール間で競合がある場合は、最後にロードされるソース・ファイルのルールが使用されます。

14.4 ADFタスク・フローのテスト

タスク・フローを実行してデバッグするプロシージャは、タスク・フローがバインドかバインドなしか、ページまたはページ・フラグメントのどちらを含んでいるか、入力パラメータを受け入れるかどうかに応じて異なります。

アプリケーションを初めて実行し、新しいドメインを統合WebLogic Serverで開始する際に、「デフォルト・ドメインの構成」ダイアログが表示されます。ダイアログを使用して新しいドメインの管理者パスワードを定義します。入力するパスワードは8文字以上で、数字が含まれている必要があります。

14.4.1 ページを含むバインド・タスク・フローの実行方法

ページであるビュー・アクティビティを含むADFバインド・タスク・フローを実行またはデバッグできます。

ページ・フラグメントであるビュー・アクティビティを含むバインド・タスク・フローの実行方法の詳細は、14.4.2項「ページ・フラグメントを使用するバインド・タスク・フローの実行方法」を参照してください。


注意:

ADFタスク・フロー・ダイアグラムまたはアプリケーション・ナビゲータでビュー・アクティビティを選択し、「実行」を選択すると、ADFバインド・タスク・フローを実行できます。

ADFバインド・タスク・フローでは、ビューをデフォルト・アクティビティとして指定し、ADFバインドなしタスク・フローをアプリケーション・ナビゲータから実行する必要があります。詳細は、14.2.3項「ADFバインド・タスク・フローのデフォルト・アクティビティについて」を参照してください。

ADFタスク・フローで実行される最初のアクティビティがビュー以外のアクティビティ・タイプである場合、ADFバインド・タスク・フローを使用する必要があります。


ページを使用するバインド・タスク・フローを実行またはデバッグする手順:

  • タスク・フロー・ダイアグラムで、タスク・フローを右クリックし、「実行」または「デバッグ」を選択します。

  • ブラウザにそのURL(http://mymachine:8988/StoreFrontModule-StoreFrontUI-context-root/faces/homeなど)を入力して、タスク・フローを直接実行することもできます。

  • アプリケーション・ナビゲータでバインド・タスク・フローを右クリックし、「実行」または「デバッグ」を選択できます。

14.4.2 ページ・フラグメントを使用するバインド・タスク・フローの実行方法

ページ・フラグメントを使用するADFバインド・タスク・フローは、ADFリージョン内でのみ実行することを目的としています。ページ・フラグメントとは、別のJSFページのコンテンツとしてレンダリングされるJSF JSPドキュメントです。詳細は、17.1.3.1項「ページ・フラグメントおよびADFリージョン」を参照してください。

ページ・フラグメントを使用するバインド・タスク・フローを実行またはデバッグする手順:

  1. バインド・タスク・フローにバインドされたリージョンのあるJSFページを作成します。ページ・フラグメントを含むバインド・タスク・フローをJSFページにドロップすると、JDeveloperにより自動的に実行されます。

  2. ページを参照するプロジェクトのバインドなしタスク・フローにビュー・アクティビティを作成します。詳細は、14.3.1項「ADFタスク・フローへのアクティビティの追加方法」を参照してください。

  3. アプリケーション・ナビゲータまたはタスク・フロー・ダイアグラムでビュー・アクティビティを右クリックし、「実行」を選択します。

14.4.3 パラメータのあるバインド・タスク・フローの実行方法

パラメータのあるバインド・タスク・フローを実行する前に、ページを含むバインド・タスク・フローを実行する必要があります。バインド・タスク・フロー入力パラメータの詳細は、第16章「タスク・フローのパラメータの使用」を参照してください。

入力パラメータ定義を含むバインド・タスク・フローを実行する手順:

  1. バインド・タスク・フローで入力パラメータが定義されている場合は、「実行」または「デバッグ」を選択すると、「実行コンフィギュレーションの設定」ダイアログ(図14-17を参照)が表示されます。

    図14-17 「実行コンフィギュレーションの設定」ダイアログ

    「実行コンフィギュレーションの設定」ダイアログ。
  2. 「入力パラメータ」リストで、タスク・フローに入力パラメータとして渡す値を入力します。値を指定しない場合は、バインド・タスク・フローのコール時、入力パラメータは使用されません。

    図14-17に示すように、リストのそれぞれの必須入力パラメータはアスタリスク付きで表示されます。パラメータ値はリテラル文字列として指定する必要があります。EL式は指定できません。

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

14.4.4 JSFページの実行方法

JSFページは、アプリケーション・ナビゲータでページを右クリックし、「実行」を選択して実行できます。ただし、ボタンやリンクなどのナビゲーションUIコンポーネントがページに含まれている場合は、ナビゲーションが機能する保証はありません。

ナビゲーションを完全に機能させてJSFページを実行する手順:

  1. バインド・タスク・フローまたはバインドなしタスク・フローを作成します。詳細は、14.2.1項「タスク・フローの作成方法」を参照してください。

  2. タスク・フローにビュー・アクティビティを追加します。詳細は、14.3.1項「ADFタスク・フローへのアクティビティの追加方法」を参照してください。

  3. アプリケーション・ナビゲータで、実行するJSFページを選択し、タスク・フロー・ダイアグラムにあるビュー・アクティビティの上部にドロップします。

    これにより、JSFページがビュー・アクティビティと関連付けられます。

  4. ダイアグラムでビュー・アクティビティを右クリックし、「実行」を選択します。

14.4.5 ADFバインドなしタスク・フローの実行方法

バインドなしタスク・フローの実行やデバッグには、起動する特定のビュー・アクティビティを選択する必要があります。

ADFバインドなしタスク・フローでビュー・アクティビティを実行する手順:

  • タスク・フロー・ダイアグラムで、ビュー・アクティビティを右クリックし、「実行」または「デバッグ」を選択します。

    選択したビュー・アクティビティからバインドなしタスク・フローが実行されます。

  • 単一のビュー・アクティビティ以外を選択している(あるいは何も選択していない)場合、「実行コンフィギュレーションの設定」ダイアログで1つ選択するように求められます。

14.4.6 プロジェクトの実行構成を設定する方法

実行構成には、タスク・フローで実行する最初のアクティビティなど、プロジェクトの実行方法を決定する設定が含まれます。1つのプロジェクトに対して1つ以上の実行構成を定義できます。実行構成内では、デフォルトの実行ターゲットとしてADFソース・ファイルを指定できます。プロジェクトを実行すると、ソース・ファイルが最初に実行されます。

デフォルトのタスク・フロー実行ターゲットを定義する手順:

  1. アプリケーション・ナビゲータでプロジェクトを選択します。

  2. メイン・メニューから、「実行」「アクティブな実行構成を選択」「実行構成の管理」を選択します。

  3. 「実行構成の管理」ダイアログで「実行/デバッグ/プロファイル」を選択し、次に「新規」を選択します。

  4. 「新規」ダイアログで、新規実行構成の名前を入力します。

  5. 既存の構成に基づいて新規の構成を作成する場合は、「コンフィギュレーション設定のコピー」ドロップダウン・リストで構成を選択します。

  6. 「OK」をクリックして、ダイアログを終了します。

  7. 「編集」をクリックします。

  8. 「構成の編集」ダイアログの「デフォルトの実行ターゲット」ドロップダウン・リストで、プロジェクトの実行時に最初に実行するADFタスク・フローのソース・ファイルを選択します。

    タスク・フローを選択すると、(バインドなしタスク・フロー用の)ビュー・アクティビティや(バインド・タスク・フロー用の)入力パラメータを設定できます。

  9. 「構成の編集」ダイアログの左側のパネルで、「ADFタスク・フロー」をクリックします。

  10. 右側のパネルにある「タスク・フロー」ドロップダウン・リストで、実行ターゲットのあるADFタスク・フローを選択します。

  11. バインドなしタスク・フローを実行している場合は、「実行構成の編集」ダイアログにターゲット・アクティビティの実行リストが表示されます。アプリケーションで最初に実行するビュー・アクティビティを選択します。

  12. 「開く」をクリックします。

    次にプロジェクトを実行する際、保存された実行構成が「実行」「アクティブな実行構成を選択」メニューで利用可能になります。

    入力パラメータを受け付ける用に設定されたバインド・タスク・フローを実行している場合は、バインド・タスク・フロー用に定義されたすべての入力パラメータの値を指定するセクションがダイアログに表示されます。詳細は、第14章「パラメータのあるバインド・タスク・フローの実行方法」を参照してください。

14.5 新規ADFタスク・フローおよびテンプレート作成のためのリファクタ

既存のアクティビティ、JSFページ・フローおよびJSFページを、新規のADFコントローラ・コンポーネント(ADFバインド・タスク・フローおよびタスク・フロー・テンプレートなど)に変換できます。

14.5.1 選択されたアクティビティからADFバインド・タスク・フローを作成する方法

新規のADFバインド・タスク・フローは、既存のADFバインドまたはバインドなしタスク・フローで選択したアクティビティに基づいて作成できます。

選択されたアクティビティから新規のADFバインド・タスク・フローを作成する手順:

  1. エディタ内で、新規のタスク・フローで使用するアクティビティを含むADFバインドなしタスク・フローまたはバインド・タスク・フローを開きます。

  2. タスク・フロー・ダイアグラムで1つ以上のアクティビティを選択します。


    ヒント:

    ダイアグラムで複数のアクティビティを選択するには、マウスの左ボタンをクリックしたまま、アクティビティの上にカーソルをドラッグします。

    [Ctrl]キーを押しながらそれぞれのアクティビティを選択することもできます。


  3. 選択したものを右クリックして、「タスク・フローの抽出」を選択します。

    「タスク・フローの作成」ダイアログが表示され、そこで新規ADFバインド・タスク・フローを作成できます。詳細は、14.2項「タスク・フローの作成」を参照してください。

実行すると、ADFバインド・タスク・フローがエディタに表示されます。表14-5に示すプロパティが、新規タスク・フローに自動的に設定されます。

表14-5 新規ADFバインド・タスク・フローで更新されるプロパティ

プロパティ

タスク・フロー定義ID

「 タスク・フローの作成」ダイアログの「タスク・フローID」フィールドに入力した値。

デフォルト・アクティビティ

すべての受信制御フロー・ケースのターゲットとして指定。複数のターゲットが存在する場合、エラーのフラグが立てられ、操作全体がロールバックされます。

制御フロー・ルール

選択されたソース・アクティビティのある制御フロー・ケースは、新規のADFバインド・タスクに組み込まれます。ソース・アクティビティは、制御フローの発生元のアクティビティです。新規のADFバインド・タスク・フローには、次のタイプの制御フロー・ケースがあります。

  • 制御フロー・ケースのソース・アクティビティとターゲット・アクティビティの両方が、新規タスク・フローの作成のために選択されています。

  • ソース・アクティビティのみが新規タスク・フローの作成のために選択されています。ターゲットは、それぞれの結果に応じて追加された、対応する新規タスク・フロー・リターン・アクティビティに変更されます。


元のタスク・フロー(新規タスク・フローの基礎として選択したアクティビティを含むタスク・フロー)で次のような変更が自動的に実行されます。

  • 新規タスク・フロー・コール・アクティビティが、元のタスク・フローに追加されます。タスク・フロー・コール・アクティビティは、新規ADFバインド・タスク・フローをコールします。

  • 選択されたアクティビティが元のタスク・フローから削除されます。

  • 選択したアクティビティに関連付けられた既存の制御フロー・ケースが、元のタスク・フローから削除されます。これは新規の制御フロー・ケースに置き換えられます。

    • 古いアクティビティに対する受信制御フロー・ケースは、新規タスク・フロー・コール・アクティビティにリダイレクトされます。

    • 古いアクティビティからの送信制御フロー・ケースは、新規タスク・フロー・コール・アクティビティからリダイレクトされます。

14.5.2 JSFページからのタスク・フローの作成方法

JSFページ・フローで選択したページに基づいて、新規のADFバインド・タスク・フローを作成できます。フローの一部である(つまり、JSFナビゲーション・ケースによってリンクされる)ページのみが、新規タスク・フローでビュー・アクティビティに変換されます。

ページ・フローで選択したJSFページから新規のタスク・フローを作成する手順:

  1. エディタ内で、新規バインド・タスク・フローで使用するページを含むページ・フローを開きます。

  2. タスク・フロー・ダイアグラムで1つ以上のJSFページを選択します。


    ヒント:

    ダイアグラムで複数の要素を選択するには、マウスの左ボタンをクリックしたまま、要素の上にカーソルをドラッグします。

    [Ctrl]キーを押しながらそれぞれの要素を選択することもできます。


  3. 選択したものを右クリックして、「ADFタスク・フローの生成」を選択します。

    「タスク・フローの作成」ダイアログが表示され、そこで新規ADFバインドなしまたはバインド・タスク・フローを作成できます。詳細は、14.2項「タスク・フローの作成」を参照してください。

14.5.3 ADFバインド・タスク・フローの変換方法

既存のADFバインド・タスク・フローをバインドなしタスク・フローに変換するか、そこに含まれるビューがページまたはページ・フラグメントかどうかを変更することができます。表14-6に、それぞれの変換結果を示します。

表14-6 ADFバインド・タスク・フローの変換

変換 結果

ADFバインド・タスク・フローをバインドなしタスク・フローに変換

パラメータ定義やトランザクションなど、バインドなしタスク・フローに対して無効なすべてのメタデータが失われます。

JSFページを使用するためのADFバインド・タスク・フローの変換

タスク・フロー内の任意のビュー・アクティビティに関連付けられたページ・フラグメントをJSFページに変換します。「ページ・フラグメントを保持」チェック・ボックスを選択している場合、古いページ・フラグメントは保存されます。新規のJSFページ名は、デフォルトで古いページ・フラグメント名になります。

ページ・フラグメントを使用するためのADFバインド・タスク・フローの変換

ADFバインド・タスク・フロー内のビュー・アクティビティに関連付けられたすべてのページをページ・フラグメントに変換します。「ページを保持」チェック・ボックスを選択している場合、古いページは保存されます。新規のページ・フラグメント名は、デフォルトで古いページ名になります。


ADFバインド・タスク・フローを変換する手順:

  1. エディタで、バインド・タスク・フロー・ダイアグラムを開きます。

  2. アクティビティまたは制御フロー以外のダイアグラムの任意の場所を右クリックします。

  3. 「バインドなしタスク・フローへの変換」「ページ・フラグメントを含むタスク・フローへの変換」などのメニュー項目を選択します。

    バインド・タスク・フローにフラグメントが含まれている場合、メニュー項目は「ページを含むタスク・フローへの変換」になります。

14.6 タスク・フローの制約

表14-7に、タスク・フロー、アクティビティ、およびその他の関連ADFコントローラ機能の前提条件と制約を示します。

表14-7 ADFコントローラ機能の前提条件および制約

機能エリア 前提条件/
制約
説明

ADFコントローラ・オブジェクトおよびダイアグラムのUI

JSFビュー・レイヤー

ADFコントローラはJSF 1.2環境でのみ動作します。OracleのWebベースのFusion Webアプリケーション戦略は、唯一のビュー・レイヤー・テクノロジとしてJSFに焦点を当てています。


ADF Facesへの依存

ADFコントローラ拡張機能はADF Faces上に実装されています。この機能はADF Facesライブラリに依存しますが、これらのライブラリが存在する場合はJSF実装に対して実行できます。


カプセル化されたナビゲーションおよび状態管理

ADFコントローラでは、ナビゲーションと(ある程度までの)状態管理もカプセル化します。JSFおよびサーブレットAPIは、現在もアプリケーション、セッションおよびリクエストのレベルでの基本の状態管理に利用できます。


モデル・レイヤー

ADFモデル・レイヤーは、アプリケーションのモデル・レイヤーの実装に使用されます。


MDSへの依存

ADFコントローラ・メタデータはMDSに保存されます。ただし、MDSは現在faces-config.xmlをロードできません。

MDSが提供しているカスタマイズ機能が必要な場合は、ADFタスク・フローを占有使用してマネージドBeanと制御フロー・ルールの定義を行う必要があります。


StrutsまたはModel 1からの移行パスのサポートなし

StrutsまたはModel 1からFusion ADF Controllerへの移行はサポートされていません。

しかし、JSFページ・フローで選択したページに基づいて、新規のADFバインド・タスク・フローを作成できます。詳細は、14.5.2項「JSFページからのタスク・フローの作成方法」を参照してください。

バインド・タスク・フロー

ページ・フロー・スコープ状態として公開

ADFコントローラは、ページ・フロー・スコープの状態の実装を管理します。フレームワークによって提供される自動管理機能(「戻る」ボタンのサポート、状態のクリーンアップ機能など)は、ページ・フロー・スコープのデータを想定しています。アプリケーションでそのページのすべてに対してこのような機能を完全実装するために、必要に応じてネストされたバインド・タスク・フローを使用して、アプリケーション全体をADFバインド・タスク・フローとして公開します。アプリケーションには、ページ・フロー・スコープ内にバージョニングを必要とする状態が格納されます。


トランザクション境界

開発者は、ADFバインド・タスク・フローを使用してトランザクション境界を管理します。

ページ・フロー・スコープ

ADFライフサイクル内のアクセスの可用性

ADFコントローラでアクセス準備ができる前のADFライフサイクルの初期段階では、アプリケーションによるページ・フロー・スコープへのアクセスは試行できません。

ページ・フロー・スコープは、ビューのリストア・フェーズでBefore ListenerおよびAfter Listenerが実行されるまでは、アクセス可能になるとは保証されていません。ADFコントローラは、ビューのリストア・フェーズでBefore ListenerおよびAfter Listenerを使用して、サーバー側の状態をリクエストと同期化させます。ここでは、ブラウザの「戻る」ボタン検出やブックマーク参照解除などが処理されます。

ナビゲーション

ナビゲーション

ADFコントローラの使用時、faces-config.xmlのナビゲーション・ルールではなく、ADFコントローラの制御フロー・ルールを使用してすべてのアプリケーションのナビゲーションを行います。

ADFコントローラはADFコントローラ・メタデータ内に一致する制御フロー・ケースがない場合にナビゲーション処理を委譲しますが、ADF以外コントローラ以外のNavigationHandlerでナビゲーションを行う場合は、すべてのADFコントローラ機能は保証されません。