Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.2.1.2.0) E82918-03 |
|
前 |
次 |
train
などのADF Facesコンポーネントの使用およびタスク・フロー・テンプレートからのタスク・フローの作成を行う機能が含まれます。
この章の内容は次のとおりです。
ADFタスク・フローにより、例外の処理、バインド・タスク・フローの再開、セーブポイントの使用などの機能を追加できます。このようなタスク・フローを使用して、高度で複雑なアクティビティを実行できます。
作成したタスク・フローにアクティビティを追加して、そのアクティビティ間に制御フローを構成した場合は、次のリストで説明する機能の一部を追加することで、タスク・フローの機能を拡張できます。
基礎となるデータ・コントロールの機能に加えて、追加のトランザクション管理機能を含むようにバインド・タスク・フローを構成すると、タスク・フローのアクティビティにグループとして関連付けられているデータ・コントロールをFusion Webアプリケーションでコミットまたはロールバックできます。
バインド・タスク・フローにオプションの再開を構成すると、ユーザーがブラウザの「戻る」ボタンをクリックした場合のレスポンスを決定できます。
タスク・フローには、あらかじめ例外を処理できる機能が数多くあります。さらに、タスク・フローによってスローされる例外を処理するカスタム・コードを記述できます。
また、タスク・フローを構成すると、セーブポイントを使用して特定のインスタンスでFusion Webアプリケーションの状態を把握できます。これにより、たとえばユーザーがタスクを完了せずにそのページから移動した場合に、アプリケーションの状態を保存できます。
トレイン・コンポーネントは、ナビゲーション・アイテムをレンダリングするADF Facesコンポーネントで、マルチステップ・プロセスを使用してユーザーをガイドします。バインド・タスク・フローを構成することで、これらのナビゲーション・アイテムをタスク・フローのビュー・アクティビティ用にデフォルトでレンダリングできます。
タスク・フロー・テンプレートは、共通の要素を共有するタスク・フロー作成の開始ポイントとして機能できます。
アプリケーションのデフォルトのバインドなしタスク・フロー(およびアプリケーションの追加のタスク・フロー)が参照するビュー・アクティビティからページ階層を作成します。
バインド・タスク・フローの入力時および終了時にイニシャライザとファイナライザを起動します。イニシャライザは、バインド・タスク・フローの入力時に起動されるカスタム・コードです。ファイナライザは、タスク・フロー・リターン・アクティビティを使用したタスク・フローの終了時、または例外の発生によって起動されるカスタム・コードです。ファイナライザはマネージドBeanのメソッドです。一般的なファイナライザのタスクには、バインド・タスク・フローで取得したすべてのリソースの解放、およびタスク・フローを終了する前のクリーンアップの実行などがあります。
イニシャライザとファイナライザは両方とも、次の例のように、マネージドBeanのメソッドにEL式として指定します。
#{pageFlowScope.modelBean.releaseResources}
バインド・タスク・フローの開始時にイニシャライザのコードを実行するには2つの方法があり、ブラウザの「戻る」ボタンでそのタスク・フローを再開できるかどうかによって次のように異なります。
「戻る」ボタンでの再開が想定されない場合: バインド・タスク・フロー内で(最初に実行する)デフォルト・アクティビティとしてメソッド・コール・アクティビティを指定します。そのメソッド・コール・アクティビティにより、イニシャライザのコードを含むカスタム・メソッドがコールされます。「メソッド・コール・アクティビティの使用」および「ブラウザの「戻る」ボタンおよびレコード間の移動に関する必知事項」を参照してください。
「戻る」ボタンでの再開が可能な場合: バインド・タスク・フローのメタデータのオプションで、イニシャライザ・メソッドを指定します。「タスク・フローの作成」を参照してください。ユーザーがブラウザの「戻る」ボタンでタスク・フローを再開する可能性がある場合、この方法を使用してください。このような場合には、バインド・タスク・フローに指定したデフォルト・アクティビティがコールされずに、イニシャライザ・メソッドで指定されたメソッドがコールされることがあります。
図27-1は、「複雑なタスク・フローの作成について」で説明されている多数のユースケースを実装するタスク・フローの「構造」ウィンドウを示しています。たとえば、ここではエラー処理用のエラー・ページが指定され、ナビゲーション・アイテムのレンダリングにADF Facesのtrain
コンポーネントが使用されるほか、トランザクション管理の一部としてタスク・フローによる変更がコミットまたはロールバックされる2つのタスク・フロー・リターン・アクティビティが指定されます。
図27-1 「構造」ウィンドウのタスク・フロー
タスク・フローを構成または使用する前に、他のOracle ADF機能を理解しておくと役に立つ場合があります。また、タスク・フローで実行できる機能について読むことが必要な場合もあります。次に、関連する他の機能へのリンクを示します。
タスク・フローの実行時に発生したエラーを管理する例外ハンドラを指定できます。エラー処理の詳細は、「エラー処理のカスタマイズ」を参照してください。
タスク・フローのセーブポイントでは、アプリケーション状態を保存できます。アプリケーション状態管理の詳細は、「Fusion Webアプリケーションでの状態管理の使用」を参照してください。
バインド・タスク・フローのセキュリティは、利用するユーザーに必要な権限を定義することによって確保できます。詳細は、「Fusion WebアプリケーションでのADFセキュリティの有効化」を参照してください。
次を実行するには、タスク・フローとともにBusiness Process Execution Language (BPEL)を使用できます。
バインドなしタスク・フローまたはバインド・タスク・フローからBPELプロセスを起動して、関数を実行したり、サービスを使用すること
Webインタフェースとのユーザーの対話をモデル化するために、BPELプロセスからバインド・タスク・フローをコールすること
BPELプロセスと対話するマネージドBeanメソッドまたはWebサービスを起動するには、タスク・フロー・メソッド・コール・アクティビティを使用できます。タスク・フロー・メソッド・コール・アクティビティの詳細は、「メソッド・コール・アクティビティの使用」を参照してください。
タスク・フローを開くカスタム・コードを記述できます。たとえば、「例外ハンドラとしてカスタム・コードを指定する方法」で説明するように、タスク・フローによって例外がスローされたときに起動するカスタム・コードを記述できます。カスタム・コードの記述に使用できるAPIの詳細は、次のドキュメントを参照してください。
Oracle ADF ControllerのJava APIリファレンス
Oracle ADF FacesのJava APIリファレンス
ADFタスク・フローにより、1つ以上のタスク・フロー間でデータ・コントロールを共有できます。データ・コントロールのインスタンスまたは2つの分離された別々のデータ・コントロールを共有できます。これは、コミットまたはロールバック時にトランザクション管理オプションを作成するのに使用できます。データ・コントロールを共有するには、コールされたバインド・タスク・フローでdata-control-scope値をsharedまたはisolatedに設定する必要があります。
タスク・フローが別のタスク・フローをコールすると、タスク・フローがデータ・コントロールのインスタンスを共有するか、同じデータ・コントロールの2つの個別のインスタンスを作成し、タスク・フローが独立した状態を維持できるようにします。タスク・フローがデータ・コントロールを共有するか、独立したデータ・コントロールを保存するために使用する内部オブジェクトは、データ・コントロール・フレームと呼ばれます。
コミットまたはロールバック時にタスク・フロー・トランザクション管理オプションを使用するタスク・フローでは、どのデータ・コントロールに対してトランザクション操作を実行するかを判断するためにデータ・コントロール・フレームが使用されます。data-control-scope
の値がisolated
に設定されている場合、アプリケーションのバインドなしタスク・フローおよびすべてのバインド・タスク・フローに対応するデータ・コントロール・フレームが実行時に作成されます。タスク・フローのdata-control-scope
の値にshared
が指定されている場合は、コール先のタスク・フローでは独自のデータ・コントロール・フレームは作成されず、コール元のデータ・コントロール・フレームが使用されます。これにより、データ・コントロール・フレームに添付されたデータ・コントロール・インスタンスをコール先のタスク・フローと共有できるようになります。または、コール先のタスク・フローでdata-control-scope
の値にisolated
が指定されている場合は、新しいデータ・コントロール・フレームが作成され、バウンド・タスク・フローで使用されるすべてのデータ・コントロールの新しいインスタンスが、新規に作成されたデータ・コントロール・フレームに添付されます。
コール元のタスク・フローとコール先のタスク・フローの間でデータ・コントロールを共有するかどうかを指定するには、コール先のバインド・タスク・フローでshared
またはisolated
のいずれかのdata-control-scope
の値を設定する必要があります。デフォルト値はshared
です。
コール元のバインド・タスク・フローとコール先のバインド・タスク・フローの両方でdata-control-scope
がshared
に設定されている場合は、使用されるデータ・コントロール・フレームはコール元のタスク・フロー用のデータ・コントロール・フレームになります。
図27-2では、バインド・タスク・フローBTF1、BTF2およびBTF3は、これらのバインド・タスク・フローのすべてでdata-control-scope
の値がshared
に設定されているため、アプリケーションのバインドなしタスク・フロー(UTF1)に対して作成されたデータ・コントロール・フレームを使用します。これとは対照的に、バインド・タスク・フローBTF4は、data-control-scope
の値がisolated
に設定されているため、異なるデータ・コントロール・フレームを使用します。後者のバインド・タスク・フローはdata-control-scope
の値がshared
に設定されているため、コールするバインド・タスク・フロー(BTF5)とこのデータ・コントロール・フレームを共有します。
図27-2 データ・コントロール・フレームの共有および独立
コール先のタスク・フローのdata-control-scope
要素に設定した値によって、コール元のタスク・フローとコール先のタスク・フローがフロー・データ・コントロールを共有するかどうかが決定されます。タスク・フローがページまたはページ・フラグメントのどちらでレンダリングされるかなど、その他の要因によってこの動作が変化することはありません。
コール先のタスク・フローのdata-control-scope
要素の値を指定することで、タスク・フロー間でデータ・コントロールを共有できます。
始める前に:
タスク・フロー間でのデータ・コントロールの共有方法を決定するプロパティについて理解しておくと役に立つ場合があります。詳細は、「タスク・フロー間のデータ・コントロールの共有」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能を理解しておくと有効な場合があります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
タスク・フロー間でデータ・コントロールを共有するには:
次の例に示すように、「タスク・フローのコールとデータ・コントロールを共有」リストから「共有」を選択すると、JDeveloperではコール先のタスク・フローのソース・ファイルにあるエントリが記述されます。
<task-flow-definition id="task-flow-definition"> ... <data-control-scope id="__1"> <shared/> </data-control-scope> ... </task-flow-definition>
エンド・ユーザーは、別のブラウザ・ウィンドウまたはブラウザ・タブで同じアプリケーションを複数回開くことがあります。エンド・ユーザーがこの操作を行うと、それぞれのウィンドウまたはタブには独自のビュー・ポートが与えられ、各ウィンドウまたはタブは、同じHTTPセッション内の他のすべてのウィンドウやタブから分離されます。その結果、ウィンドウやタブでデータ・コントロール(つまり、状態)が共有されなくなります。それらのウィンドウまたはタブでは、分離されたデータ・コントロール・スコープで実行されているかのように、新しいデータ・コントロール・フレームで処理が開始されます。このルールの例外は、エンド・ユーザーがセカンダリ・ブラウザ・ウィンドウでモーダル・ダイアログを開いた場合です。この場合、プライマリ・ブラウザ・ウィンドウとセカンダリ・ブラウザ・ウィンドウでサーバー側の状態が同じになり、データ・コントロールも共有されます。モーダル・ダイアログの使用の詳細は、「モーダル・ダイアログ内でのバインド・タスク・フローの実行」を参照してください。ビュー・ポートの詳細は、「ビュー・ポートおよびADFリージョンについて」を参照してください。
データ・コントロールは必要になるまでインスタンス化されません。data-control-scope
にshared
(デフォルト)が指定され、Dというデータ・コントロールを参照する子タスク・フローを親タスク・フローで呼び出すと、次の2つのいずれかの処理が行われます。
Dというデータ・コントロールが親タスク・フローのデータ・コントロール・フレームにすでに存在する場合は、子タスク・フローのDへの参照はスコープ内に存在するDというデータ・コントロールへのものとして解決されます。
Dというデータ・コントロールが親タスク・フローのデータ・コントロール・フレームに存在しない場合は、Oracle ADFによってDという最初のデータ・コントロールがインスタンス化されます。このデータ・コントロールは、Oracle ADFがDataBindings.cpx
ファイルをトップダウン検索する際に特定されます。
ほとんどのアプリケーションでは、データ・コントロールが一意の名前で定義されているため、上のルールが適用される可能性はあまりありません。しかし、アプリケーションのタスク・フローがADFライブラリJARのタスク・フローをコールする場合、そのアプリケーションとADFライブラリJARのタスク・フローで同じ名前のデータ・コントロールが参照されていることがあります。
親タスク・フローで子タスク・フローを呼び出した際に、親タスク・フローのADFライブラリJARに基づくデータ・コントロールDがすでにインスタンス化されている場合は、子タスク・フローではそのデータ・コントロールが使用されます。まだインスタンス化されていない場合は、DataBindings.cpx
ファイルのトップダウン検索中に見つかったこのデータ・コントロール名の最初の参照を使用して、親タスク・フローのデータ・コントロールDがインスタンス化されます。具体的に言うと、このようなタスク・フロー呼出しのシナリオでは、子タスク・フローのデータ・コントロールDはインスタンス化されません。
別のシナリオとして、JSFページのタスク・フローが、JSFページ内の特定のリージョンにレンダリングされるタスク・フローをコールする状況を考慮できます。JSFページのコール元タスク・フローがページのリージョン・レンダラの前にデータ・コントロールDをインスタンス化する場合は、コール元タスク・フローのデータ・コントロールDが使用されます。ただし、リージョンがJSFページ内の最初のデータバインドされたコンポーネントである場合は、コール先のタスク・フローのデータ・コントロールDがインスタンス化されて使用されます。
データ・コントロールの詳細は、「ADFデータ・コントロールを使用したアプリケーション・モジュールの公開」を参照してください。DataBindings.cpx
ファイルの詳細は、「DataBindings.cpxファイルの使用」を参照してください。
ADFバインド・タスク・フローのトランザクションは、トランザクション・タイプを構成することで管理できます。「コントローラ・トランザクションなし」が選択されている場合、開始、コミット、ロールバックなどのトランザクションは実行されません。「常に新規トランザクションを開始」、「常に既存のトランザクションを使用」または「可能であれば既存のトランザクションを使用」のいずれかのオプションが選択されている場合、トランザクションは新規トランザクションを作成するか、既存のトランザクションに参加します。または、トランザクションが進行中の場合はそれに参加し、そうでない場合はバインド・タスク・フローの開始時に新規トランザクションを作成します。
データベースに関連するシステムのコンテキストで、トランザクションとは、1つのグループとしてコミットまたはロールバックできる永続的な作業項目の集まりです。ADFビジネス・コンポーネントなどのテクノロジを使用したADFは、トランザクションが提供するすべての利点を提供します。ただし、トランザクションのサポートは、ADFモデル・レイヤーに留まりません。ADFコントローラ・レイヤーで、バインド・タスク・フローは、必要に応じて基礎となるADFモデル・レイヤーに独自の抽象化の実装を提供します。この実装により、タスク・フローからトランザクションを制御し、トランザクションの境界を宣言的に管理することもできます。
コール先のバインド・タスク・フローで構成可能なトランザクションのオプションは、次の2つのカテゴリにグループ分けできます。
「コントローラ・トランザクションなし」オプションを選択して、コール元のデータバインドされたタスク・フローがトランザクション操作(トランザクションの開始、コミットまたはロールバック)を実行しないようにします。
次のいずれかのADFタスク・フロー・トランザクション管理オプションを使用します。
常に新規トランザクションを開始: トランザクションが進行中かどうかに関係なく、バインド・タスク・フローの開始時に新しいトランザクションが開始されます。この新しいトランザクションは、バインド・タスク・フローを終了した時点で完了します。
常に既存のトランザクションを使用: バインド・タスク・フローは、コール時にすでに進行中の既存のトランザクションに追加されます。
可能であれば既存のトランザクションを使用: バインド・タスク・フローは、コール時に既存のトランザクションがある場合はそれに追加されますが、既存のトランザクションがない場合はそのバインド・タスク・フローの開始時に新しいトランザクションが開始されます。
コール先のバインド・タスク・フローで(選択したtransaction
オプションに基づいて)新しいADFタスク・フロー・トランザクションを開始する場合は、タスク・フローがそのコール元に戻ったときにトランザクションをコミットまたはロールバックするかどうかを指定できます。コミットおよびロールバック・オプションは、コール元のタスク・フローに制御を戻すタスク・フロー・リターン・アクティビティで設定されます。トランザクションを開始する同じタスク・フローでも、トランザクションを解決できる必要があります。
コール先のバインド・タスク・フローには、結果としてコール先のバインド・タスク・フローでトランザクションをコミットまたはロールバックする2つ異なるのタスク・フロー・リターン・アクティビティを指定できます。それぞれのタスク・フロー・リターン・アクティビティから、同じコール元タスク・フローに制御が戻されます。ただし、一方のタスク・フロー・リターン・アクティビティはコミット・オプションを指定し、他方はロールバック・オプションを指定する点が異なります。例27-3に、Summit ADFタスク・フロー・サンプル・アプリケーションからのorders-select-many-items.xml
タスク・フローを示します。トランザクションの処理が正常に終了した場合は、コミット・タスク・フロー・リターン・アクティビティに制御フローが渡され、トランザクションをコミットするオプションが指定されます。トランザクションが完了前に取り消された場合、ロールバック・タスク・フロー・アクティビティによりトランザクションをロールバックするオプションが指定されます。
図27-3 コール先バインド・タスク・フローにおけるタスク・フロー・リターン・アクティビティ
コール先のバインド・タスク・フローの終了時に、コール先のバインド・タスク・フロー内でエンド・ユーザーが行った変更を破棄する場合は、タスク・フロー・リターン・アクティビティでrestore-save-point
オプションを使用します。ADF Controllerによって、バインド・タスク・フローの開始時に作成された、前のADFモデルのセーブポイントまでロールバックされます。restore-save-point
オプションの適用は、既存のトランザクションを結合してバインド・タスク・フローを開始した場合(また、requires-existing-transaction
またはrequires-transaction
のいずれかのオプションが指定された場合)、および開始時にセーブポイントを作成した場合にのみ行われます。
ADFタスク・フロー・トランザクション管理機能を使用して、現在のタスク・フローのデータ・コントロール・フレームに関連付けられているデータ・コントロールをコミットまたはロールバックする場合は、「トランザクションの終了」プロパティをcommit
またはrollback
に設定してタスク・フロー・リターン・アクティビティを使用するか、関連付けられているデータ・コントロール・フレームをプログラムによってコミットする必要があります。または、「コントローラ・トランザクションなし」設定を使用する場合や、1つのデータ・コントロールのみをコミットまたはロールバックする場合は、関連付けられたコミットまたはロールバック操作を「データ・コントロール」パネルで使用するか、関連付けられたコミットまたはロールバックのバインディングをプログラムによって実行します。
ADFタスク・フローのSummitサンプル・アプリケーションで、多数のタスク・フローによりトランザクションが作成されます。たとえば、orders-select-many-items.xml
タスク・フローでは、ADFタスク・フロー・トランザクション管理の「可能であれば既存のトランザクションを使用」オプションが使用されます。このタスク・フローにより、エンド・ユーザーが注文に複数のアイテムを追加したり、エンド・ユーザーが図27-4で示すshowshuttle.jsf
ページを操作したりする場合にこの変更をコミットまたはロールバックできます。
図27-4 タスク・フローのトランザクション
別のタスク・フローによってコールされるバインド・タスク・フローのトランザクション・オプションを定義します。コール先バインド・タスク・フローで、バインド・タスク・フローをコールするタスク・フローに制御を戻すタスク・フロー・リターン・アクティビティを追加します。
始める前に:
トランザクションの概要とその構成方法を理解しておくと役に立つ場合があります。詳細は、「タスク・フローのトランザクションの管理」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
バインド・タスク・フローをトランザクションとして実行可能にするには:
例27-1は、コール先のバインド・タスク・フローのトランザクション・オプションのメタデータを示しています。この<new-transaction>
要素は、コール先のバインド・タスク・フローの起動時に新しいトランザクションが常に開始されることを示しています。<new-transaction>
要素は、「トランザクション」セクションで「常に新規トランザクションを開始」の値を選択する場合に生成されます。
例27-1は、コール先のタスク・フローのタスク・フロー・リターン・アクティビティ上にあるトランザクション・オプションのメタデータも示しています。<commit/>
要素は、既存のトランザクションをデータベースにコミットします。<outcome>
要素は、バインド・タスク・フローの終了時にコール元に戻される結果を、リテラルで指定します(例: success
)。コール元のADFタスク・フローは、この結果に基づいて制御フロー・ルールを定義できます。戻された時点の制御フローの定義の詳細は、「タスク・フロー・リターン・アクティビティの使用」を参照してください。
例27-1 コール先のバインド・タスク・フローのメタデータ
<task-flow-definition id="trans-taskflow-definition"> <default-activity>taskFlowReturn1</default-activity> <transaction> <new-transaction/> </transaction> <task-flow-return id="taskFlowReturn1"> <outcome> <name>success</name> <commit/> </outcome> </task-flow-return> </task-flow-definition>
複数のトランザクション間ではデータ・コントロールを同時に共有できません。タスク・フローがトランザクションの管理を行う場合は、data-control-scope
オプションに選択する値が、バインド・タスク・フローのtransaction
オプション設定に影響を与えることがあります。表27-1で、これらのオプションの対話について説明します。
ADFモデル・レイヤーでは、フレーム内のデータ・コントロールが追加されるトランザクションを管理するためのDataControlFrame
インタフェースが公開されます。DataControlFrame
インタフェースによって、次のようなメソッドが公開されます。
beginTransaction()
commit()
rollback()
同様に、ADF Controllerを使用すると、トランザクションの境界を定めること、タスク・フローの開始時にトランザクションを開始すること、およびタスク・フローの終了時にトランザクションをコミットまたはロールバックすることがタスク・フローで可能になります。そのために、ADFモデル・レイヤーのDataControlFrame
インタフェースで公開されるメソッドが起動されます。
ADFコントローラでは、表27-1にリストするトランザクション・オプションがサポートされます。これらのトランザクション・オプションの動作は、タスク・フローの概要エディタで「タスク・フローのコールとデータ・コントロールを共有」リスト(XML要素: <data-control-scope>
)から「共有」または「独立」が選択されているかどうかで異なります。
表27-1 トランザクション設定の動作
トランザクション設定 | 共有データ・コントロール・スコープ | 独立データ・コントロール・スコープ |
---|---|---|
コントローラ・トランザクションなし |
|
開いているトランザクションなしで新しい |
常に新規トランザクションを開始 XML要素: |
まだトランザクションを開いていない場合は新しいトランザクションを開始し、すでに開いている場合は例外をスローします。 |
常に新しいトランザクションを開始します。 |
常に既存のトランザクションを使用 XML要素: |
まだトランザクションを開いていない場合は、例外がスローされます。 |
無効です。チェックボックスは選択できません。 |
可能であれば既存のトランザクションを使用 XML要素: |
まだトランザクションを開いていない場合は、新しいトランザクションを開始します。 |
常に新しいトランザクションを開始します。 |
次のいくつかの例は、表27-1で説明されているデータ・コントロール・スコープとトランザクション・プロパティに対して様々な値の組合せを構成する際に、バインド・タスク・フローがどのように相互作用するかを示しています。
2つのバインド・タスク・フロー・トランザクションを完全に分離して、別々にコミットまたはロールバックできるようにします。詳細は、「完全に切り離されたトランザクションの作成」を参照してください。
2つのバインド・タスク・フローで、接続リソースを保存するトランザクションが共有されていること、およびコール先のバインド・タスク・フローをコール元のバインド・タスク・フロー・トランザクションに結合できないときにはそのトランザクションを停止することを保証します。詳細は、「コール先のバインド・タスクと既存のトランザクションとの結合の保証」を参照してください。
コール元のバインド・タスク・フロー・トランザクションが存在する場合はそのトランザクションに結合し、存在しない場合は独自のトランザクションを作成するバインド・タスク・フローをコールします。詳細は、「可能であれば既存のトランザクションを使用」を参照してください。
上のリストは、すべての可能な構成オプションではなく一般的なユースケースを示しています。
図27-5は、個別のトランザクションを作成するために構成される複数のタスク・フローを示しています。図27-5の2つのバインド・タスク・フローは組み合されていますが、それらのトランザクションは完全に切り離されています。この実装は、コール・センター・エージェントが顧客の注文を受けてから、注文詳細をアプリケーションに入力する状況で適切です。注文プロセスの終わりに差し掛かったある時点で、顧客は自分の伝えた配達先住所が間違っていたことに気付きます。コール・センター・エージェントを助けるために、注文詳細(注文番号、数量など)のトランザクションとは別のトランザクションで配達先住所の更新とコミットを行うアプリケーションを設計しました。顧客が配達先住所の修正を希望するこのシナリオでは、別のトランザクションで注文詳細が管理されているため、コール・センター・エージェントは、配達先住所を修正するために注文詳細への変更をロールバックする必要はありません。
図27-5では、バインドなしタスク・フローがバインド・タスク・フロー#1をコールします。バインド・タスク・フロー#1は次のように構成されているため、データ・コントロール・フレーム#1が作成されます。
値isolated
を持つdata-control-scope
常に新規トランザクションを開始
バインド・タスク・フロー#1では、2つの異なるビュー・オブジェクトの属性がデータ・コントロール・フィールドとして公開されます(viewObject1.XおよびviewObject2.Y)。XおよびYの初期値は、10および20にそれぞれ設定されています。エンド・ユーザーは、バインド・タスク・フロー#1へのアクセス中にXを10から30へ更新し、Yは変更せずに残します。これにより、トランザクションは変更済、つまり、ダーティとしてマークされます。これは、コミットまたはロールバックが必要なトランザクションへの変更が存在することを意味します。
バインド・タスク・フロー#1は、バインド・タスク・フロー#2をコールします。バインド・タスク・フロー#2は次のように構成されているため、データ・コントロール・フレーム#2が作成されます。
値isolated
を持つdata-control-scope
常に新規トランザクションを開始
データ・コントロール・フレーム#1のトランザクションがまだコミットされていないこと、およびデータ・コントロール・フレーム#2には別個のデータベース接続と別個のタスク・フロー・トランザクションが存在することに注意してください。その結果、バインド・タスク・フロー#2にあるデータ・コントロール・フィールドXおよびYの初期値は、10および20になります。エンド・ユーザーは、バインド・タスク・フロー#2へのアクセス中にYを40に更新し、Xは変更せずに残します。これにより、バインド・タスク・フロー#2のトランザクションがダーティとしてマークされます。次に、バインド・タスク・フロー#2は、Yへの変更をデータベースにコミットするタスク・フロー・リターン・アクティビティをコールし、バインド・タスク・フロー#1に制御を戻します。バインド・タスク・フロー#2ではXの値が変更されなかったため、このデータ・コントロール・フィールドへの変更は発生しません。
バインド・タスク・フロー#1には別個のデータ・コントロール・フレーム(データ・コントロール・フレーム#1)と別個のトランザクションが存在するため、バインド・タスク・フロー#1にあるデータ・コントロール・フィールドXおよびYの値は、30および20のまま残ります(バインド・タスク・フロー#1がバインド・タスク・フロー#2をコールしたときの値)。ここで、バインド・タスク・フロー#1は、タスク・フロー・リターン・アクティビティ(コミットに設定)をコールし、Xの値をデータベースに保存します。バインド・タスク#1のトランザクションではYの値が変更されなかったため、Yの値は変更されません。
バインドなしタスク・フローに戻った後で、XおよびYの値をデータベースからリフレッシュすると、更新された値30および40が返されます。
図27-5 完全に切り離されたトランザクション
図27-6は、2つのバインド・タスク・フローを示しています。この構成では、コール元である1つ目のバインド・タスク・フローのトランザクションに2つ目のバインド・タスク・フローが結合されることが保証されます。このような実装が適切なシナリオの例としては、アプリケーションにおける請求書と個別の請求書明細の作成があげられます。請求書明細を作成するときには、その請求書明細を含む親請求書を作成しないと意味をなしません。請求書と請求書明細の作成用に2つの別個のタスク・フローを構築する場合、請求書明細タスク・フローでは、別個のトランザクションを作成するかわりに、コール元のタスク・フロー(この場合、請求書タスク・フロー)のトランザクションに結合することを明確に規定する必要があります。
図27-6は、バインド・タスク・フロー(バインド・タスク・フロー#1)をコールするバインドなしタスク・フローを構成することで、前述のユースケースにどのように対処できるかを示しています。バインドなしタスク・フローには、独自のデータ・コントロール・フレーム(データ・コントロール・フレーム#1)があります。バインド・タスク・フロー#1では、トランザクションが開始されます。また、次のように構成されているため、データ・コントロール・フレーム(データ・コントロール・フレーム#0)も存在します。
値isolated
を持つdata-control-scope
常に新規トランザクションを開始
バインド・タスク・フロー#1では、2つの異なるビュー・オブジェクトの属性がデータ・コントロール・フィールドとして公開されます(viewObject1.XおよびviewObject2.Y)。XおよびYの初期値は、10および20にそれぞれ設定されています。エンド・ユーザーは、バインド・タスク・フロー#1へのアクセス中にXを10から30へ更新し、Yは変更せずに残します。これにより、データ・コントロール・フレーム#1に関連付けられているタスク・フロー・トランザクションAが変更済、つまり、ダーティとしてマークされます。これは、コミットまたはロールバックが必要なトランザクションへの変更が存在することを意味します。
バインド・タスク・フロー#1は、バインド・タスク・フロー#2をコールします。バインド・タスク・フロー#2は、次のように構成されます。
値shared
を持つdata-control-scope
常に既存のトランザクションを使用
このように構成されているため、新しいデータ・コントロール・フレームは作成されません。バインド・タスク・フロー#2では、バインド・タスク・フロー#1と同じデータ・コントロール・フレーム(データ・コントロール・フレーム#1)が使用されます。バインド・タスク・フロー#1のXに適用された変更は、バインド・タスク・フロー#2に反映されます。バインド・タスク・フロー#2のYに加えた更新は、バインド・タスク・フロー#2で、コミットを指定するタスク・フロー・リターン・アクティビティが実行されて制御が戻った後で、バインド・タスク・フロー#1に反映されます。このYへの更新がバインド・タスク・フロー#1に反映されるのは、バインド・タスク・フロー#2のタスク・フロー・リターン・アクティビティでコミット・オプションが指定されているからではなく、共有データ・コントロール・スコープが指定されていることによります。
タスク・フロー・リターン・アクティビティのコミット・オプションとロールバック・オプションは、トランザクションを開始するバインド・タスク・フローでのみ有効であることに注意してください。バインド・タスク・フロー#1のタスク・フロー・リターン・アクティビティでコミットすると、データベースでは変更が確定されてもバインド・タスク・フロー#2では確定されないのはこの理由によります。
図27-6 結合されたトランザクションの保証
「コール先のバインド・タスクと既存のトランザクションとの結合の保証」では、2つ目のバインド・タスク・フローをコールするバインド・タスク・フローを構成してから、コール元のバインド・タスク・フロー・トランザクションへのコール先のバインド・タスク・フローの結合を保証する方法について説明しました。コール元のバインド・タスク・フローの構成を次の設定に変更する際に、
値isolated
を持つdata-control-scope
コントローラ・トランザクションなし
コール先のバインド・タスク・フローを変更せずに残すと、バインド・タスク・フローの実行が停止され、次のエラー・メッセージが実行時に表示されます。
ADFC-00006: Existing transaction is required when calling task flow ''{0}''
上のシナリオは、コール先のバインド・タスク・フローを次のように構成する利点を示すものです。
値shared
を持つdata-control-scope
可能であれば既存のトランザクションを使用
この後者の構成は、コール元のバインド・タスク・フローでトランザクションが作成されていない場合、コール先のバインド・タスク・フローでトランザクションが作成されることを意味します。
コール先のバインド・タスクでの独自のトランザクション作成を保証する、別の構成オプションは次のとおりです。
値isolated
を持つdata-control-scope
可能であれば既存のトランザクションを使用
これにより、コール元のバインド・タスク・フローで構成したトランザクション・オプションに関係なく、コール先のバインド・タスク・フローで独自のトランザクションが作成されます。その効果は、コール先のバインド・タスク・フローで「常に新規トランザクションを開始」の使用を設定した場合と同じです。
ADFコントローラでは、ADFビジネス・コンポーネント・アプリケーション・モジュールのデータベース接続がアプリケーション内で共有されます。このアプリケーションには、複数のルート・アプリケーション・モジュール(アプリケーション・モジュールごとにデータベース接続が存在する)が存在し、タスク・フローのトランザクション・オプションを組み合せることで接続が共有されます。つまり、アプリケーションの連鎖したタスク・フロー・セット(値shared
のdata-control-scope
を持つ)を、次のトランザクション・オプションと組み合せて構成します。
常に新規トランザクションを開始
常に既存のトランザクションを使用
可能であれば既存のトランザクションを使用
この実装により、各ユーザーが作成するデータベース接続の数を減らせるため、アプリケーションのスケーラビリティが向上します。これは、ADFライブラリJARを通じてアプリケーションにタスク・フローやルート・アプリケーション・モジュールを追加する場合は特に有効です。
連鎖したタスク・フロー・セットとは、アプリケーション内に2つ以上のタスク・フローからなる連鎖が含まれるように、特定のタスク・フローで他のタスク・フローをコールすることです。たとえば、図27-2では、バインドなしタスク・フローUTF1がバインド・タスク・フローBTF1をコールし、そのタスク・フローがバインド・タスク・フローBTF2をコールします。
注意:
ルート・アプリケーション・モジュールでデータベース接続を共有しない場合は、値isolated
のdata-control-scope
が、アプリケーションの連鎖したタスク・フローで使用されるように構成してください。
ただし、同じデータ・モデル・プロジェクト内の個々のルート・アプリケーション・モジュールが異なるデータ・ソースに接続するときは、別の動作を構成する場合があります。たとえば、2つの異なるデータベース・システムからのデータを表示する場合や、同じデータベース内の2つの異なるスキーマへの接続が必要な場合があります。
この最後のシナリオ(ルート・アプリケーション・モジュールが独自のデータベース接続を保持する)を実装するには、アプリケーションのタスク・フローで、transaction
プロパティの値を「コントローラ・トランザクションなし」(デフォルト値)に設定します。これにより、各ルート・アプリケーション・モジュールで、分離された独自のデータベース接続が管理され、ADFコントローラでADFビジネス・コンポーネントのトランザクション動作が管理されなくなります。
ADFタスク・フローにより、バインド・タスク・フローの再開を制御できます。task-flow-reentryの値をreentry-allowed、reentry-not-allowedまたはreentry-outcome-dependentに設定して、ユーザーがナビゲーション・ウィンドウの戻るボタンをクリックしたときのバインド・タスク・フローの再開を許可、禁止、またはバインド・タスク・フローの前回の結果に基づいて許可できます。
エンド・ユーザーが「戻る」ボタンをクリックして、終了後のバインド・タスク・フローに戻るケースを処理するには、バインド・タスク・フローにtask-flow-reentry
オプションを指定できます。このオプションでは、バインド・タスク・フロー内のページを再開できるかどうかを指定します。
再開時には、バインド・タスク・フローの各入力パラメータが、バインド・タスク・フローの最初の開始時のアプリケーションの状態ではなく、現在のアプリケーションの状態によって評価されます。
task-flow-reentry
オプションを指定することで、バインド・タスク・フロー上の再開動作を設定できます。
始める前に:
バインド・タスク・フローでの再開オプションの構成内容を理解しておくと役に立つ場合があります。詳細は、「バインド・タスク・フローの再開」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
再開動作を設定するには:
「再開動作の設定方法」で説明したように、reentry-outcome-dependent
オプションを指定したバインド・タスク・フローに対して、結果依存のオプションを設定できます。
始める前に:
バインド・タスク・フローでの再開オプションの構成内容を理解しておくと役に立つ場合があります。詳細は、「バインド・タスク・フローの再開」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
結果依存オプションを設定するには:
JDeveloperによって、再入力用に指定する構成オプションでタスク・フローのメタデータが更新されます。次の例は、特定の結果に基づき再入力を許可するように構成されたタスク・フローを示しています。
<task-flow-definition id="task-flow-definition1"> <default-activity>view1</default-activity> <task-flow-reentry> <reentry-outcome-dependent/> </task-flow-reentry> <view id="view1"> <page>/page1.jsf</page> </view> <task-flow-return id="taskFlowReturn1"> <outcome> <name>taskFlowReturn1</name> <reentry-allowed/> </outcome> </task-flow-return> </task-flow-definition>
実行時に、再入力を許可するように構成されるタスク・フローに次のイベントが発生します。
ユーザーがコンポーネントを起動すると、タスク・フローが再入力され、またそれにより、HTTP POST
またはGET
メソッドが起動されます。
pageFlowスコープでのタスク・フローのマネージドBean値は、タスク・フローの終了時の値にリストアされません。
「タスク・フローのパラメータの使用」に示すように、再入力されたタスク・フローで入力パラメータが定義されている場合、タスク・フローの再入力時に、それらの値は親タスク・フローの現在の状態を使用して再作成されます。
実行時に、アクティビティの通常のフローに例外が発生することがあります。ADFタスク・フローで、このような例外を処理できます。バインドまたはバインドなしタスク・フローの例外を処理する1つのアクティビティを例外ハンドラとして指定できます。
タスク・フローの実行時には、なんらかの例外処理を必要とする、次のような例外が発生する場合があります。
メソッド・コール・アクティビティからスローされる例外。
タスク・フローのイニシャライザまたはファイナライザとして記述したカスタム・メソッドからスローされる例外。
アクティビティの実行権限がないユーザー。
アクティビティからスローされる例外や、ADF Controllerのその他のタイプのエラーから生じる例外を処理するために、バインド・タスク・フローまたはバインドなしタスク・フローの1つのアクティビティを、例外ハンドラとして指定できます。
タスク・フローが例外をスローすると、制御フローは指定された例外処理アクティビティに渡されます。たとえば、例外処理アクティビティは、エラー・メッセージを表示するビュー・アクティビティである場合があります。また、例外のタイプを評価するEL式に基づいてメソッドに制御フローを渡すルーター・アクティビティである場合もあります。次に例を示します。
#{controllerContext.currentViewPort.exceptionData.class.name == 'oracle.adf.controller.ControllerException'}
制御フローが例外処理アクティビティに渡された後、その例外処理アクティビティからのフローには、標準の制御フロー・ルールが使用されます。たとえば、例外処理アクティビティとしてルーター・アクティビティを指定するとします。実行時、例外に反応して、タスク・フローから例外処理アクティビティ(この場合はルーター・アクティビティ)に制御が渡されます。例外ハンドラとしてルーター・アクティビティを指定した上で、処理の対象となる例外のタイプに基づいてルーターが起動するタスク・フロー制御ケースを定義できます。これにより、例外発生時にエンド・ユーザーのアプリケーション・セッションを適切に管理できます。「制御フローについて」を参照してください。
オプションで、バインド・タスク・フローおよびバインドなしタスク・フローの両方に対する例外ハンドラを指定できます。各タスク・フローは、例外ハンドラを1つのみ保持できます。ただし、別のタスク・フローからコールされるタスク・フローは、コール元の例外ハンドラ以外に別の例外ハンドラを1つ保持できます。さらに、ページ上のリージョンは、ページを含むタスク・フローとは別の例外ハンドラを保持できます。例外ハンドラのアクティビティとしては、ビュー・アクティビティやルーター・アクティビティなど、サポートされる任意のアクティビティ・タイプを使用できます。
バインド・タスク・フローに指定されている例外ハンドラのアクティビティがない場合、コール元のタスク・フローがあり、そこに例外ハンドラのアクティビティがあれば、コール元バインド・タスク・フローの例外ハンドラのアクティビティに制御が渡されます。例外は、例外ハンドラのアクティビティまたは最上位のバインドなしタスク・フローに到達するまで、タスク・フローのスタックに伝播されます。例外ハンドラが見つからない場合、例外はWebコンテナに伝播されます。
バインド・タスク・フローに例外ハンドラ・アクティビティが指定されている場合は、その例外ハンドラ・アクティビティによって例外が処理された後も、アプリケーションが有効なままになるようにしてください。その方法の1つは、例外ハンドラ・アクティビティの後、同じタスク・フローのビュー・アクティビティにリダイレクトすることです。
また、ADFモデルなどの他のモジュールには例外処理機能が実装されています。一部では、アプリケーションでの例外の処理方法を決定できるケースもあります。たとえば、データバインド・メソッド・アクティビティは、ページ定義とEL式を次の形式で有するメソッド・アクティビティです。
#{bindings.
somebindingname
.execute}
ここで、somebindingname
は、ページ定義で設定されたメソッド・バインディングです。
どのタイプのバインディングが例外をスローしても、reportException()
メソッドをコールし、バインディング・コンテナに例外を格納するADFモデルによって取得されます。その後、ページのレンダリング時に、ページにエラーが表示されます。
メソッド・アクティビティがメソッド・バインディングを起動すると、例外により発生したエラーを表示するページがなくなるのは、2つのページ間の移動時に例外が発生するからです。アプリケーションにエラーを認識させるには、Oracle ADFに例外を再スローさせて、例外ハンドラ・アクティビティがあればそこに移動するADFコントローラの例外ハンドラ・メカニズムによってその例外を取得します。
「エラー処理のカスタマイズ」の説明のとおり、特に、reportException()
メソッドなど、メソッドのオーバーライドを決定した場合に注意が必要なのは、このケースではADFコントローラとADFモデルの例外ハンドラの両方がコールされるからです。
ADFリージョンとして実行するバインド・タスク・フローに対して、例外ハンドラ・アクティビティを指定できます。バインド・タスク・フローで発生した例外がタスク・フローの例外ハンドラで処理されない場合、その例外は親ページのタスク・フローのスタックには伝播されません。かわりに、その例外は未処理の例外となります。
始める前に:
タスク・フローで構成可能な例外処理オプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フローでの例外の処理」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
タスク・フローの例外ハンドラとしてアクティビティを指定するには:
あるアクティビティをタスク・フローの例外処理アクティビティとして指定すると、例27-2に示すように、アクティビティのIDを指定する<exception-handler>
要素を使用してタスク・フローのメタデータが更新されます。
例27-2 <exception-handler>要素
<exception-handler>activityID</exception-handler>
起動するアクティビティとしてタスク・フロー・アクティビティを指定するかわりに、タスク・フローによる例外のスロー時に起動するカスタム・コードを記述できます。これには次の処理が必要です。
次のパッケージのクラスExceptionHandler
を拡張するJavaクラスを記述します。
oracle.adf.view.rich.context.ExceptionHandler
Fusion Webアプリケーションの.adf\META-INF
ディレクトリ内のサービスとして記述するJavaクラスを登録します。
次の例は、タスク・フローによってスローされる例外が特定のタイプのエラー・メッセージ(ADF_FACES-30108
)に対応するかどうかをチェックするカスタム・コードを示しています。対応する場合は、カスタム・コードによって、タスク・フローがfaces/SessionExpired.jsf
ページにリダイレクトされます。
package oracle.summit.frmwkext; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.event.PhaseId; import oracle.adf.view.rich.context.ExceptionHandler; public class CustomExceptionHandler extends ExceptionHandler { public CustomExceptionHandler() { super(); } public void handleException(FacesContext facesContext, Throwable throwable, PhaseId phaseId) throws Throwable { String error_message; error_message = throwable.getMessage(); if (error_message != null && error_message.indexOf("ADF_FACES-30108") > -1) { ExternalContext ectx = facesContext.getExternalContext(); ectx.redirect("faces/SessionExpired.jsf"); } else { //Code to execute if the if condition is not met throw Throwable } } }
カスタム・コードの記述に使用できるAPIの詳細は、次のドキュメントを参照してください。
Oracle ADF ControllerのJava APIリファレンス
Oracle ADF FacesのJava APIリファレンス
始める前に:
タスク・フローで構成可能な例外処理オプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フローでの例外の処理」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
例外ハンドラとしてカスタム・コードを指定するには:
トランザクションとして実行可能なバインド・タスク・フローの例外処理アクティビティを指定します。トランザクションとして実行されるバインド・タスク・フローで、タスク・フロー・リターン・アクティビティの「トランザクションの終了」プロパティの値をcommit
に設定した場合は、Fusion Webアプリケーションによってトランザクションのコミットが試行されます。Fusion Webアプリケーションによるトランザクションのコミット試行時に例外が発生した場合、例外処理アクティビティは制御を受け取り、エンド・ユーザーに例外を修正する機会を提供します。例外処理アクティビティ(たとえば、ビュー・アクティビティ)を使用して、例外の修正方法およびトランザクションの再コミット方法に関する情報を含む警告メッセージを、エンド・ユーザーに対して表示できます。トランザクションとしてバインド・タスク・フローを有効化する方法、および「トランザクションの終了」プロパティの値としてcommitを設定する方法の詳細は、「バインド・タスク・フローでトランザクションを有効化する方法」を参照してください。
JSFページの検証エラーの場合、検証エラー・メッセージのページ上の特定のコンポーネントまたはページ全体への添付を標準JSFに依存できます。コンポーネント・レベルのバリデータでは、通常、特定のUIコンポーネントにインラインでエラー・メッセージが添付されます。例外ハンドラのアクティビティに制御を渡す必要はありません。
また、使用するアプリケーションでは、検証ロジックをJSFライフサイクルのモデル更新検証フェーズで実行されるデータ・コントロールに定義する必要があります。このようにすると、最終的なコミットの試行まで待たずに、サーバーへの送信時にデータ・エラーが検出されます。
モデル更新検証フェーズで行われる検証は、通常、モデルの更新後にモデルを検証することを目的としているため、UIコンポーネントに直接アクセスすることはありません。このような検証の多くは、依存するフィールドが同期しているかどうかのチェックなどです。その場合、エラー・メッセージは通常、このロジックがアクセスするページ全体に添付されます。
モデル更新検証フェーズで検出されたエラーをJSFページに添付して、FacesContext.renderResponse()
をコールする必要があります。これによって、このフェーズの後に現在の(送信)ページがレンダリングされ、添付されたエラー・メッセージが表示されます。例外ハンドラのアクティビティに制御を渡す必要はありません。
詳細は、「プログラムによる検証とビジネス・ルールの実装」を参照してください。
ADFタスク・フローでセーブポイントを使用するには、<savepoint-datasource>要素の値をadf-config.xmlファイルで定義する必要があります。この要素を使用して、セーブポイントのデータベース表を含むデータ・ソースのJNDI名を指定します。このデータベース表を作成するには、SQLスクリプトadfc_create_save_point_table.sqlを実行する必要があります。期限切れのセーブポイントを削除するには、SQLスクリプトadfc_cleanup_save_point_table.sqlを実行する必要があります。
「タスク・フローでのセーブポイントの使用」の説明に従ってタスク・フローにセーブポイントを追加し、関連する機能を構成するには、Fusion Webアプリケーションでセーブポイントを使用できることを確認しておく必要があります。これを行うには、adf-config.xml
ファイルの<savepoint-datasource>
要素の値を定義して、セーブポイントのデータベース表を含むデータソースのJNDI名を指定します。また、「セーブポイントのデータベース表に関する必知事項」の説明に従ってSQLスクリプト(adfc_create_save_point_table.sql
)を実行し、セーブポイントを格納するデータベース表を作成する必要があります。Fusion Webアプリケーションでセーブポイントの使用を開始した後は、別のSQLスクリプト(adfc_cleanup_save_point_table.sql
)を使用して、期限切れのセーブポイントを削除できます。
アプリケーションのadf-config.xml
ファイルの<savepoint-datasource>
要素の値を定義して、セーブポイントのデータベース表を含むデータソースのJNDI名を指定します。オプションとして、セーブポイントの有効期限も指定できます。
始める前に:
タスク・フローで構成可能なセーブポイント・オプションの内容を理解しておくと役に立つ場合があります。詳細は、「セーブポイントを使用するためのアプリケーションの構成」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
セーブポイントを使用可能にするようにFusion Webアプリケーションを構成する手順は次のとおりです。
セーブポイントのデータベース表が含まれているデータソースのJNDI名を指定する次の例のようなエントリが、adf-config.xml
ファイル内に生成されます。
<adf-controller-config xmlns="http://xmlns.oracle.com/adf/controller/config"> ... <savepoint-datasource> java:comp/env/jdbc/Connection1DS </savepoint-datasource> <savepoint-expiration> 86399 </savepoint-expiration> </adf-controller-config>
adf-config.xml
ファイルの詳細は、「adf-config.xml」を参照してください。
ORADFCSAVPT
という名前のデータベース表にセーブポイントが格納されます。このデータベース表が存在しない場合、使用するFusion Webアプリケーションにデータベース表の作成に必要な権限があれば、セーブポイントの初回作成時に作成されます。Fusion Webアプリケーションに必要な権限がない場合は、必要な権限を持つユーザーまたは管理者がSQLスクリプトを使用して、ORADFCSAVPT
データベース表を作成および管理できます。それらのSQLスクリプトは次のとおりです。
adfc_cleanup_save_point_table.sql
ORADFCSAVPT
データベース表内の各セーブポイントには、有効期限があります。このスクリプトを使用して、有効期限が切れたセーブポイントを削除します。
adfc_create_save_point_table.sql
このスクリプトを使用して、セーブポイントを格納するORADFCSAVPT
データベース表を作成します。
これらのSQLスクリプトは、JDeveloperインストールの次のディレクトリにあります。
jdev_install
\oracle_common\common\sql
ADFタスク・フローにより、アプリケーションの現在の状態を保存し、セーブポイントを使用して後で使用するために状態を復元できます。これらのセーブポイントを起動するには、バインド・タスク・フローにメソッド・コール・アクティビティを追加する必要があります。
セーブポイントと呼ばれる機能を作成して、特定のインスタンスでFusion Webアプリケーションの状態を取得するタスク・フローを構成できます。これにより、たとえばユーザーがページを完了せずにそのページから移動する場合などに、アプリケーションの状態を保存できるようになります。アプリケーションの状態は、後でリストアできます。
表27-2に、セーブポイントでキャプチャされる情報を示します。
表27-2 保存されるアプリケーションの状態に関する情報
保存される状態情報 | 説明 |
---|---|
ユーザー・インタフェースの状態 |
現在のページのUIの状態。選択中のタブ、選択中のチェック・ボックス、選択中の表の行、表の列のソート順など。 この状態は、エンド・ユーザーがセーブポイントのリストアでブラウザの「戻る」ボタンを選択できない場合を想定しています。 |
マネージドBean |
セッション・スコープやページ・フロー・スコープなど、使用可能な複数のメモリー・スコープに保存される状態の情報。マネージドBeanを保存するには、シリアライズ可能であることが必要です。シリアライズ可能でないページ・フロー・スコープBeanがある場合にセーブポイントを作成しようとすると、実行時例外が発生します。 リクエスト・スコープは、存続期間が単一のHTTPリクエストであり、その存続期間をリクエスト間のアプリケーション状態の格納には使用できないため、サポートされません。 アプリケーション・スコープのマネージドBeanは、フェイルオーバーのシナリオでは受動化されないため、セーブポイントによって保存およびリストアされません。したがって、アプリケーションでは必要なアプリケーション・スコープの状態を常にすべて使用可能にしておく必要があります。 同じ名前を使用するマネージドBeanはアプリケーション内に複数実装できないため、リストア時にセッション・スコープ内の既存のマネージドBeanの名前が競合することはありません。 |
ナビゲーションの状態 |
実行時に、あるタスク・フローが別のタスク・フローをコールするとADFコントローラで保持されるタスク・フロー・コール・スタック。 タスク・フロー・コール・スタックでは、アプリケーション内のエンド・ユーザーの位置、およびそこに至るまでのナビゲーション・パスが追跡されます。また、エンド・ユーザーが開始した永続データ・トランザクションの開始点も識別されます。 |
ADFモデルの状態 |
Fusion Webアプリケーションでは、永続データ・モデルやビジネス・ロジックのサービス・プロバイダがADFモデルで表されます。ADFモデルには、現在のバインド・タスク・フローの開始以降に行われたデータ・モデルの更新がすべて保持されます。保存された状態の存続期間に対する制限はモデル・レイヤーにより決定します。詳細は、「Fusion Webアプリケーションでの状態管理の使用」を参照してください。 |
createSavePoint
メソッドを起動するメソッド・コール・アクティビティをバインド・タスク・フローに追加して、セーブポイントを作成します。後でセーブポイント・リストア・アクティビティを使用して、作成したセーブポイントに関連付けられたアプリケーションの状態とデータをリストアします。
同一ブラウザ・ウィンドウ内の同一セッションで実行されるタスク・フロー・インスタンスにおいて、ユーザーが後で使用するための保存を繰り返し実行する場合、同じセーブポイントを使用できます。タスク・フローのページごとのナビゲーションに従って、ユーザーが後で使用するための保存を実行すると、既存のセーブポイントが新しいセーブポイントで上書きされます。セーブポイントのリストアの詳細は、「セーブポイントのリストア方法」を参照してください。
式ビルダーのADF ControllerオブジェクトのcurrentViewPort
ノードによって公開される、createSavePoint
メソッドを指定できます。または、カスタム・メソッドで指定する属性の値を使用してセーブポイントを更新する、次の例のようなカスタム・メソッドを記述できます。
package viewController; import java.io.Serializable; import oracle.adf.controller.ControllerContext; import oracle.adf.controller.savepoint.SavePointManager; public class SaveForLater implements Serializable { public SaveForLater() { super(); } public String saveTaskFlow() { ControllerContext cc = ControllerContext.getInstance(); if (cc != null) { SavePointManager mgr = cc.getSavePointManager(); if (mgr != null) { String id = mgr.createSavePoint(); System.out.println("Save point is being set " + id); ...
SavePointListener
インタフェースは、セーブポイント・イベントの発生時にクライアントに通知するメソッドを公開します。SavePointListener
インタフェースは次のパッケージに含まれています。
oracle.adf.controller.savepoint
注意:
バインド・タスク・フロー内で作成されたすべてのセーブポイントは、バインド・タスク・フローの終了時に削除されます。
メソッド・コール・アクティビティをタスク・フロー・ダイアグラムにドラッグ・アンド・ドロップして、createSavePoint
メソッドまたは(作成した場合は)カスタム・メソッドを起動するように構成します。
始める前に:
タスク・フローで構成可能なセーブポイント・オプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フローでのセーブポイントの使用」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
次のタスクを完了する必要があります。
jbo.locking.mode
プロパティの値をデフォルト値optimistic
のままにしていることを確認します。これは、Fusion Webアプリケーションでセーブポイントを使用する場合に必要です。値pessimistic
を使用すると、古いセッションはタイムアウトするまでロックされます。ペシミスティック・モードでは、アプリケーションを実行してデータを変更し、データベースに変更をコミットしなかった場合、セーブポイントを作成して後でリストアしようとするとエラーが発生する可能性があります。jbo.locking.mode
プロパティの詳細は、「Fusion Webアプリケーションがオプティミスティック・ロックを使用していることを確認する方法」を参照してください。タスク・フローへのセーブポイントを追加するには:
createSavePoint
メソッドを起動するためのメソッド・コール・アクティビティを構成すると、タスク・フローのソース・ファイルに次の例のようなエントリが生成されます。
<method-call id="methodCall1"> <method id="__3">#{controllerContext.currentViewPort.createSavePoint}</method> </method-call>
セーブポイント・リストア・アクティビティを使用すると、アプリケーション用に以前に保持されたセーブポイントをリストアできます。セーブポイント・リストア・アクティビティでは、最初にcreateSavePoint
メソッドを起動して作成されたセーブポイントを使用して、リストアするセーブポイントが識別されます。
現在保持されているセーブポイントのリストは、createSavePoint
で取得できます。ただし、リストア対象のセーブポイントは自動的に判別されません。ユーザーがリストからセーブポイントを選択するか、アプリケーション開発者がプログラムでセーブポイントを選択する必要があります。その後、セーブポイントのIDが、リストアを実行するセーブ・ポイント・リストア・アクティビティに渡されます。
始める前に:
タスク・フローで構成可能なセーブポイント・オプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フローでのセーブポイントの使用」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
セーブポイント・リストア・アクティビティをバインド・タスク・フローまたはバインドなしタスク・フローに追加するには:
セーブポイントIDを取得するセーブポイント・リストア・アクティビティを追加すると、タスク・フローのソース・ファイルに次の例のようなエントリが生成されます。
<save-point-restore id="savePointRestore1"> <save-point-id id="__4">#{sessionScope.myBean.savepointID}</save-point-id> </save-point-restore>
セーブポイント・リストア・アクティビティの使用時には、アプリケーション状態のリストアの一部として、アプリケーション固有のロジックを起動することが必要な場合があります。ファイナライザ・メソッドを指定する、バインド・タスク・フローの「セーブポイントのリストア・ファイナライザ」プロパティのEL式を記述できます。バインド・タスク・フローの状態がリストアされた後、指定したメソッドがタスク・フローによって起動されます。リストアを続行する前に、アプリケーションの状態が正しいことを確認するために必要なロジックが実行されます。
始める前に:
タスク・フローで構成可能なセーブポイント・オプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フローでのセーブポイントの使用」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
セーブポイント・リストア・ファイナライザを使用するには:
task-flow-definition
)を右クリックし、「プロパティに移動」を選択します。「セーブポイント・リストア・ファイナライザ」プロパティのEL式を記述すると、タスク・フローのソース・ファイルに次の例のようなエントリが生成されます。
<task-flow-definition id="task-flow-definition1"> <save-point-restore-finalizer id="__2">#{sessionScope.MyBean.invokeFinalizer} </save-point-restore-finalizer> </task-flow-definition>
タスク・フローのセーブポイントは、黙示的または明示的に分類できます。明示的セーブポイントをバインド・タスク・フローまたはバインドなしタスク・フローで作成するには、エンド・ユーザーのアクションが必要です。たとえば、エンド・ユーザーがボタンをクリックするとメソッド・コール・アクティビティが起動し、結果としてセーブポイントが作成されます。
暗黙的な保存は、バインド・タスク・フローからのみ実行できます。元のタスク・フローでセーブポイントが作成された時のあらゆるものが含まれます。これは、次の理由でデータが自動的に保存される場合に実行されます。
エンド・ユーザーが非アクティブ状態であったことによりセッションがタイムアウトした場合
エンド・ユーザーがデータを保存せずにログアウトした場合
エンド・ユーザーが唯一のブラウザ・ウィンドウを閉じて、アプリケーションをログアウトした場合
エンド・ユーザーがデータを保存せずに制御フロー・ルール(たとえば、外部URLに移動するためのlink
コンポーネント)を使用して現在のアプリケーションから移動した場合
暗黙的セーブポイントを有効化するには、使用するFusion Webアプリケーションのadf-config.xml
ファイルに要素を追加して、そのバインド・タスク・フローを重要として指定する必要があります。
使用するアプリケーションのadf-config.xml
ファイル、および暗黙的セーブポイントを作成するバインド・タスク・フローを構成します。暗黙的セーブポイントを有効化すると、Fusion Webアプリケーションで(有効化しない場合には行われない)追加の処理を行う必要があるため、パフォーマンス上のコストがかかります。そのため、アプリケーションで暗黙的セーブポイントを明示的に有効化し、適用されるタスク・フローを指定する必要があります。
始める前に:
タスク・フローで構成可能なセーブポイント・オプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フローでのセーブポイントの使用」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
暗黙的セーブポイントを有効化するには:
暗黙的セーブポイントの作成時に複数のウィンドウが開いている場合は、それぞれのブラウザ・ウィンドウに対して異なるセーブポイントが作成されます。これには、ブラウザ・ウィンドウのルート・ビュー・ポート以降のあらゆるものが含まれます。ADF Controllerオブジェクトの下にあるsavePointManager
ノードを使用すると、暗黙的セーブポイントのリストを取得するメソッド・コール・アクティビティのメソッド・プロパティに対するEL式を記述できます。生成されるEL式は、次のようになります。
ControllerContext.savePointManager.listSavePointIds
暗黙的なセーブポイントは、現在のルート・ビュー・ポートの下のビュー・ポートに対するページ・フロー・スタックに重要なタスク・フローが存在する場合にのみ生成されます。次のようなADF Controllerリソースに対するリクエストでは、暗黙的なセーブポイントは生成されません。
タスク・フロー・コール・アクティビティ
タスク・フロー・リターン・アクティビティ
セーブポイント・リストア・アクティビティ
ダイアログ
スタックの最下位のタスク・フローが完了したときか、新しい暗黙的なセーブポイントが生成されたときのいずれか早い方で、暗黙的なセーブポイントは削除されます。
adf-config.xml
ファイルで定義されるアプリケーション・レベルのプロパティ(savepoint-expiration
)は、セーブポイントがタスク・フローで作成されてからセーブポイント・マネージャによって削除されるまでの時間(存続時間)を決定します。デフォルト値は86400秒(24時間)です。
個々のセーブポイントの存続時間を変更するには、次のパッケージに含まれるSavePointManger
のインスタンスに対してsetSavePointTimeToLive
メソッドをコールします。
oracle.adf.controller.savepoint
SavePointManager
のインスタンスは、次のようにして取得できます。
SavePointManager mgr = ControllerContext.getInstance().getSavePointManager();
次の例は、setSavePointTimeToLive
メソッドの構文を示しています。
public void setSavePointTimeToLive(long timeInSeconds) { }
setSavePointTimeToLive
メソッドの引数(timeInSeconds
)に対してゼロ以下の値を指定した場合は、デフォルト値(86400
)が使用されます。
SavePointManger
は、セーブポイントの管理に役立つメソッドを定義します。たとえば、セーブポイントの取得および削除を実行できるgetSavePoint
およびremoveSavePoint
メソッドを定義します。removeSavePoint
メソッドは、セーブポイントが期限切れになると自動的にコールされるものではありません。ORADFCSAVPT
データベース表からセーブポイント(期限切れのセーブポイントを含む)を削除するには、明示的にremoveSavePoint
メソッドをコールする必要があります。代替方法として、Oracle ADFには期限切れのセーブポイントを削除するSQLスクリプト(adfc_cleanup_save_point_table.sql
)が用意されています。詳細は、「セーブポイントのデータベース表に関する必知事項」を参照してください。
セーブポイントを作成するためのメソッドをコールするのと同時に、setSavePointTimeToLive
メソッドをコールすることを検討してください。SavePointManger
の詳細は、Oracle ADF ControllerのJava APIリファレンスを参照してください。
ADFタスク・フローにより、アプリケーションのadf-config.xmlで「最大ルート・ビュー・ポート」プロパティ(<max-root-view-ports>)の値を設定することで、アプリケーションのアクティブなルート・ビュー・ポート数を制限できます。制限を設定すると、サービス拒否攻撃を防ぐことができます。値を-1に設定すると無制限のビュー・ポートを許可できますが、デフォルト値は20です。
アプリケーションのadf-config.xml
ファイルで「最大ルート・ビュー・ポート」プロパティ(<max-root-view-ports>
)の値を指定することで、アプリケーションのアクティブなルート・ビュー・ポート数を最小化できます。これにより、アプリケーションのメモリー・フットプリントが制限され、サービス拒否攻撃を防ぐのに役立つことがあります。
デフォルト値は20
です。最低許容値は5
です。偶発的な誤使用を防ぐために、アプリケーションは5
未満の値を無視し、値5
を適用します。
この機能を無効にし、アプリケーションで無制限のアクティブ・ルート・ビュー・ポート数を許容するには、-1
の値を指定します。
アプリケーションのadf-config.xml
ファイルで<max-root-view-ports>
プロパティの値を指定します。
始める前に:
構成可能な<max-root-view-ports>
オプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フローでのセーブポイントの使用」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
アクティブ・ルート・ビュー・ポート数を最小化する手順:
adf-config.xml
を右クリックし、ポップアップ・メニューから「開く」を選択します。adf-config.xml
ファイルを保存します。アプリケーションのアクティブ・ルート・ビュー・ポートの最大数を指定する次の例のようなエントリが、adf-config.xml
ファイル内に生成されます。
<?xml version="1.0" encoding="UTF-8" ?> <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"> <max-root-view-ports> 19 </max-root-view-ports> </adf-controller-config> </adf-config>
実行時に、指定したルート・ビュー・ポート制限に達すると、新しいルート・ビュー・ポートの作成リクエストは、まず最も長い間使用されていないルート・ビュー・ポートを自動的に失効させます。その後、失効したルート・ビュー・ポートを使用しようとすると、ViewExpiredException
が発生します。
トレインをADFタスクと統合することで、ユーザーにマルチステップ・プロセスの実行を許可できます。トレインおよびtrainButtonBarコンポーネントにより、タスク・フロー・ビュー・アクティビティでトレイン機能をレンダリングできるユーザー・インタフェースを作成できます。この機能により、タスク・フローでルーター・アクティビティおよび制御フロー・ケースを使用して分岐できます。
タスク・フローをトレインとして作成できます。これにより、マルチステップ・プロセスを使用してエンド・ユーザーを移動するユーザー・インタフェースを作成できます。ADF Facesには、エンド・ユーザーに表示されるタスク・フロー・ビュー・アクティビティのトレイン機能をレンダリングするユーザー・インタフェース・コンポーネントが実装されています。これらのコンポーネントは、train
コンポーネントおよびtrainButtonBar
コンポーネントです。図27-8に、Summit ADFタスク・フロー・サンプル・アプリケーションからのedit-customer-task-flow-definition.xml
タスク・フローの実行時ビューを示します。このタスク・フローは、train
およびtrainButtonBar
コンポーネントを使用して、顧客のデータを編集するタスクからエンド・ユーザーを移動します。
図27-8 タスク・フローでのトレイン・コンポーネントおよびトレイン・ボタン・バー・コンポーネント
図27-8のtrain
コンポーネントでは、3つのトレイン・ストップがレンダリングされます。各ストップは、edit-customer-task-flow-definition.xml
タスク・フローのページ・フラグメントに対応しており、ここではエンド・ユーザーが情報の入力と確認を行い、顧客データを編集するタスクを完了できます。図27-8は、エンド・ユーザーが郵便用アドレスを入力するアドレス・トレイン・ストップを示しています。他のストップは次のようになります。
一般情報
コメント
図27-8で示したトレイン・ボタン・バー・コンポーネントはオプションで、トレイン・ストップ間を移動する追加のコントロールが実装されています。このコンポーネントをトレイン・コンポーネントと併用すると、トレイン・ストップ間を複数の方法で移動できます。
JDeveloperによって提供されるダイアログ上で「トレインの作成」チェック・ボックスを選択し、バインド・タスク・フローまたはタスク・フロー・テンプレートを作成した場合は、バインド・タスク・フローおよびタスク・フロー・テンプレートではこれらのトレイン・コンポーネントを利用できます。バインド・タスク・フローまたはタスク・フロー・テンプレートでは1つのトレインのみをレンダリングできます。複数のトレインの使用が必要な場合は、各トレインで別にバインド・タスク・フローまたはタスク・フロー・テンプレートを作成します。
図27-9は、図27-8でトレイン・ストップとして実行時にレンダリングするビュー・アクティビティを表示可能なタスク・フローの設計時ビューからの抜粋を示しています。
ビュー・アクティビティを接続する点線は、ビュー・アクティビティがトレイン・ストップとしてレンダリングされる場合、エンド・ユーザーがビュー間を移動する順序を示します。
図27-9 トレインとしてレンダリングするように構成されるタスク・フロー
図27-10で示したように、トレイン・ストップとして構成されたビュー・アクティビティまたはタスク・フロー・コール・アクティビティを右クリックすると、JDeveloperではアクティビティの場所を変更するコンテキスト・メニューのオプションが表示されます。
図27-10 トレイン・ストップを編集するコンテキスト・メニュー
複数のアクティビティを1つのトレイン・ストップとしてグループ化するか、または子トレイン・ストップをコールする場合は、タスク・フロー・コール・アクティビティをトレイン・ストップとして構成します。たとえば、ルーターやメソッド・コール・アクティビティなどの他のタスク・フロー・アクティビティを、対応するビュー・アクティビティとともにトレイン・ストップの一部とみなす場合があります。初期化のため、メソッド・コール・アクティビティをビュー・アクティビティの前に配置する場合もあります。このようにグループ化することで、トレイン・ストップにアクセスするたびに一連のアクティビティがセットとして実行されるように指定できます。詳細は、「トレイン・ストップ間で実行するタスク・フロー・アクティビティのグループ化」を参照してください。
ルーター・アクティビティや制御フロー・ケースによるブランチ化は、トレインを含むタスク・フロー・ダイアグラムでも、そのトレインからコールされる子バインド・タスク・フローでもサポートされます。
「バインド・タスク・フローでのトレイン・コンポーネントの使用」で説明されているタイプの機能を実装する場合は、その前に、トレイン・コンポーネントを使用するようにバインド・タスク・フローを構成する必要があります。トレイン・コンポーネントを使用するようにバインド・タスク・フローを構成するには、次のリストに示すメソッドのいずれかを使用します。
新しいバインド・タスク・フローまたはタスク・フロー・テンプレートを作成する場合に表示されるダイアログで、「トレインの作成」チェックボックスを選択します。
詳細は、「タスク・フローの作成」または「タスク・フロー・テンプレートの作成」を参照してください。
ダイアグラムで既存のバインド・タスク・フローを右クリックして、「トレイン」→「トレインの作成」の順に選択します。
概要エディタで既存のバインド・タスク・フローを開き、「動作」ナビゲーション・タブをクリックして、「トレイン」チェック・ボックスを選択します。
バインド・タスク・フローを構成し、トレイン・コンポーネントを使用している場合は、トレインでレンダリングが必要なタスク・フロー・アクティビティをバインド・タスク・フローのダイアグラムにドラッグ・アンド・ドロップします。
トレインでレンダリングが必要なタスク・フロー・アクティビティをバインド・タスク・フローのダイアグラムにドラッグ・アンド・ドロップします。
始める前に:
トレインで構成可能な構成オプションを理解しておくと役に立つ場合があります。詳細は、「タスク・フローのトレインとしての作成」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
次のタスクを完了する必要があります。
バインド・タスク・フローでトレインを作成するには:
「タスク・フローのトレインとしての作成」で説明したメソッドのいずれかを使用して、JDeveloperでは、トレインとして有効化するバインド・タスク・フローまたはタスク・フロー・テンプレートのソース・ファイルに<train/>
要素を記述します。
JDeveloperでは、train
コンポーネントおよびtrainButtonBar
コンポーネントを追加するJSFページにエントリを記述します。次の例は、Summit ADFタスク・フロー・サンプル・アプリケーションのGeneralInfo.jsff
ページ・フラグメントにあるコード・スニペットを示しています。どちらのタイプのトレイン・コンポーネントもトレイン・モデル・オブジェクト(trainModel
)のインスタンスにバインドされます。
<af:train value="#{controllerContext.currentViewPort.taskFlowContext.trainModel}" id="t1"/> ... <af:trainButtonBar value="#{controllerContext.currentViewPort.taskFlowContext.trainModel}" id="tbb1"/>
図27-9に示すとおり、バインド・タスク・フローに追加し、トレイン・ストップとして定義する各ビュー・アクティビティ間には点線が表示されます。点線は、トレイン・ストップをバインド・タスク・フローが移動する順序を示します。JDeveloperでは、バインド・タスク・フローにビュー・アクティビティを追加する順番にシーケンスを定義します。このシーケンスは変更できます。詳細は、「トレインでのトレイン・ストップの順次動作の無効化」を参照してください。トレイン・ストップを省略することもできます。詳細は、「トレイン・ストップを省略するトレインの構成」を参照してください。
「トレイン・ストップ間で実行するタスク・フロー・アクティビティのグループ化」で説明する、タスク・フロー・アクティビティを1つのトレイン・ストップにグループ化する方法の代替としては、現在のバインド・タスク・フローから起動するトレインとして別のバインド・タスク・フローを作成する方法があります。このバインド・タスク・フローは、子バインド・タスク・フローと呼ばれます。親バインド・タスク・フローをタスク・フロー・コール・アクティビティを使用して起動するように構成します。この機能を実装するには、次を実行します。
子バインド・タスク・フローをトレインとして作成します。
親バインド・タスク・フロー上のトレイン・ストップから子バインド・タスク・フローに渡って存在する、エンド・ユーザーのアクセスが必要なタスク・フロー・アクティビティを追加します。
子バインド・タスク・フローを起動する親バインド・タスク・フローのトレイン・ストップとしてアクティビティをコールするタスク・フローを指定します。
子バインド・タスク・フローによる実行の終了時に、親バインド・タスク・フローに制御を戻す子バインド・タスク・フローにタスク・フロー・リターン・アクティビティを追加します。
エンド・ユーザーが初めてトレイン・ストップを訪問するのか、または後で戻るのかとは無関係に、子バインド・タスク・フローのタスク・フロー・アクティビティはまとめて実行されます。子バインド・タスク・フローの非ビュー・タスク・フロー・アクティビティは通常、子バインド・タスク・フローのフロー制御にあるビュー・アクティビティより優先されます。別のバインド・タスク・フローの子であるバインド・タスク・フローから子バインド・タスク・フローを起動できます。
トレインとして作成したバインド・タスク・フローにタスク・フロー・アクティビティを追加し、そのアクティビティを起動する親バインド・タスク・フロー上にタスク・フロー・コール・アクティビティを構成します。
始める前に:
トレインから起動する子バインド・タスク・フローに構成可能な構成オプションを理解しておくと役に立つ場合があります。詳細は、「トレイン・ストップの子バインド・タスク・フローの起動」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが役に立つ場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
次のタスクを完了する必要があります。
トレイン・ストップから子バインド・タスク・フローを起動するには:
単一のトレイン・ストップを形成するタスク・フロー・アクティビティをまとめてグループ化できます。たとえば、実行時に「アドレス」としてレンダリングされるトレイン・ストップでは、次のタスク・フロー・アクティビティがまとめてグループ化されます。
defineAddress
ビュー・アクティビティ
createAddress
メソッド・コール・アクティビティ
addressDetails
ビュー・アクティビティ
実行中の「アドレス」トレイン・ストップにユーザーがアクセスするたびに、タスク・フローでは、前述でリストしたタスク・フロー・アクティビティにアクセスできます。defineAddresses
ビュー・アクティビティでは、トレイン・ストップおよび関連付けられたdefineAddresses.jsff
ページ・フラグメントが動的にレンダリングされます。次に、defineAddresses.jsff
ページ・フラグメントでは、createAddress
メソッド・コール・アクティビティを起動するボタンが公開されます。メソッド・コール・アクティビティでは、「アドレス」ページのユーザー入力が検証され、addressDetails
ビュー・アクティビティに制御を(任意に)渡す結果が定義されます。addressDetails
ビュー・アクティビティでは、実行時にエンド・ユーザーが追加アドレスの入力を選択できる「アドレス」情報ページがレンダリングされます。
図27-11 1つのトレイン・ストップにグループ化されるタスク・フロー・アクティビティ
トレインでは、最初の非ビュー・アクティビティから次のビュー・アクティビティに渡るすべてのタスク・フロー・アクティビティがトレインの一部であるとみなされます。ビューおよびタスク・フロー・コール・アクティビティを除いた、トレイン・ストップのすべてのタスク・フロー・アクティビティが、トレイン・ストップとして定義したビューまたはタスク・フロー・コール・アクティビティの後に続くことを確認します。
また、トレイン・ストップ間で実行するタスク・フロー・アクティビティをグループ化できます。図27-12は、制御フローがpage2
に渡される前に、メソッド・コール・アクティビティ(doSomethingBeforePage2
)の起動が可能な構成を示しています。ワイルドカード制御フロー・ルールのcallMethodBeforePage2
では、メソッド・コール・アクティビティのdoSomethingBeforePage2
に制御が渡されます。このメソッド・コール・アクティビティでは、トレインの次のトレイン・ストップ(page2
)に制御を渡す固定結果(continue
)が定義されます。
図27-12 トレイン・ストップ間のメソッド・コール・アクティビティ
デフォルトでは、トレイン・ストップは順次ストップです。つまり、エンド・ユーザーがトレイン・ストップを選択できるのは、トレインで前のトレイン・ストップにアクセスした場合のみです。図27-13は、登録タスク・フローがレンダリングするトレイン・コンポーネントを示しています。エンド・ユーザーは、最初に「アドレス」トレイン・ストップにアクセスするまで、「支払」オプションおよび「確認」トレイン・ストップにアクセスできません。このトレインのすべてのトレイン・ストップは順次ストップです。
図27-13 タスク・フローの順次トレイン・ストップ
トレイン・ストップをレンダリングするビュー・アクティビティを構成して非順次ストップにすることで、このデフォルトの動作を変更(トレイン・ストップを非順次ストップに)できます。
タスク・フロー・ビュー・アクティビティで、実行時に値がfalse
になるsequential
プロパティの値を記述します。
始める前に:
トレインで構成可能な構成オプションを理解しておくと役に立つ場合があります。詳細は、「バインド・タスク・フローでのトレイン・コンポーネントの使用」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
トレイン・ストップの順次動作を無効化するには:
次の例に示すとおり、JDeveloperでは、バインド・タスク・フローのソース・ファイルに対してエントリを記述します。
<view id="paymentOptionDetails">
<page>/account/paymentOptionDetails.jsff</page>
<train-stop id="__1">
<sequential>#{myTrainModel.isSequential}</sequential>
</train-stop>
</view>
図27-14は、sequential
に指定した値がfalse
に評価されるときに対応するランタイム・ビューを示しています。ここで、エンド・ユーザーは、支払オプション・トレイン・ストップをクリックして、支払オプションに直接移動できます。
図27-14 非順次トレイン・ストップを持つトレイン
トレイン・ストップを構成して定義したラベルを表示できます。定義したラベルは、EL式を使用して参照可能な静的値またはリソース・バンドル内の値などになることがあります。ローカライズされた文字列の使用の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「ページの国際化およびローカライズ」を参照してください。
ビュー・アクティビティの「表示名」プロパティの値を構成することで、トレイン・ストップのラベルを変更できます。
始める前に:
トレインで構成可能な構成オプションを理解しておくと役に立つ場合があります。詳細は、「バインド・タスク・フローでのトレイン・コンポーネントの使用」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
トレイン・ストップのラベルを変更するには:
Summit ADFタスク・フロー・サンプル・アプリケーションのedit-customer-task-flow-definition.xml
バインド・タスク・フローから、次の例で示すように、JDeveloperでは、バインド・タスク・フローのソース・ファイルに対してエントリを記述します。
<view id="GeneralInfo"> <page>/customers/GeneralInfo.jsff</page> <train-stop> <display-name>General Information</display-name> <sequential>false</sequential> </train-stop></view>
実行時に、Fusion Webアプリケーションでは、トレイン・ストップのラベルとしてdisplay-name
プロパティに指定した値が表示されます。
トレインを構成して、個々のトレイン・ストップを省略できるようにします。実行時に、Fusion Webアプリケーションでは、省略するように構成したトレイン・ストップが無効化されます。エンド・ユーザーは、トレイン内で次のトレイン・ストップにのみ移動できます。
最初のトレイン・ストップ以外のトレイン・ストップでトレインを実行する必要がある場合は、この機能を実装します。たとえば、トレイン・ストップ3を最初に実行する場合は、トレイン・ストップの1と2を省略するように構成します。「バインド・タスク・フローのデフォルト・アクティビティに関する必知事項」の説明のとおり、デフォルト・アクティビティとしてトレイン・ストップと関連付けられたビュー・アクティビティを定義するよりも、このアプローチを使用します。
実行時に値がtrue
に評価される、ビュー・アクティビティのskip
プロパティの値を記述します。
始める前に:
トレインで構成可能な構成オプションを理解しておくと役に立つ場合があります。詳細は、「バインド・タスク・フローでのトレイン・コンポーネントの使用」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
トレイン・ストップを省略するトレインを構成するには:
次の例に示すとおり、JDeveloperでは、バインド・タスク・フローのソース・ファイルに対してエントリを記述します。
<view id="defineAddresses">
<display-name>Address</display-name>
<page>/account/defineAddresses.jsff</page>
<train-stop>
<display-name>Address</display-name>
<skip>#{myTrainModel.shouldSkip}</skip>
</train-stop>
</view>
図27-15は、skip
に指定した値がtrue
に評価されるときに対応する実行時ビューを示しています。トレインが順次ストップであれば、エンド・ユーザーは、トレイン内の次のトレイン・ストップ(「Payment」オプション)に移動する必要があります。
図27-15 トレイン・ストップの省略が構成されたトレイン
タスク・フロー・アクティビティ、制御フロー、入力パラメータおよびマネージドBeanの反復的なセットがある場合は、再利用するためにADFタスク・フロー・テンプレートを作成できます。新しいバインド・タスク・フローの作成時に、テンプレートは開始ポイントとして機能します。ただし、バインドなしタスク・フローのテンプレートを作成できます。
新しいバインド・タスク・フローの作成時に、タスク・フロー・テンプレートをユーザー自身または他のアプリケーションの開発者のために作成し、出発点として使用できます。バインドなしタスク・フローは、タスク・フロー・テンプレートを使用して作成できません。タスク・フロー・テンプレートから作成したバインド・タスク・フローには、タスク・フロー・テンプレートと同じタスク・フロー・アクティビティ、制御フロー、入力パラメータおよびマネージドBeanがセットで定義されています。たとえば、図27-16に、タスク・フロー・テンプレートから作成されたバインド・タスク・フローを示します。view1
およびview2
ビュー・アクティビティ、さらにこのバインド・タスク・フローのgoToView2
制御フローがタスク・フロー・テンプレートで定義されている一方で、start
およびview3
ビュー・アクティビティがバインド・タスク・フロー自体で定義されています。
図27-16 タスク・フロー・テンプレートで定義されるアクティビティを表示するバインド・タスク・フロー
タスク・フロー・テンプレートのユース・ケースの例では、バインド・タスク・フローの例外ハンドラとしてタスク・フロー・アクティビティを定義しています。タスク・フロー・アクティビティは、例外の発生時にエンド・ユーザーに表示するページに関連付けられたビュー・アクティビティになる場合があります。このビュー・アクティビティは、各バインド・タスク・フローではなく、タスク・フロー・テンプレートで定義し、新しいバインド・タスク・フローの作成時にはそのタスク・フロー・テンプレートを選択します。例外処理の詳細は、「タスク・フローでの例外の処理」を参照してください。
新しいタスク・フロー・テンプレートを、既存のタスク・フロー・テンプレートに基づいて作成できます。また、既存のバインド・タスク・フローをリファクタして新しいタスク・フロー・テンプレートを作成することも可能です。「バインド・タスク・フローの変換方法」を参照してください。
タスク・フロー・テンプレートに基づいてバインド・タスク・フローまたは別のタスク・フロー・テンプレートを作成する場合は、タスク・フロー・テンプレートに対して行う後続の変更がバインド・タスク・フローおよびテンプレートに自動的に伝播されるように指定できます。これを行うには、使用するダイアログで「テンプレートの変更時にタスク・フローを更新」チェック・ボックスを選択し、バインド・タスク・フローまたはテンプレートを作成します。タスク・フロー・テンプレートに対して行う後続の変更(新しいビュー・アクティビティの追加など)はバインド・タスク・フローに伝播されます。子バインド・タスク・フローまたはタスク・フロー・テンプレートの親タスク・フロー・テンプレートは、子の開発中のどの段階でも変更、更新、関連付けの解除が可能です。
子側の作成時に「テンプレートの変更時にタスク・フローを更新」チェック・ボックスを選択した場合は、実行時に、子バインド・タスク・フローまたは子タスク・フロー・テンプレートの内容が親タスク・フロー・テンプレートの内容と結合されます。子タスク・フローまたは子タスク・フロー・テンプレートの作成時に「テンプレートの変更時にタスク・フローを更新」チェック・ボックスを選択した場合でも、競合の発生時には、子タスク・フローおよび子タスク・フロー・テンプレートによって親タスク・フロー・テンプレートがオーバーライドされます。たとえば、「バインド・タスク・フローでのトレイン・コンポーネントの使用」の説明に従って、トレインとして使用する親タスク・フロー・テンプレートを作成し、このタスク・フロー・テンプレートに基づいてバインド・タスク・フローを作成します。その後、親タスク・フロー・テンプレート上のトレイン・コンポーネントを無効にします。親タスク・フロー・テンプレートをオーバーライドした子タスク・フローがトレインとして引き続き実行されます。
表27-3は、親タスク・フロー・テンプレートと子タスク・フローおよび子タスク・フロー・テンプレートの間の競合をADFコントローラによって解決する方法の詳細を説明しています。
表27-3 親テンプレートと子タスク・フロー間の競合の解決
バインド・タスク・フローのメタデータ | 組合せアルゴリズム |
---|---|
デフォルト・アクティビティ |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートをオーバーライドします。 |
トランザクション |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートを(すべての下位要素を含む)メタデータのブロック全体としてオーバーライドします。 |
タスク・フローの再開 |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートを(すべての下位要素を含む)メタデータのブロック全体としてオーバーライドします。 |
制御フロー・ルール |
組合せアルゴリズムは、制御フロー・ルールのレベルではなく、制御フロー・ケースのレベルで発生します。制御フロー・ケースは次のカテゴリに分類されます。
これらの各カテゴリは付加的にマージされます。子バインド・タスク・フローまたはテンプレートが親タスク・フロー・テンプレートをオーバーライドして、4つの各カテゴリ内で完全に一致するようにします。 |
入力パラメータの定義 |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが親タスク・フロー・テンプレートをオーバーライドして、入力パラメータ定義の名前が同一になるようにします。 |
戻り値の定義 |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが親タスク・フロー・テンプレートをオーバーライドして、戻り値の定義の名前が同一になるようにします。 |
アクティビティ |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが親タスク・フロー・テンプレートをオーバーライドして、アクティビティのIDが同一になるようにします。 |
マネージドBean |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが親タスク・フロー・テンプレートをオーバーライドして、マネージドBeanの名前が同一になるようにします。 |
イニシャライザ |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートをオーバーライドします。 |
ファイナライザ |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートをオーバーライドします。 |
クリティカル |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートをオーバーライドします。 |
ページ・フラグメントの使用 |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートをオーバーライドします。 |
例外ハンドラ |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートをオーバーライドします。 |
セキュリティ - 権限 |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートをオーバーライドします。 権限のマップは付加的なものです。子バインド・タスク・フローまたは子タスク・フロー・テンプレートが親タスク・フロー・テンプレートをオーバーライドして、権限マップ操作が同一になるようにします。 |
セキュリティ - 転送保証 |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートをオーバーライドします。 |
トレイン |
子バインド・タスク・フローまたは子タスク・フロー・テンプレートが、親タスク・フロー・テンプレートをオーバーライドします。 |
設計時および実行時の両方の検証で、結果として作成される親/子の拡張階層に同一のタスク・フロー・テンプレートのサイクルが含まれないことを検証してください。
「新規ギャラリ」から「ADFタスク・フロー・テンプレート」を選択して、タスク・フロー・テンプレートを作成します。
始める前に:
構成可能なタスク・フロー・テンプレートのオプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フロー・テンプレートの作成」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
タスク・フロー・テンプレートを作成するには:
次の例に示すように、JDeveloperで新しいタスク・フロー・テンプレートを作成するたびに、XMLファイルが作成されます。「ADFタスク・フロー・テンプレートの作成」ダイアログの「ディレクトリ」フィールドで指定した場所の「アプリケーション」ウィンドウでXMLファイルを検索できます(.../WEB-INF
など)。
タスク・フロー・テンプレートのXMLソース・ファイルの内容は、バインド・タスク・フローの内容に類似しています。<task-flow-template>
タグが含まれているという点のみが異なります。
<?xml version="1.0" encoding="windows-1252" ?> <adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2" id="__1"> <task-flow-template id="task-flow-template"> <default-activity>view1</default-activity> <view id="view1">view1.jsff</view> </task-flow-template> </adfc-config>
バインディングを含むタスク・フロー・テンプレートを使用する場合、そのタスク・フロー・テンプレートを基盤とするタスク・フローのコンポーネントIDを変更する必要があります。これにより、IDが一意であることを確認します。テンプレートから生成されるタスク・フローでは、テンプレートと同じIDが継承されます。そのため、実行時に例外が発生します。詳細は、「ADFページ・テンプレートでのADFデータ・バインディングの使用方法」を参照してください。
Fusion WebアプリケーションにADFセキュリティが構成されている場合は、タスク・フロー・テンプレートおよびそのテンプレートを使用するタスク・フローの両方に権限を付与する必要があります。通常、タスク・フロー・テンプレート上の権限はアプリケーション・ロールのanonymous-role
に付与されるため、実際に重要な権限はタスク・フロー上に付与されますが、必ずそのようになるとは限りません。ADFセキュリティの詳細は、「Fusion WebアプリケーションでのADFセキュリティの有効化」を参照してください。
ページ階層は、Fusion WebアプリケーションのJSFページを整理するのに便利な方法です。ADFコントローラを使用するかXMLMenuModel実装を使用して、ADFタスク・フローのページ階層を作成できます。ユーザーに、リンクのパスのナビゲートによるページの情報へのアクセスを許可できます。
ページ階層の作成は、エンド・ユーザーがアプリケーション内をより簡単に移動できるようにFusion WebアプリケーションのJSFページを構成する方法として便利です。エンド・ユーザーは、リンクのパスに移動してページの情報にアクセスします。図27-17に、サンプルのページ階層を示します。
図27-17 ページ階層
エンド・ユーザーがこの階層内を移動するには、各ページのリンクをクリックして、階層の別のレベルまでドリルダウンまたはドリルアップします。たとえば、Fusion Appのホームページの「Human Resources」をクリックすると、図27-17の「Human Resources」ページの階層が表示されます。「Benefits」タブのリンクをクリックすると、図27-18のページ階層が表示されます。
図27-18 「Benefits」ページ
ユーザーがBenefitsページのリンクをクリックすると、Medical、Dental、Visionのような他のページを表示できます。各ページのブレッドクラムに、階層における現在のページの位置が示されます。ユーザーがブレッドクラム内の各ノードをクリックすると、階層の他のページに移動できます。太字で表示されるタブのラベルが、ブレッドクラムに示されている現在のページのパスと一致します。
生成するすべてのページ階層には、バインド・タスク・フローのビュー・アクティビティによって参照されるページも含めることができます。図27-19は、バインド・タスク・フローによって参照されるビュー・アクティビティをレンダリングするページ階層の実行時ビューを示しています。
図27-19 バインド・タスク・フローを含む実行時のメニュー階層
ADF ControllerをXMLMenuModel
実装とともに使用して、前述のページ階層を作成できます。これを行うと、JDeveloperによって次のものが生成されます。
エンド・ユーザーがメニュー項目を選択すると表示されるビューまたはページを決定する制御フロー・メタデータ
XMLMenuModel
メタデータ・ファイル
デフォルトのナビゲーション・ウィジェット(「前へ」ボタン、「次へ」ボタンなど)
ブレッドクラム
マネージドBeanの構成
ADF Controllerを使用しない場合は、XMLMenuModel
実装を使用してページ階層を作成できます。このページ階層の作成方法は、「メニュー・モデルを使用したページ階層の作成」を参照してください。
バインドなしタスク・フローを作成するか、既存のものを開きます。バインドなしタスク・フローに、ビュー・アクティビティまたはバインド・タスク・フローを追加します。バインドなしタスク・フローに追加したそれぞれのビュー・アクティビティまたはバインド・タスク・フローには、指定されたページ階層に表示されるページへの参照が含まれます。JDeveloperの「ADFメニュー・モデルの作成」ダイアログを使用して、XMLMenuModel
メタデータ・ファイルを生成します。生成したXMLMenuModel
メタデータ・ファイルの項目ノードを構成し、目的のページ階層を作成します。サブメニューを親メニューに接続して階層を完成させます。
図27-20は、ビュー・アクティビティで構成されるページ階層の例を示しています。
最上位のメニュー(Home Page)は、ルートの親ページです。これには、Human Resourcesサブメニューへリンクする1つのタブが含まれています。
JDeveloperでは、Home Pageページは項目ノードとして、またHuman Resourcesページは共有ノードとして表示されます。
Human Resourcesには4つのタブがあり、それぞれがPayroll、Time、LaborおよびBenefitsの各ページへリンクします。
このメニューの中で、Human Resourcesは、子項目ノード(Payroll、Time、Labor)およびBenefitsサブメニューを参照する共有ノード(Benefits)を参照する、グループ・ノードです。
Benefitsは、子項目ノード(Medical、DentalおよびVision)のページを参照するグループ・ノードです。
図27-20 メニュー階層
注意:
1つのメニュー・モデル内にメニュー階層全体を作成することも可能です。ただし、メニュー階層を複数のサブメニューに分割した方が、管理は容易になります。また、メニュー階層をより小さなサブメニュー・モデルに分割することで、各開発組織が個別にその担当メニューを開発できるようになります。その後、各個別メニューを共有ノードで組み合せ、完全なメニュー階層を作成できます。
図27-21は、図27-19に示したページ階層をレンダリングするバインドなしタスク・フローおよびバインド・タスク・フローに対応する、JDeveloperの設計時ビューを示しています。バインドなしタスク・フロー(adfc-config.xml
)には、図27-21の下部に表示されているバインド・タスク・フロー(task-flow-definition.xml)を起動する、ビュー・アクティビティ(view1)およびタスク・フロー・コール・アクティビティ(task-flow-definition
)が含まれています。
図27-21 バインド・タスク・フローを含む設計時のメニュー階層
最終的なページ階層に表示するメニュー(バインドなしタスク・フロー)およびノード(ページ)を定義したら、JDeveloperの「ADFメニュー・モデルの作成」ダイアログを使用して、XMLMenuModel
メタデータ・ファイルを生成します。
始める前に:
構成可能なページ階層のオプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フローを使用したページ階層の作成」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
次のタスクを完了する必要があります。
最終的なページ階層の各メニューに対して、バインドなしタスク・フローを作成します。
たとえば、図27-20のページ階層を実現するには、2つのバインドなしタスク・フロー(Human ResourcesメニューおよびBenefitsメニュー)を作成します。
バインドなしタスク・フローの作成の詳細は、「タスク・フローの作成方法」を参照してください。
ヒント:
作成したバインドなしタスク・フローのファイル名に接頭辞adfc-
を付けて、そのファイルがバインド・タスク・フローではなくバインドなしタスク・フローのソースであることを簡単に識別できるようにします。
各バインドなしタスク・フローに、ページを参照するビュー・アクティビティを追加します。ビュー・アクティビティによって参照されるページは、メニュー内のメニュー・ノードに対応します。
たとえば、Benefitsメニューには1つのグループ・ノード(benefits)および3つの項目ノード(medical、dentalおよびvision)が含まれているため、Benefitsメニューのバインドなしタスク・フローには、図27-22のように4つのビュー・アクティビティを追加する必要があります。
図27-22 タスク・フローのビュー・アクティビティ
共有ノードを使用して他のメニューが含まれているメニューについては、ビュー・アクティビティを追加しないでください。たとえば、図27-20のHuman Resourcesメニューには、共有ノードを使用してBenefitsメニューを参照するBenefitsというタブがあります。Benefitsメニューのバインド・タスク・フローにはBenefitsのビュー・アクティビティがすでに含まれているため、Human Resourcesメニューのバインド・タスク・フローにビュー・アクティビティを追加する必要はありません。
ビュー・アクティビティの詳細は、「ビュー・アクティビティの使用」を参照してください。
注意:
バインド・タスク・フローによって参照されるページがページ階層に含まれる場合は、そのバインド・タスク・フローをコールするバインドなしタスク・フローにタスク・フロー・コール・アクティビティを追加します。
XMLMenuModelメタデータ・ファイルを作成するには:
XMLMenuModel
メタデータ・ファイルのファイル名および保存先ディレクトリを入力します。作成したXMLMenuModel
メタデータ・ファイルを開き、グループ・ノードにする項目ノードをグループ・ノードに変換します。その後、グループ・ノードが1つ以上の項目ノードの親となる階層を作成します。
始める前に:
構成可能なページ階層のオプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フローを使用したページ階層の作成」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
グループ・ノードおよび項目ノードの階層でサブメニューを作成するには:
共有ノード要素を使用して、2つのメニューを1つにリンクできます。たとえば、図27-20のメニュー階層に示した「Human Resources」メニューには、4つのサブメニュー(「Payroll」、「Time」、「Labor」および「Benefits」)が含まれています。Benefitsサブメニューは、それ自体がサブメニュー・エントリを持つメニューです。Human ResourcesメニューのXMLMenuModel
メタデータ・ファイルで、Benefitsサブメニューの項目ノードを共有ノードに変換します。「Benefits」メニューのXMLMenuModel
メタデータ・ファイルを参照する、新しく作成した共有ノードの属性(ref
)のEL式を記述します。
始める前に:
構成可能なページ階層のオプションの内容を理解しておくと役に立つ場合があります。詳細は、「タスク・フローを使用したページ階層の作成」を参照してください。
また、他のタスク・フローの機能を使用して追加可能な機能について読むことが必要な場合もあります。詳細は、「複雑なタスク・フローの追加の機能」を参照してください。
共有ノードを使用してメニュー階層を別の階層に添付するには:
ページ階層を作成すると、様々なファイルで変更が発生します。
adfc-config.xmlの変更内容
新しいバインドなしタスク・フローを作成すると、その新規作成バインドなしタスク・フローのソース・ファイルにadfc-config.xml
ファイルの参照が自動的に追加されます。次の例のadfc-unbounded_tflow.xml
は、新しく作成されたバインドなしタスク・フローのソース・ファイルの名前です。
<?xml version="1.0" encoding="windows-1252" ?> <adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2" id="__1"> <metadata-resource id="__2"> /WEB-INF/adfc-unbounded_tflow.xml </metadata-resource> </adfc-config>
adfc-config.xml
の詳細は、「adfc-config.xml」を参照してください。
実行時、Fusion Webアプリケーションを最初に起動したとき、adfc-config.xml
ファイルがロードされます。adfc-config.xml
ファイルには次が含まれる可能性があります。
バインドなしタスク・フローのADFナビゲーション・メタデータ
バインドなしタスク・フローのADFアクティビティ・メタデータ
ADFアクティビティによって使用されるマネージドBean
XMLMenuModelメタデータ・ファイル
JDeveloperでは、次の例に示すように、バインドなしタスク・フローに追加した各ビュー・アクティビティのノードを使用して、XMLMenuModel
メタデータ・ファイルが生成されます。
<?xml version="1.0" encoding="windows-1252" ?> <menu xmlns="http://myfaces.apache.org/trinidad/menu"> <groupNode id="groupNode_benenfits" label="Benefits" idref="itemNode_medical"> <itemNode id="itemNode_medical" label="label_medical" action="adfMenu_medical" focusViewId="/medical"/> <itemNode id="itemNode_dental" label="label_dental" action="adfMenu_dental" focusViewId="/dental"/> <itemNode id="itemNode_vision" label="label_vision" action="adfMenu_vision" focusViewId="/vision"/> </groupNode> </menu>
バインドなしタスク・フローのダイアグラム
バインドなしタスク・フローのファイルは、ページ階層の移動に使用される制御フロー・ルールおよびマネージドBeanを使用して、JDeveloperによって更新されます。図27-23は、図27-22のバインドなしタスク・フローに対応する更新後のバインドなしタスク・フローをダイアグラマで示しています。
図27-23 更新されたバインドなしタスク・フロー
診断フレームワークにより、Fusion Webアプリケーションで発生するインシデントに関する情報を収集および取得できます。収集された情報を使用して、問題をトラブルシューティングするか、解決のためにOracleサポートに送信できます。ADFコントローラは、バージョン情報、ADFバインディング・コンテナの階層、メタデータなどのインシデントをこのフレームワークにレポートできます。
診断フレームワークは、Fusion Webアプリケーションで発生するインシデントに関する情報を収集および管理します。ADFコントローラでは、このフレームワークにインシデントをレポートできます。この情報を使用して、問題を解決するか、解決のためにOracleサポートに送信できます。インシデントの発生時にADFコントローラが診断フレームワークにレポートする情報の例は、次のとおりです。
バージョン情報
ページ・フロー・スタック・エントリなど、ビュー・ポート階層に関する情報
ADFバインディング・コンテナの階層
バインドなしタスク・フローに寄与するファイルのリストなどのメタデータ情報
さらに、ADFコントローラの実行時内の最新イベントに関する情報を診断フレームワークに送信することもできます。これらのイベントの例には、権限チェック、リージョンのリフレッシュ、アクティビティ間のナビゲーション、Oracle Metadata Services (MDS)フレームワークからのメタデータの取得などがあります。この情報(ADFコントローラの実行時内のイベント)の後半のカテゴリの送信には、QuickTrace、メモリーへのきめ細かいロギングを有効にするためにOracle Fusion Middlewareが提供するメカニズムを有効にする必要があります。ADFコントローラが診断フレームワークに送信する最新のイベントの履歴(数)の指定方法など、QuickTraceの詳細は、QuickTraceの構成と使用に関する項を参照してください。診断フレームワークの使用の詳細は、問題の診断に関する項を参照してください。