Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.1.2) E48099-02 |
|
![]() 前 |
![]() 次 |
この章では、Fusion Webアプリケーションで、ADFリージョンを使用してページまたはページ・フラグメントにADFタスク・フローをレンダリングする方法を説明します。パラメータの指定、ADFリージョンのリフレッシュまたは起動方法、親ページへの移動、動的ADFリージョンの作成などの主要機能についても説明します。
この章には次の項が含まれます:
ADFリージョンを使用して、JSFページまたはページ・フラグメント(.jsff
)にバインド・タスク・フローを実行できます。バインド・タスク・フローをADFリージョンとして実行する主な理由として、再利用があります。特定のアプリケーション機能をバインド・タスク・フローおよびADFリージョンに分離することで、アプリケーション全体で再利用できます。バインド・タスク・フロー内のアプリケーション機能を抽出、構成およびパッケージ化すると、ADFリージョンを使用して他のページに追加できます。ADFリージョンは、必要に応じてどこでも再利用できます(つまり、親ページに依存しません)。さらに、親ページの表示をADFリージョンから分離することも可能で、メニュー、ボタンおよびナビゲーション領域はADFリージョンの表示内容に影響されません。バインド・タスク・フローを変更すると、変更内容はそのタスク・フローを使用するすべてのADFリージョンに適用されます。
ADFリージョンは次で構成されます。
リージョンをレンダリングするページまたはページ・フラグメントに表示されるaf:region
タグ
次のパッケージのRegionModel
を実装するインスタンス・オブジェクト
oracle.adf.view.rich.model
RegionModel
の詳細は、Oracle ADF Faces Java APIリファレンスを参照してください。
次のいずれかを実行します。
ADFリージョンで使用するバインド・タスク・フローを識別する、ページ定義内のタスク・フロー・バインディング(taskFlow
)
ADFリージョンで使用するバインド・タスク・フローのリストを識別する、ページ定義内の複数タスク・フロー・バインディング(multiTaskFlow
)
初めてレンダリングされるときのADFリージョンのコンテンツは、バインド・タスク・フロー内の最初のビュー・アクティビティのものです。バインド・タスク・フローで使用するビュー・アクティビティは、ページではなくページ・フラグメントに関連付ける必要があります。
タスク・フロー・バインディングの入力パラメータまたはコンテキスト・イベントを使用して、ADFリージョンに値を渡すことができます。また、タスク・フロー・バインディングのparametersMap
プロパティを構成すると、そのタスク・フロー・バインディングによってバインド・タスク・フローからADFリージョンへ渡される入力パラメータを指定できます。
ADFリージョンを構成して、リージョンのアクティブ化やリフレッシュのタイミングを指定できます。また、ADFリージョンおよびバインド・タスク・フローを構成することで、バインド・タスク・フロー内でナビゲーション・コントロールを停止させ、ADFリージョンを含むページに渡すこともできます。さらに、リージョンにレンダリングされるバインド・タスク・フローをタスク・フロー・バインディングが実行時に決定する動的リージョン(ADF動的リージョン)を作成し、動的リージョン・リンクを構成すると、実行時にADF動的リージョンにレンダリングされるバインド・タスク・フローをエンド・ユーザーが変更できるようになります。
図23-1は、ADFリージョンをホストするページのページ定義ファイルにあるタスク・フロー・バインディングを使用して、ADFリージョンによるバインド・タスク・フローの参照方法を示しています。
ページ・フラグメントとは、別のJSFページのコンテンツとしてレンダリングするJSFドキュメント(ファイル拡張子は.jsff
)です。ページ・フラグメントに複数のルート・コンポーネントを使用することはできません。ページ・フラグメントの表示パフォーマンスを最適化するために、複数のルート・コンポーネントを1つのルート・コンポーネントにラップすると役立ちます。また、ページ・フラグメントに1つのビジュアル・ルート・コンポーネントおよび(起動するまでエンド・ユーザーに表示されない)popup
コンポーネントのみが含まれる場合も、これらのコンポーネントを1つのルート・コンポーネントにラップすることを検討してください。たとえば、bottomHeight
属性を0
ピクセルに設定して、popup
コンポーネントをpanelStretchLayout
コンポーネントの一番下のファセットに配置します。
ページ・フラグメントに複数のルート・コンポーネントがある場合は、例23-1に示すとおり、Fusion Webアプリケーションによって実行時にメッセージが記録されます(ここで、r1
はページ・フラグメントをレンダリングするADFリージョンを識別します)。
例23-1 複数のルート・コンポーネントがあるページ・フラグメントに関するログ・メッセージ
<RegionRenderer> <encodeAll> The region component with id: r1 has detected a page fragment with multiple root components. Fragments with more than one root component may not display correctly in a region and may have a negative impact on performance. It is recommended that you restructure the page fragment to have a single root component.
ルート・コンポーネント要素を1つのみにすることとは別に、ページ・フラグメントには次のいずれのタグも含めることはできません。
<af:document>
<f:view>
<f:form>
<html>
<head>
<body>
これらのタグはドキュメント内で1回のみ使用可能で、JSFページでのネストはサポートされません。たとえば、ページに実装されたページ・フラグメントに<html>
タグを含められないのは、JSFページにすでに存在するからです。
例23-2には、単純なページ・フラグメントが含まれています。JSFページとは異なり、<f:view>
タグや<f:form>
タグは含まれていません。
例23-2 ページ・フラグメントのソース・コード
<?xml version='1.0' encoding='UTF-8'?> <ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:af="http://xmlns.oracle.com/adf/faces/rich"> <af:button text="button 1" id="b1"/> </ui:composition>
別のJSFページに含めるページ・フラグメントは、リージョン(af:region
タグ)内でネストする必要があります。JSFページにリージョンとして追加されるバインド・タスク・フローはページをコールできないため、ページ・フラグメントをコールする必要があります。
ビュー・ポートは、他のビュー・ポートに関係なく移動できる表示領域です。ブラウザ・ウィンドウとADFリージョンはいずれもビュー・ポートの例です。ルート・ビュー・ポートには、ブラウザ・ウィンドウのメイン・ページが表示されます。ルート・ビュー・ポートには、子ビュー・ポート(ページ上のリージョンなど)を含めることができますが、親ビュー・ポートはありません。
oracle.adf.controller
パッケージのViewPortContext
インタフェースを実装するJavaクラスを使用すると、ビュー・ポートの詳細が表示されます。詳細は、Oracle ADF Controller Java APIリファレンスを参照してください。
図23-2に、ADFタスク・フローのSummitサンプル・アプリケーションのedit-customer-task-flow-definition.xml
タスク・フローからの「一般情報」ページ・フラグメント(GeneralInfo.jsff
)を示します。このタスク・フローはADFリージョンでレンダリングし、認証されたユーザーが提供されたコントロールを使用して移動および編集可能な一連のページ・フラグメントで顧客に関する情報を表示します。このタイプのリージョンの作成に関する詳細は、23.2項「ADFリージョンの作成」を参照してください。
図23-2には、「Welcome」とラベル付けされたshowDetailItemコンポーネントがレンダリングするADF動的リージョンで様々なタスク・フローを起動する(「Register as Employee」および「Register as Customer」とラベル付けされた)リンクも示されています。このタイプのリージョンの作成に関する詳細は、23.9項「ADF動的リージョンの作成」を参照してください。
図23-3に、JDeveloperにおけるedit-customer-task-flow-definition.xml
タスク・フローを示します。エンド・ユーザーに顧客に関する情報を表示する3つのビュー・アクティビティが含まれます。
ADFリージョンにレンダリングされるタスク・フローが他のタスク・フローおよびADF機能とどのように対話するかを理解しておくと役立ちます。次に、関連する他の機能へのリンクを示します。
ADFリージョンに表示されるバインド・タスク・フローおよび関連付けられているページ定義に対して、セキュリティを設定できます。ユーザーが表示する権限がないADFリージョンを含むページをエンド・ユーザーが表示すると、ADFリージョンのコンテンツは表示されません。認証メカニズムはトリガーされません。詳細は、第41章「Fusion WebアプリケーションでのADFセキュリティの有効化」を参照してください。
タスク・フローはマネージドBeanを起動します。マネージドBeanの詳細は、26.4項「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。
コンテキスト・イベントを使用して、バインド・タスク・フローと情報を交換できます。詳細は、40項「コンテキスト・イベントの使用」を参照してください。
ADFリージョンを作成するには、ADFリージョンをレンダリングするページに対するビュー・アクティビティまたはタスク・フロー・コール・アクティビティが少なくとも1つ含まれているバインド・タスク・フローをドラッグ・アンド・ドロップします。これにより、作成されるADFリージョンには、実行時に表示されるコンテンツが必ず含まれます。
バインド・タスク・フローのビュー・アクティビティは、ページ・フラグメント(.jsff
)に関連付ける必要があります。ページ・フラグメントではなくページに関連付けられたバインド・タスク・フローをドラッグ・アンド・ドロップしようとした場合、ADFリージョンを作成するためのポップアップ・メニューは表示されません。ページを使用するバインド・タスク・フローを、ページ・フラグメントを使用するものに変換できます。詳細は、20.6.4項「バインド・タスク・フローの変換方法」を参照してください。
ADFリージョンの作成用に表示されるポップアップ・メニューには、非動的リージョンおよび動的リージョンを作成するためのオプションが表示されます。動的リージョン(ADF動的リージョン)では、レンダリングされるバインド・タスク・フローは実行時に決まります。ADF動的リージョンの作成に関する詳細は、23.9項「ADF動的リージョンの作成」を参照してください。非動的リージョン(ADFリージョン)に表示されるバインド・タスク・フローは、設計時に決まります。
「アプリケーション」ウィンドウからADFリージョンをレンダリングするページにバインド・タスク・フローをドラッグします。
始める前に:
ADFリージョンで使用するバインド・タスク・フローの要件を理解しておくと役に立つ場合があります。詳細は、23.2項「ADFリージョンの作成」を参照してください。
他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、23.1.4項「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。
次のタスクを完了する必要があります。
ページ・フラグメントに関連付けられている1つ以上のビュー・アクティビティ、またはビュー・アクティビティを伴うタスク・フローに対する1つのタスク・フロー・コール・アクティビティを持つ、バインド・タスク・フローを作成します。
詳細は、20.2項「タスク・フローの作成」を参照してください。
ADFリージョンをホストするJSFページを作成します。
詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』のJSFページの作成方法に関する項を参照してください。
ADFリージョンを作成するには:
「アプリケーション」ウィンドウで、ADFリージョンを検索するJSFページをダブルクリックします。
「アプリケーション」ウィンドウで、JSFページにバインド・タスク・フローをドラッグ・アンド・ドロップして、ポップアップ・メニューから「作成」→「リージョン」を選択します。
「タスク・フロー・バインディングの編集」ダイアログが表示される場合は、「OK」をクリックします。
22.3.1項「バインド・タスク・フローに入力パラメータを渡す方法」の説明のとおり、「タスク・フロー・バインディングの編集」ダイアログは、JSFページ上にドロップするバインド・タスク・フローで入力パラメータが定義されている場合に表示されます。
ADFリージョンのパラメータの指定の詳細は、23.3項「ADFリージョンのパラメータの指定」を参照してください。
「構造」ウィンドウで、追加したADFリージョンのノード(af:region)を右クリックし、「プロパティに移動」を選択します。
ADFリージョンの「プロパティ」ウィンドウのデフォルト値が自動的に移入される次のプロパティを、必要に応じて確認または変更します。
ID: ADFリージョンを参照するためにJSFページで使用されるID(たとえば、r1
)。
値: ADFリージョン・モデルへのEL参照(たとえば、#{bindings.region1.regionModel}
)。これはリージョンの動作を記述するリージョン・モデルです。
レンダリング: true
(デフォルト値)の場合、JSFページのレンダリング時にADFリージョンがレンダリングされます。
JSFページに関連付けられているビュー・アクティビティとADFリージョンの間でパラメータをマップする方法は、23.3項「ADFリージョンのパラメータの指定」を参照してください。
ADFリージョンを作成するためにバインド・タスク・フローをJSFページにドロップすると、ページにaf:region
タグが追加されます。af:region
タグは、RegionModel
を実装するオブジェクトを参照します。例23-3に、Summit ADFタスク・フロー・サンプル・アプリケーションのCustomers.jsff
ページ・フラグメントに表示されるaf:region
タグを示します。
例23-3 ADFリージョンの作成用にJSFページに追加されるメタデータ
<af:region value="#{bindings.editcustomertaskflowdefinition1.regionModel}" id="r2"/>
さらに、ADFリージョンをホストするページのページ定義ファイルに、タスク・フロー・バインディングが追加されます。例23-4は、JDeveloperによって追加されるメタデータのサンプルを示しています。このタスク・フロー・バインディングにより、ADFリージョンとバインド・タスク・フローの間のブリッジが提供されます。これにより、ADFリージョンの特定のインスタンスが、関連付けられているバインド・タスク・フローにバインドされ、そのバインド・タスク・フローに固有のあらゆる情報が保持されます。taskFlowId
属性により、バインド・タスク・フローのソース・ファイルのディレクトリ・パスおよび名前が指定されます。
例23-4 タスク・フロー・バインディングの作成用にページ定義に追加されるメタデータ
<taskFlow id="editcustomertaskflowdefinition1" taskFlowId="/WEB-INF/flows/edit-customer-task-flow-definition.xml#edit -customer-task-flow-definition" activation="deferred" xmlns="http://xmlns.oracle.com/adf/controller/binding"/>
バインド・タスク・フローをJSFページにドロップした際、すべてのデータバインディングは保持されます。実行時、ADFリージョンを含むJSFページに対するリクエストは、最初はJSFページに対するその他のリクエストと同様に処理されます。JSFページ定義が実行されると、JSFページにデータがロードされます。親JSFページのコンポーネント・ツリーで<af:region>
タグが検出されると、表示するコンテンツの最初のページ・フラグメントを特定するために、それが実行されます。コンテンツの最初のページ・フラグメントが特定されると、ページ・フラグメントから親JSFページのコンポーネント・ツリーへ、適切なUIコンポーネントが追加されます。
タスク・フロー・バインディングにより、そのタスク・フロー用に、現在のビュー・アクティビティを取得するための次のインタフェースを実装するオブジェクトが作成されます。
oracle.adf.controller.ViewPortContext
タスク・フロー・バインディングのtaskFlowId
属性を使用して、次のいずれかに評価されるEL式を参照することもできます。
java.lang.String
oracle.adf.controller.TaskFlowId
この機能は、ADF動的リージョンを作成する場合に使用します。詳細は、23.9項「ADF動的リージョンの作成」を参照してください。
ADFリージョンによって参照されるタスク・フロー・バインディングに追加することで、バインド・タスク・フロー用に定義した入力パラメータをADFリージョンで使用可能にすることができます。メモリー・スコープ、マネージドBeanまたはADFバインディング・レイヤーで使用可能な入力パラメータを参照するには、EL式を使用します。
入力パラメータの指定は、ADFリージョンに情報を提供する方法の1つです。別の方法として、コンテキスト・イベントの使用があります。ADFリージョンに提供する情報の種類によって、情報提供の方法が決まります。次に例を示します。
入力パラメータ: 必要な情報がタスク・フローの最初にあり、この情報の値を変更するとタスク・フローの再開が必要になる場合に使用します。
たとえば、従業員の表を含むページがあるとします。このページのADFリージョンには、選択した従業員を福利厚生プログラムに登録するためのタスク・フローが含まれています。従業員の選択を変更すると、新たに選択した従業員について最初から福利厚生の登録タスク・フローを再開する必要があります。このユースケースでは、タスク・フローの入力パラメータを使用することが正しい判断です。
入力パラメータは、参照渡しでも値渡しでもかまいません。参照渡しの場合、選択した従業員の情報(姓など)に関するメイン・ページでの更新は、タスク・フローを再開しなくてもADFリージョンで実行されるタスク・フローに自動的に反映されます。
コンテキスト・イベント: タスク・フローが開始されるまでは交換する情報を特定できず、情報を変更してもタスク・フローの再開が必要ない場合に使用します。たとえば、Summit ADFタスク・フロー・サンプル・アプリケーションの「Inventory Control」タブでは、あるリージョンの製品在庫に適したチャートを、別のリージョンでユーザーが選択する製品に応じて表示するために、コンテキスト・イベントを使用します。詳細は、第40章「コンテキスト・イベントの使用」を参照してください。
ADFリージョンの作成およびタスク・フロー・バインディングの追加の詳細は、23.2項「ADFリージョンの作成」を参照してください。バインド・タスク・フローの入力パラメータの定義方法の詳細は、22.3項「バインド・タスク・フローへのパラメータ渡し」を参照してください。
メモリー・スコープ、マネージドBeanまたはADFバインディング・レイヤーで使用可能なパラメータをADFリージョンの入力として指定するには、EL式を使用します。
始める前に:
ADFリージョンのパラメータの指定に関する要件を理解しておくと役に立つ場合があります。詳細は、23.3項「ADFリージョンのパラメータの指定」を参照してください。
他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、23.1.4項「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。
ADFリージョンの入力パラメータを指定するには:
「アプリケーション」ウィンドウで、ADFリージョンを保持するJSFページを右クリックし、「ページ定義に移動」を選択します。
概要エディタの「バインディングと実行可能ファイル」ナビゲーション・タブをクリックし、パラメータを指定するタスク・フロー・バインディングを選択して、「編集」アイコンをクリックします。
「タスク・フロー・バインディングの編集」ダイアログで、ADFリージョンを指定する各入力パラメータの値を取得するEL式を記述します。必須として定義したパラメータに対して、EL式を記述する必要があります。たとえば、次のようなEL式を記述します。
#{pageFlowScope.inputParameter1}
図23-5に、22.3項「バインド・タスク・フローへのパラメータ渡し」の説明のとおり、「入力パラメータ」セクションにバインド・タスクに対して定義された複数の入力パラメータをリストする「タスク・フロー・バインディングの編集」ダイアログを示します。
注意: 「タスク・フロー・バインディングの編集」ダイアログの「入力パラメータ・マップ」フィールドを使用して、マネージドBeanで指定された入力パラメータのリストを参照するEL式を記述できます。この機能の実装に関する詳細は、23.4項「パラメータ・マップを使用したADFリージョンのパラメータの指定」を参照してください。 |
「OK」をクリックします。
例23-5のように、JSFページのページ定義に、taskFlow
要素の子要素であるエントリが書き込まれます。
例23-5 ADFリージョンの入力パラメータを指定するためのメタデータ・エントリ
<taskFlow id="tflow_tf11" taskFlowId="/WEB-INF/tflow_tf1.xml#tflow_tf1" activation="deferred" xmlns="http://xmlns.oracle.com/adf/controller/binding"> <parameters> <parameter id="inputParameter1" value="#{pageFlowScope.inputParameter1}"/> <parameter id="inputParameter2" value="#{pageFlowScope.inputParameter2}"/> </parameters> </taskFlow>
実行時に、EL式の値attribute
で指定された値がADFリージョンに渡されます。
23.3項「ADFリージョンのパラメータの指定」で説明している、タスク・フロー・バインディングにすべての入力パラメータを表示する方法に加えて(もしくはその代替方法として)、タスク・フロー・バインディングのparametersMap
プロパティを使用してマネージドBean上のパラメータ・マップ・オブジェクトを指定できます。参照するパラメータ・マップ・オブジェクトは、次のインタフェースを実装するタイプであることが必要です。
java.util.Map
参照するパラメータ・マップ・オブジェクトにより、ADFリージョンに入力する値にマップされるキーが指定されます。この方法を使用すると、そのページのページ定義内でタスク・フロー・バインディング(taskFlow
)要素または複数タスク・フロー・バインディング(multiTaskFlow
)の下に表示されるparameter
子要素の数が減ります。また、この方法ではADFリージョンに渡される入力パラメータをより柔軟に指定できます。特に、ここでは、ADF動的リージョンの各種タスク・フロー・バインディング間で、入力パラメータの個数としてADF動的リージョンにパラメータを渡す方法が異なる可能性が規定されています。詳細は、23.9項「ADF動的リージョンの作成」を参照してください。
ADFリージョンまたはADF動的リージョンのタスク・フロー・バインディングを構成して、パラメータ・マップを参照できます。また、複数タスク・フロー・バインディングを構成して、パラメータ・マップを参照できます。バインド・タスク・フローに対して定義する入力パラメータの名前と、パラメータ・マップ・オブジェクトで定義するキー名を、必ず一致させてください。
<parameter>
要素および<parametersMap>
要素にある同じid
属性を使用してパラメータを指定する場合は、<parametersMap>
要素が常に優先されます。これは、23.9項「ADF動的リージョンの作成」の説明に従ってADF動的リージョンを作成する場合に、<parametersMap>
要素によってパラメータの静的値のオーバーライドが必要な場合もあるからです。
ADFリージョンに渡すキーと値のペアを定義するパラメータ・マップ・オブジェクトを参照するために、タスク・フロー・バインディングのparametersMap
プロパティを構成します。
始める前に:
ADFリージョンへ入力パラメータを渡す際に使用できる構成オプションについて理解しておくと役に立つ場合があります。詳細は、23.4項「パラメータ・マップを使用したADFリージョンのパラメータの指定」を参照してください。
他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、23.1.4項「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。
次のタスクを完了する必要があります。
java.util.Map
インタフェースを実装するオブジェクトが戻されるように既存のマネージドBeanを編集します。ADFリージョンに渡す値とともにキーと値のペアがオブジェクトによって戻されるように、マネージドBeanを構成します。マネージドBeanの詳細は、26.4項「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。ADFリージョンの入力パラメータを指定するためのパラメータ・マップを作成するには:
「アプリケーション」ウィンドウで、ADFリージョンを保持するJSFページを右クリックし、「ページ定義に移動」を選択します。
概要エディタの「バインディングと実行可能ファイル」ナビゲーション・タブをクリックし、パラメータ・マップを指定するタスク・フロー・バインディングまたは複数のタスク・フロー・バインディングを選択して、「編集」アイコンをクリックします。
選択したタスク・フロー・バインディングのタイプにより、表示されるダイアログが決定されます。
「タスク・フロー・バインディングの編集」ダイアログまたは「複数タスク・フロー・バインディングの編集」ダイアログで、「入力パラメータ・マップ」ドロップダウン・メニューから「式ビルダー」を選択します。
パラメータ・マップを参照するEL式を記述または作成します。たとえば、次のようなEL式を記述します。
#{pageFlowScope.userInfoBean.parameterMap}
「OK」をクリックします。
実行時に、タスク・フロー・バインディングまたは複数タスク・フロー・バインディングによって、そのparametersMap
プロパティに指定したEL式が評価されます。ADFリージョンでレンダリングするバインド・タスク・フローに対して定義された入力パラメータの名前と一致するキーのマネージドBeanからADFリージョンに値が返されます。
例23-6は、2つの値(isLoggedIn
およびprincipalName
)をparameterMap
という名前のパラメータ・マップに書き込む、マネージドBeanのコード・スニペットを示しています。
例23-6 パラメータ・マップを定義するマネージドBean
import java.util.HashMap; import java.util.Map; public class UserInfoBean { private Map<String, Object> parameterMap = new HashMap<String, Object>(); public Map getParameterMap() { parameterMap.put("isLoggedIn", getSecurity().isAuthenticated()); parameterMap.put("principalName", getSecurity().getPrincipalName()); return parameterMap; } }
図23-6は、例23-6に示したパラメータ・マップ・オブジェクト(parameterMap
)を指定して、「式ビルダー」ダイアログを閉じた後の「タスク・フロー・バインディングの編集」ダイアログを示しています。「タスク・フロー・バインディングの編集」ダイアログの「入力パラメータ」フィールドには、このADFリージョン(checkout-flow
)に関連付けらているバインド・タスク・フロー用に定義された入力パラメータが表示されています。タスク・フロー・バインディングにより、例23-6に示したマネージドBeanから、これらのパラメータの値が取得されます。
例23-7は、ADFリージョンをレンダリングするページのページ定義ファイルにあるタスク・フロー・バインディングで表示されるメタデータを示しています。タスク・フロー・バインディングのメタデータは、バインド・タスク・フロー(taskFlowId
属性)およびマネージドBean (parametersMap
)の両方を参照します。
例23-7 パラメータ・マップを指定するタスク・フロー・バインディング
<taskFlow id="checkoutflow1" taskFlowId="/WEB-INF/checkout-flow.xml#checkout-flow" activation="deferred" xmlns="http://xmlns.oracle.com/adf/controller/binding" parametersMap="#{pageFlowScope.userInfoBean.parameterMap}"/>
<parameterMap>
要素は、ページ定義に指定します。
注意:
|
ADFリージョンをリフレッシュするタイミングとタスク・フローを起動するかどうかを構成できます。ADFリージョンによってタスク・フローを起動できるのは、ADFリージョンがアクティブな状態のときのみです。非アクティブ状態のADFリージョンでは、タスク・フローを起動できず、参照先タスク・フローのIDのNULL値が親ページに戻されます。
ADFリージョンを非アクティブからアクティブの状態へ切り替えるタイミングを決定し、ADFリージョンをリフレッシュするタイミングを決定するには、ADFリージョンに関連付けられているタスク・フローのタスク・フロー・バインディングの値を設定します。
始める前に:
ADFリージョンで使用するバインド・タスク・フローの要件を理解しておくと役に立つ場合があります。詳細は、23.5項「ADFリージョンのリフレッシュの構成」を参照してください。
他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、23.1.4項「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。
ADFリージョンのリフレッシュを構成するには:
「アプリケーション」ウィンドウで、ADFリージョンが含まれているページを選択し、右クリックして「ページ定義に移動」を選択します。
ページ定義ファイルで、図23-7に示すように、「実行可能ファイル」セクションのタスク・フロー・バインディングまたは複数タスク・フロー・バインディングを選択します。
ADFリージョンをリフレッシュする適切なオプションを選択します。
タスク・フロー・バインディング・パラメータの値が変更されると、リフレッシュされます。
「プロパティ」ウィンドウで「リフレッシュ」ドロップダウン・リストから「ifNeeded」を選択します。
RefreshCondition
プロパティの値を設定する場合は 「ifNeeded」を選択しないでください。RefreshCondition
プロパティは、Refresh
プロパティに「ifNeeded」を選択する場合は評価されません。
指定する条件がtrue
を戻す場合にリフレッシュされます。
「プロパティ」ウィンドウで、RefreshConditionフィールドにブール値を返すEL式を記述します。EL式がtrue
を返した場合は、ADFリージョンがリフレッシュされます。
「プロパティ」ウィンドウで、次のリストの説明に従って、「アクティブ化」ドロップダウン・リストから値を選択します。
conditional: タスク・フロー・バインディングのactive
プロパティの値として設定されたEL式によってtrue
が戻された場合に、ADFリージョンがアクティブ化されます。
deferred: アプリケーションのビュー・レイヤーでFacelets XHTMLページを使用し、Facelets XHTMLページによってviewID
が初めてリクエストされたときにADFリージョンをアクティブ化する場合は、このオプションを選択します。アプリケーションのビュー・レイヤーでJSPテクノロジが使用されている場合にこのオプションを選択すると、immediate(ADFリージョンがただちにアクティブになる)を選択した場合と同じ結果になりますが、これは、ADFリージョンの親コンポーネントがpopup
またはpanelTabbed
コンポーネントでそのchildCreation
属性がdeferred
に設定されている場合を除きます。後者のシナリオが発生した場合は、親コンポーネント(popup
またはpanelTabbed
)によって動作が決まります。
アプリケーションでFacelets XHTMLページが使用される場合は、このオプションを使用します。ADF FacesでのFaceletsの使用の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「ADF FacesおよびJDeveloperの概要」の章を参照してください。
immediate: ADFリージョンがただちにアクティブになります。これがデフォルト値になります。
ドロップダウン・リストで選択した値により、ADFリージョンが非アクティブからアクティブの状態に切り替わるタイミングが決まります。ADFリージョンがタスク・フローを起動するには、アクティブ状態であることが必要です。
activationプロパティの値として「conditional」を選択した場合は、activeプロパティの実行時にブール値を戻すEL式を記述します。EL式によってtrue
が戻されると、ADFリージョンはタスク・フローを起動します。
ADFリージョンが最初にリフレッシュされるのは、リージョンが配置されている親JSFページが最初に表示されるときです。最初のリフレッシュでは、ADFリージョンのタスク・フロー・バインディングのパラメータ値がすべて親ページから渡されます。パラメータ値は、ADFリージョン内で初期ページ・フラグメントを表示するために使用されます。バインド・タスク・フローがページの初回作成時に使用できない入力パラメータ値に依存している場合は、NullPointerException
オブジェクトなどを使用して、入力パラメータ値がNULLのときにタスク・フローが正しく動作することを確認します。もしくは(または追加的に)、タスク・フロー・バインディングのactive
プロパティを構成して、入力パラメータが使用可能になるまでタスク・フローがアクティブ化されないようにしてください。
ADFリージョンのタスク・フロー・バインディングは、次のタスク・フロー・バインディング属性のいずれかに基づいて再度リフレッシュできます。
taskFlowId
この属性により、バインド・タスク・フローのソース・ファイルのディレクトリ・パスおよび名前が指定されます。この属性値が変更されるとADFリージョンはリフレッシュされます。
Refresh
属性とRefreshCondition
属性の両方が未指定(デフォルト)
タスク・フロー・バインディング属性のRefresh
またはRefreshCondition
のどちらも指定していない場合は、タスク・フロー・バインディングのactive
プロパティの値を構成しないかぎり、ADFリージョンのリフレッシュは親ページの初回表示時に1回のみ行われます。
RefreshCondition="#{EL.expression}"
RefreshCondition
プロパティがtrue
と評価される場合、ADFリージョンは1回のみリフレッシュされます。RefreshCondition
はブール値で評価される必要があります。RefreshCondition
の評価時にEL式でbindings
変数が使用されていると、ADFリージョン内に表示されるページ・フラグメントではなく、親ページのバインディング・コンテナが参照されます。
RefreshCondition
は、バインディング・パラメータの値の変更とは無関係です。タスク・フロー・バインディングのパラメータに変更がなければ、ADFリージョン内では何も変化しません。
Refresh="ifNeeded"
タスク・フロー・バインディングのパラメータ値が変更されると、ADFリージョンはリフレッシュされます。ADFリージョンのタスク・フロー・バインディングにパラメータがない場合、Refresh="ifNeeded"
はRefresh
属性を指定していないのと同じことになります。
動的パラメータ・マップを使用してタスク・フロー・バインディングにパラメータを渡す場合、Refresh="ifNeeded"
はサポートされません。その場合、RefreshCondition="#{EL.Expression}"
を使用する必要があります。
パラメータ・マップを使用したパラメータ値の指定に関する詳細は、23.4項「パラメータ・マップを使用したADFリージョンのパラメータの指定」を参照してください。
Refresh="ifNeeded"
プロパティはRefreshCondition
よりも優先され、Refresh="ifNeeded"
を設定する場合は、RefreshCondition
は評価されません。
RefreshCondition
の評価時にEL式でバインディング変数が使用されていると、ADFリージョン内に表示されるページ・フラグメントではなく、親ページのバインディング・コンテナが参照されます。ADFページ・ライフサイクルのPrepareRender
フェーズ中に式は評価されます。詳細は、第27章「Fusionページ・ライフサイクルの理解」を参照してください。
例23-8に、ADFリージョンが追加されているページのページ定義にあるタスク・フロー・バインディングのサンプルを示します。
例23-8 ADFリージョンのバインディングに指定されたRefreshオプション
<taskFlow id="Department1" taskFlowId="/WEB-INF/Department#Department" xmlns="http://xmlns.oracle.com/adf/controller/binding"> <parameters> <parameter id="DepartmentId" value="#{bindings.DepartmentId.inputValue}" xmlns="http://xmlns.oracle.com/adfm/uimodel"/> </parameters> </taskFlow>
ADFリージョン内のデータ・コントロールをリフレッシュするために、ADFリージョンをリフレッシュする必要はありません。ADFのライフサイクルにおいて、更新対象のイテレータを通知するリフレッシュ・イベントは、ADFリージョンの現在のページのバインディング・コンテナに伝播されます。
ADFリージョンをアクティブ化するタイミングを構成できます。これは、ADFリージョンに含まれるタスク・フローをアクティブ化するタイミングの決定に影響を及ぼします。ADFリージョンのアクティブ化を構成することで、Fusion Webアプリケーションのページのパフォーマンスを最適化できます。たとえば、5つのADFリージョンを含むページが5つのタスク・フローを参照するとします。Fusion Webアプリケーション・ページのロード時に5つのタスク・フローが同時に実行されないようにするには、activation
プロパティを構成してタスク・フロー実行のタイミングを指定します。
ADFリージョンに関連付けられているタスク・フロー・バインディングのactivation
プロパティを構成して、ADFリージョンをアクティブ化するタイミングを指定します。
始める前に:
ADFリージョンのアクティブ化に関する構成オプションを理解しておくと役に立つ場合があります。詳細は、23.6項「ADFリージョンのアクティブ化の構成」を参照してください。
他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、23.1.4項「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。
ADFリージョンのアクティブ化を構成するには:
「アプリケーション」ウィンドウで、ADFリージョンが含まれているページを選択し、右クリックして「ページ定義に移動」を選択します。
ページ定義ファイルで、図23-8に示すように、「実行可能ファイル」セクションのタスク・フロー・バインディングまたは複数タスク・フロー・バインディングを選択します。
「プロパティ」ウィンドウで、次のリストの説明に従って、「アクティブ化」ドロップダウン・リストから値を選択します。
conditional: タスク・フロー・バインディングのactive
プロパティの値として設定されたEL式によってtrue
が戻された場合に、ADFリージョンがアクティブ化されます。
deferred: アプリケーションのビュー・レイヤーでFacelets XHTMLページを使用し、Facelets XHTMLページによってviewID
が初めてリクエストされたときにADFリージョンをアクティブ化する場合は、このオプションを選択します。アプリケーションのビュー・レイヤーでJSPテクノロジが使用されている場合にこのオプションを選択すると、immediate(ADFリージョンがただちにアクティブになる)を選択した場合と同じ結果になります。
アプリケーションでFacelets XHTMLページが使用される場合は、このオプションを使用します。ADF FacesでのFaceletsの使用の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』の「ADF FacesおよびJDeveloperの概要」の章を参照してください。
immediate: ADFリージョンがただちにアクティブになります。これがデフォルト値になります。
ドロップダウン・リストで選択した値により、ADFリージョンが非アクティブからアクティブの状態に切り替わるタイミングが決まります。ADFリージョンがタスク・フローを起動するには、アクティブ状態であることが必要です。
「アクティブ化」ドロップダウン・リストの値としてconditionalを選択した場合は、activeプロパティの実行時にブール値を戻すEL式を記述します。EL式によってtrue
が戻されると、ADFリージョンはタスク・フローを起動します。EL式によってfalse
が戻された場合、ADFリージョンはADFリージョン内でアクティブだったタスク・フローを非アクティブ化します。
ADFリージョンの実行時の動作は、activation
プロパティ用に設定したオプションによって異なります。
図23-9は、ページにADFリージョン(タブ#1、タブ#2、タブ#3)がロードされるとADFリージョン内のすべてのタスク・フローが実行される、デフォルトの動作を示しています。
図23-10は、activationプロパティがdeferred
に設定されており、アプリケーションでFaceletsが使用される場合の例を示しています。タブ#1およびタブ#2のリージョンがアクティブ状態にあるのは、エンド・ユーザーがこれらのリージョンに移動したためです。タブ#3のリージョンは非アクティブです。
図23-11は、activation
プロパティがconditional
に設定されており、active
プロパティが実行時にboolean
値を戻すEL式に設定されている場合の例を示しています。タブ#1のリージョンがアクティブ状態にあるのは、active
プロパティ用に指定されたEL式によってtrue
が戻されるためです。タブ#2およびタブ#3のリージョンが非アクティブ状態にあるのは、active
プロパティ用に指定されたEL式によってfalse
が戻されるためです。
リージョンによってタスク・フローが非アクティブ化される(active
プロパティによって戻される値がtrue
からfalse
に変わる)と、次のイベントが発生します。
アクティブなトランザクションを含むタスク・フローによって、そのトランザクションがロールバックされます。
タスク・フローのトランザクション・オプションの詳細は、24.3項「タスク・フローでのトランザクションの管理」を参照してください。
data-control-scope
の値がisolated
に設定されているデータ・コントロール・フレームがタスク・フローに含まれている場合は、そのデータ・コントロール・フレームおよびデータ・コントロール・フレーム内のすべてのデータ・コントロールが解放されます。
データ・コントロールの詳細は、24.2項「タスク・フロー間のデータ・コントロールの共有」および24.3.3項「データ・コントロールの共有およびトランザクションの管理に関する必知事項」を参照してください。
ADF Controllerにより、リージョンのビュー・ポート・データ構造(pageFlowスコープおよびビュー・スコープを含む)が解放されます。
ビュー・ポートの詳細は、23.1.2項「ビュー・ポートおよびADFリージョンに関する必知事項」を参照してください。メモリー・スコープの詳細は、20.2.4項「タスク・フロー用のメモリー・スコープに関する必知事項」を参照してください。
ADFリージョンで実行されるバインド・タスク・フローでは、その親ビュー・アクティビティのナビゲーションのトリガー、またはそのアプリケーションのルート・ページへの移動が必要な場合があります。そのどちらかのユースケースを実装する場合に構成するプロパティ(parent-outcome
およびroot-outcome
)は、親アクション・アクティビティによって公開されます。
たとえば、従業員情報、および従業員の登録ボタンを含むADFリージョンを表示するページがある場合は、parent-outcome
の値を指定できます。登録ページが完了してADFリージョンに戻ると、従業員情報ページは次の従業員でリフレッシュされます。
注意: ADFリージョンから移動した場合、リージョンの状態は維持されません。 |
ADFリージョンで実行されるバインド・タスクに親アクション・アクティビティを追加して、親のビュー・アクティビティへ移動するように構成します。
始める前に:
ADFリージョンのアクティブ化に関する構成オプションを理解しておくと役に立つ場合があります。詳細は、23.6項「ADFリージョンのアクティブ化の構成」を参照してください。
他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、23.1.4項「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。
ADFリージョンのタスク・フロー外へのナビゲーションをトリガーするには:
「アプリケーション」ウィンドウで、ADFリージョンで実行されるバインド・タスク・フローをダブルクリックします。
「コンポーネント」ウィンドウの「ADFタスク・フロー」ページで、「コンポーネント」パネルから、「アクティビティ」グループにある「親アクション」をバインド・タスク・フローのダイアグラムにドラッグ・アンド・ドロップします。
バインド・タスク・フローのダイアグラムで、親アクション・アクティビティを選択します。
「プロパティ」ウィンドウで、適切なオプションを選択します。
親結果: 親アクション・アクティビティが親ビュー・アクティビティへ移動するように、リテラル値を入力するか結果を戻すEL式を記述します。生成された結果は、ADFリージョンのバインド・タスク・フローではなく、親ビュー・アクティビティのタスク・フローに移動するために使用されます。
親ビュー・アクティビティのタスク・フローには、parent-outcome
に対して指定した値を受け入れる制御フロー・ケースまたはワイルドカード制御フロー・ルールを含める必要があります。
ルート結果: 親アクション・アクティビティがアプリケーションのルート・ページへ移動するように、リテラル値を入力するか結果を戻すEL式を記述します。
たとえば、ADFリージョンからアプリケーションのホーム・ページに移動するには、図23-12の説明のように、「ルート結果」の値を指定します。
注意: 「親結果」および「ルート結果」は相互に排他的です。 |
(オプション) 親アクション・アクティビティがparent-outcome
またはroot-outcome
を適切なキューに追加した後のADFリージョン内のコントロール・フローの結果を指定するリテラル値を、「結果」フィールドに入力します。
outcome
要素の指定が役立つのは、親アクション・アクティビティによって送られるparent-outcome
またはroot-outcome
の結果として親ビュー・アクティビティまたはルート・ページが移動しない場合です。さらに、ADFリージョンにそのまま同じビューが表示されないようにする場合です。outcome
の値を指定しない場合、ADFリージョンのviewId
は変更されません。
実行時に、親アクション・アクティビティ用に設定したプロパティ値に基づいて、バインド・タスク・フローのソース・ファイルにエントリが書き込まれます。例23-9は、親アクション・アクティビティの「親結果」および「結果」プロパティのリテラル値を記述すると生成されるサンプル・エントリを示しています。
例23-9 親結果を使用した親アクション・アクティビティのメタデータ
<parent-action id="parentAction1"> <parent-outcome>parent_outcome</parent-outcome> <outcome id="__2">outcome</outcome> </parent-action>
例23-10は、親アクション・アクティビティの「ルート結果」および「結果」プロパティのリテラル値を記述すると生成されるサンプル・エントリを示しています。
例23-10 ルート結果を使用した親アクション・アクティビティのメタデータ
<parent-action id="parentAction1"> <root-outcome>root_outcome</root-outcome> <outcome id="__2">outcome</outcome> </parent-action>
実行時、親アクション・アクティビティ用に構成したプロパティに応じて、バインド・タスク・フローは親ビュー・アクティビティまたはFusion Webアプリケーションのルート・ページへ移動します。
ページに含まれるADFリージョンの1つで現在使用できる機能の特定をページで行うことが必要な場合もあります。たとえば、queueActionEventInRegion()
メソッドを使用して、現在の状態に基づいてページがADFリージョン内のコントロール・フローを初期化する必要がある場合です。親ページはリージョン機能を使用して、そのページの1つのリージョンについて、現在の状態に基づいて現在の結果を識別します。親ページに対して、リージョン内に結果の可能性があるかどうかが示されます。
次のシナリオに、アプリケーションでの一般的なリージョン機能の使用方法を示します。
ページ内のADFリージョンに、関連付けられているページ・フラグメントが表示されます。
ユーザーが、ADFリージョン内でボタンを選択したり、他のアクションを実行します。
親ページにより、ADFリージョンの結果(リージョン機能)が識別されます。
ADFリージョンの機能に基づいて、親ページのボタンが更新されます。
ADFリージョンの機能を決定するEL式の構文は次のとおりです。
#{bindings.[regionId].regionModel.capabilities['outcome']}
regionId
はページ上のADFリージョン・コンポーネントのIDで、outcome
はADFリージョン内で検証される、可能性がある結果です。
リージョン機能では、EL式を介して、指定されたADFリージョンのregionModel
を使用できることが求められます。EL式では、現在のバインディング・コンテナ以外のバインディング・コンテナにあるバインディングには、アクセスしないでください。リージョン機能は、使用できない場合があります。ADFリージョンがネストされており、現在のバインディング・コンテナ内でregionModel
に到達できない場合などです。これは、ネストされたリージョンのネストされたバインディング・コンテナがまだ存在しないか、すでに解放されている可能性があるためです。
ADFタスク・フローでは、24.3項「タスク・フローのトランザクションの管理」で説明するように、トランザクションを実装するオプションが提供されます。タスク・フローは、24.2項「タスク・フロー間のデータ・コントロールの共有」で説明するように、そのdata-control-scope
プロパティの値を設定することにより、そのデータ・コントロールがコール元のタスク・フローと共有されるか、分離されるかを選択できます。タスク・フローが新規のトランザクションを作成するかどうかは、24.3.3項「データ・コントロールの共有およびトランザクションの管理に関する必知事項」で説明するように、transaction
およびdata-control-scope
プロパティに対して選択する値によって異なります。
たとえば、タスク・フローのデータ・コントロールをコール元タスク・フローと共有する場合、新しいトランザクションは、タスク・フローのtransaction
オプションを「常に新規トランザクションを開始」(new-transaction
)または「可能であれば既存のトランザクションを使用」(requires-transaction
)に構成する場合に作成されます。requires-transaction
オプションでは、トランザクションが存在していない場合にのみ新しいトランザクションが作成されます。作成されたトランザクションは、タスク・フローをレンダリングするADFリージョンと同じ存続期間を持ちます。これにより、タスク・フローがADFリージョンでレンダリングされる場合に意図しない動作を引き起こす場合があります。たとえば、ADFリージョンがリフレッシュされる場合は、ADFリージョンにレンダリングされるタスク・フローが再度開始され、次のイベントが発生します。
ADFリージョンで使用する現在のビュー・ポートを破棄します。
注意: セーブポイントでは、ルート・ビュー・ポートが機能する必要があります。ビュー・ポートの詳細は、23.1.2項「ビュー・ポートおよびADFリージョンについて」を参照してください。セーブポイントの詳細は、24.7項「タスク・フローでのセーブポイントの使用」を参照してください。 |
タスク・フローで使用するデータ・コントロールを解放します。
これにより、ADFリージョンにレンダリングされるタスク・フローのデータ・コントロールが共有されるため、コール元のタスク・フローの親ページで行われた変更が失われる可能性があります。
タスク・フローのタスク・フロー・リターン・アクティビティの「トランザクションの終了」プロパティがこれらのアクションのいずれかを指定する場合は、コミットまたはロールバックを実行します。詳細は、21.7項「タスク・フロー・リターン・アクティビティの使用」を参照してください。
ADFリージョンのリフレッシュによるタスク・フローのトランザクションの不注意による終了を回避する方法は多数あります。これらのすべてのオプションにより、ADFリージョンにレンダリングされるタスク・フローのトランザクションの存続期間とADFリージョンの存続期間の関連付けが解除されます。これらのオプションにより、リージョンの親ページがトランザクションを所有し、リージョンにレンダリングされる前にトランザクションが開始されることが確認されます。アプリケーションに最も適したオプションを選択します。
ADFリージョンにレンダリングされるタスクフローのトランザクション・オプションを「常に既存のトランザクションを使用」(requires-existing-transaction
)に設定します。これにより、トランザクションが存在しない場合に例外がスローされ、ADFリージョンがトランザクションを所有できなくなります。
トランザクションの存続期間が親ページの存続期間に関連付けられるように、コール元のタスク・フローのトランザクション・オプションを「常に新規トランザクションを開始」(new-transaction
)に設定します。
リージョンを含む親ページに移動するアクションでDataControlFrame
インタフェースのbeginTransaction()
メソッドを起動します。
ADFリージョンの親ページに移動する前に、リクエスト・スコープを使用してマネージドBeanからDataControlFrame
インタフェースのbeginTransaction()
メソッドを起動するメソッド・コール・アクティビティを構成します。
次のコードにより、トランザクションが開始されます。
public void beginTransaction() { BindingContext context = BindingContext.getCurrent(); String dcFrameName = context.getCurrentDataControlFrame(); DataControlFrame dcFrame = context.findDataControlFrame(dcFrameName); dcFrame.beginTransaction(new TransactionProperties()); }
タスク・フローのデータ・コントロールをコール元のタスク・フローと共有する場合は、タスク・フローのタスク・フロー・リターン・アクティビティによって公開されるrollback
またはcommit
オプションを使用して、ADFモデル・レイヤーのDataControlFrame
インタフェースによって公開されるメソッドをプログラム的に使用するのではなく、変更をコミットまたはロールバックします。DataControlFrame
インタフェースによって公開されるメソッドを使用することにより、トランザクションは終了し、ADFリージョンにレンダリングされるタスク・フローによって新しいトランザクションを作成できます。
ADF動的リージョンは、実行時に、タスク・フロー・バインディングによってtaskFlowId
属性の値が動的に決定されるADFリージョンです。これにより、Fusion Webアプリケーションは、タスク・フロー・バインディングのtaskFlowId
属性の評価結果に基づいて、ADF動的リージョン内で実行するタスク・フローを決定できます。
図23-13は、エンド・ユーザーがクリックするリンク・コンポーネントに応答して、index.jsf
ページの「Welcome」というラベルのshowDetailItem
コンポーネントに異なる登録タスク・フローがレンダリングされる、Summit ADFタスク・フロー・サンプル・アプリケーションの実行時の例を示しています。たとえば、エンド・ユーザーが「Register as Employee」をクリックした場合は、アプリケーションでADF動的リージョンにemp-reg-task-flow-definition.xml
タスク・フローがレンダリングされます。エンド・ユーザーが「Register as a customer」をクリックした場合は、アプリケーションでADF動的リージョンにedit-customer-task-flow-definition.xml
タスク・フローがレンダリングされます。
実行時、ADF動的リージョンは、レンダリング準備ライフサイクル・フェーズでレンダリングされるタスク・フローを切り替えます。前のタスク・フローのコンポーネントがライフサイクル・フェーズにスムーズに追加されるように、JSFのアプリケーションの起動ライフサイクル・フェーズまではregionModel
から移動しないでください。したがって、コンテキスト・イベントに応答して動的リージョン内のタスク・フローを移動しないことをお薦めします。ライフサイクル・フェーズの詳細は、第27章「Fusionページ・ライフサイクルの理解」を参照し、コンテキスト・イベントの詳細は、第40章「コンテキスト・イベントの使用」を参照してください。
ADF動的リージョンを作成するには、ADF動的リージョンをレンダリングするページへ、バインド・タスク・フローをドラッグ・アンド・ドロップします。バインド・タスク・フローのビュー・アクティビティは、ページ・フラグメント(.jsff
)に関連付ける必要があります。
ページ・フラグメントではなくページに関連付けられたバインド・タスク・フローをドラッグ・アンド・ドロップしようとした場合、ADF動的リージョンを作成するためのポップアップ・メニューは表示されません。ページを使用するバインド・タスク・フローを、ページ・フラグメントを使用するものに変換できます。詳細は、20.6.4項「バインド・タスク・フローの変換方法」を参照してください。
23.10項「ADF動的リージョンへのタスク・フローの追加」で説明するように、ADF動的リージョンの作成後は、ADF動的リージョン・リンクを作成して動的リージョンにバインド・タスク・フローを追加できます。
ADF動的リージョンをレンダリングするページへ、バインド・タスク・フローをドラッグ・アンド・ドロップします。
始める前に:
ADF動的リージョンを作成する際に使用できる構成オプションについて理解しておくと役に立つ場合があります。詳細は、23.9項「ADF動的リージョンの作成」を参照してください。
他のタスク・フロー機能およびADFリージョン機能を使用して追加できる他の機能についても理解しておくと役立ちます。詳細は、23.1.4項「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。
ADF動的リージョンを作成するには:
「アプリケーション」ウィンドウで、ADF動的リージョンを作成するJSFページをダブルクリックします。
「アプリケーション」ウィンドウで、JSFページに最初のバインド・タスク・フローをドラッグ・アンド・ドロップして、ポップアップ・メニューから「作成」→「動的リージョン」を選択します。
「動的リージョンのマネージドBeanの選択」ダイアログで、適切なオプションを選択します。
既存のマネージドBeanにバインド・タスク・フローのIDを格納するには、「マネージドBean」ドロップダウン・リストから既存のマネージドBeanを選択します。
マネージドBeanからADF動的リージョンのタスク・フロー・バインディングへ、バインド・タスク・フローのID値が渡されます。選択するマネージドBeanが別のADF動的リージョンで使用されていないことを確認します。
ページにマネージドBeanがない場合は、「マネージドBean」ドロップダウン・リストの横にある「追加」アイコンをクリックして、新たに作成します。次の手順で、表示されるダイアログに値を入力します。
Bean名: 新しいマネージドBeanの名前を入力します。たとえば、DynamicRegionBean
と入力します。
クラス名: 新しいマネージドBeanクラスの名前を入力します。
パッケージ: マネージドBeanを含むパッケージの名前を入力するか、参照して特定します。
拡張対象: マネージドBeanで拡張するJavaクラスの名前を入力します。デフォルト値はjava.lang.Object
です。
スコープ: このフィールドは読取り専用であり、値はbackingBean
に設定されています。マネージドBeanのメモリー・スコープの詳細は、20.2.4項「タスク・フロー用のメモリー・スコープに関する必知事項」を参照してください。
「OK」をクリックして、マネージドBeanを構成するダイアログを閉じます。
「タスク・フロー・バインディングの編集」ダイアログで適切なオプションを選択します。
ADF動的リージョンの入力パラメータまたは入力パラメータ・マップを指定しない場合は、「OK」をクリックします。
ADF動的リージョンの入力パラメータを指定します。
詳細は、23.3項「ADFリージョンのパラメータの指定」を参照してください。
図23-14は、マネージドBeanの構成後に表示される「タスク・フロー・バインディングの編集」ダイアログを示しています。
注意: 「タスク・フロー・バインディングの編集」ダイアログの「入力パラメータ・マップ」フィールドを使用して、マネージドBeanで指定された入力パラメータのリストを参照するEL式を記述できます。この機能の実装に関する詳細は、23.4項「パラメータ・マップを使用したADFリージョンのパラメータの指定」を参照してください。 |
「OK」をクリックします。
ADF動的リージョンを作成するためにバインド・タスク・フローをJSFページにドロップすると、ページにaf:region
タグが追加されます。af:region
タグにはタスク・フロー・バインディングへの参照が含まれています。例23-11に、Summit ADFタスク・フロー・サンプル・アプリケーションのindex.jsf
ページにADF動的リージョンをレンダリングするaf:region
タグを示します。
例23-11 ADF動的リージョンの作成用にJSFページに追加されるメタデータ
<af:region value="#{bindings.dynamicRegion1.regionModel}" id="r4" rendered="#{WelcomePageBean.isRegistration}"/>
さらに、ADF動的リージョンをホストするページのページ定義ファイルに、タスク・フロー・バインディングが追加されます。例23-12は、JDeveloperによって追加されるメタデータのサンプルを示しています。このタスク・フロー・バインディングにより、ADF動的リージョンとバインド・タスク・フローの間のブリッジが提供されます。ADF動的リージョンがバインド・タスク・フローにバインドされ、そのバインド・タスク・フローに固有のあらゆる情報が保持されます。
例23-12 タスク・フロー・バインディングの作成用にページ定義に追加されるメタデータ
<taskFlow id="dynamicRegion1" taskFlowId="${WelcomePageBean.dynamicTaskFlowId}" activation="deferred" xmlns="http://xmlns.oracle.com/adf/controller/binding"/>
タスク・フロー・バインディング・メタデータのtaskFlowId
属性により、ADF動的リージョンに関連付けられるバインド・タスク・フローを実行時に決定するマネージドBeanが指定されます。JDeveloperにより、このマネージドBeanが作成されるか、このデータを格納するために既存のマネージドBeanが変更されます。例23-13は、JDeveloperによってマネージドBeanに書き込まれるコードの抜粋を示しています。
例23-13 ADF動的リージョンのバインド・タスク・フローを取得するためのマネージドBeanエントリ
import oracle.adf.controller.TaskFlowId; ... private String taskFlowId = "/directoryPath/toTaskFlow"; ... public TaskFlowId getDynamicTaskFlowId() { return TaskFlowId.parse(taskFlowId); } ...
実行時には、ADF動的リージョン内に表示されるバインド・タスク・フローのID (taskFlowId
)が、マネージドBeanに格納されます。マネージドBeanは、様々なバインド・タスク・フローをADF動的リージョンのタスク・フロー・バインディングに切り替えます。
ADF動的リージョンが再初期化される場合、Fusion WebアプリケーションではADF動的リージョンに関連付けられているタスク・フロー・バインディングを再初期化する必要があります。その際、ADF動的リージョンに渡す新しい入力パラメータや入力パラメータ値があるかどうかが評価されます。
ADF動的リージョン・リンクは、ADF動的リージョン内でバインド・タスク・フローを別のバインド・タスク・フローに切り替えます。エンド・ユーザーは、コマンド・コンポーネント(ボタンやリンク)をクリックして、ADF動的リージョンを新しいバインド・タスク・フローで更新します。
たとえば、ADF動的リージョンのバインド・タスク・フローにより、従業員に関する一般情報(IDや写真など)が表示されるとします。エンド・ユーザーが「詳細」というコマンド・コンポーネントをクリックすると、その従業員の詳細情報を含む別のバインド・タスク・フローの表で、ADF動的リージョンが更新されます。エンド・ユーザーのアクション(リンクのクリック)により、ADF動的リージョンのマネージドBean上のメソッドが起動します。新しいバインド・タスク・フローの値がメソッドに渡され、ADF動的リージョンは新しいバインド・タスク・フローでリフレッシュされます。その後、新しいバインド・タスク・フローがADF動的リージョン内に表示されます。
デフォルトでは、ADF動的リージョン・リンクは、バインド・タスク・フローを別のものに切り替えますが、再び元のバインド・タスク・フローに切り替えることはできません。元のバインド・タスク・フローに戻すには、クリック時に現在のタスク・フローを元のタスク・フローに切り替える2つ目のADF動的リージョン・リンクをページに追加します。
すでに1つ以上のADF動的リージョンがページにあり、同じページに新しいバインド・タスク・フローをADF動的リージョンとして追加する場合は、ADF動的リージョン・リンクを追加できます。図23-15のように、ページにバインド・タスク・フローをドロップして、ADF動的リージョン・リンクの作成を選択すると、現在ページ上にある動的リージョンがすべてメニューに表示されます。
ドキュメント内の既存の動的リージョンにオプションとして追加するバインド・タスクをドラッグ・アンド・ドロップするとメニューが表示され、そこから「動的リージョン・リンク」を選択すると、ドキュメントに含まれる現在の動的リージョンのリストが図23-15のように表示されます。
このメニューを使用して、バインド・タスク・フローの内容を表示するADF動的リージョンを選択します。
ヒント: 動的リージョン・リンクの値は他のUIコンポーネント内で使用できます。たとえば、リスト内の各項目が別のバインド・タスク・フローにリンクしている選択リストを作成できます。リンクされているバインド・タスク・フローはすべて同じ動的リージョンに表示されます。リンクにより、表示するバインド・タスク・フローを切り替えるために作成したマネージドBeanの背後で、クラス内のメソッドが実行されます。 |
ADF動的リージョンがすでに含まれているページにバインド・タスク・フローをドラッグ・アンド・ドロップし、表示されるポップ・アップ・メニューで「動的リージョン・リンク」を選択して、リンクを作成できるADF動的リージョンのリストを表示します。
始める前に:
ADF動的リージョン・リンクを作成する前に必要な構成ついて理解しておくと役に立つ場合があります。詳細は、23.10項「ADF動的リージョンへのタスク・フローの追加」を参照してください。
他のタスク・フロー機能およびADFリージョン機能を使用して追加できる機能についても理解しておくと役立ちます。詳細は、23.1.4項「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。
次のタスクを完了する必要があります。
ADF動的リージョン・リンクを作成するには:
「アプリケーション」ウィンドウで、ADF動的リージョン・リンクを作成するJSFページをダブルクリックします。
「アプリケーション」ウィンドウで、JSFページにバインド・タスク・フローをドラッグ・アンド・ドロップして、ポップアップ・メニューから「動的リージョン・リンク」を選択します。
注意: バインド・タスク・フローのビュー・アクティビティは、ページ・フラグメントに関連付ける必要があります。ページを使用するバインド・タスク・フローを、ページ・フラグメントを使用するものに変換できます。詳細は、20.6.4項「バインド・タスク・フローの変換方法」を参照してください。 |
ページにすでに追加されているADF動的リージョンのリストが表示されるポップアップ・メニューで、バインド・タスク・フローの内容を表示するADF動的リージョンの名前を選択します。
「OK」をクリックします。
例23-14に示すように、ページへのリンクが追加されます。また、ADF動的リージョンのマネージドBeanが更新され、対応するタスク・フロー・バインディングが新しいパラメータで更新されます。
実行時にページにレンダリングされたリージョンの個数がわからない場合は、設計時にページを構成できます。たとえば、panelTabbed
コンポーネントを使用してリージョンをタブに追加するかタブから削除することが必要な場合があります。追加または削除を行うタブでは、それぞれにバインド・タスク・フローを参照するリージョンがレンダリングされます。
この機能を実装するには、JSFページ定義ファイルのmultiTaskFlow
要素を構成して、次のタイプのマネージドBeanに含まれるタスク・フローのリストを参照します。
oracle.adf.controller.binding.TaskFlowBindingAttributes
例23-15は、2つのタスク・フローを含むリストを返すMultiBean
と呼ばれるマネージドBeanクラスのコードを示しています。
例23-15 タスク・フロー・バインディングのリストを返すマネージドBean
package view; import java.util.ArrayList; import java.util.List; import oracle.adf.controller.TaskFlowId; import oracle.adf.controller.binding.TaskFlowBindingAttributes; public class MultiBean { private List<TaskFlowBindingAttributes> mTaskFlowBindingAttrs = new ArrayList<TaskFlowBindingAttributes>(5); public MultiBean() { TaskFlowBindingAttributes tfAttr = new TaskFlowBindingAttributes(); tfAttr.setId("region1"); tfAttr.setTaskFlowId(new TaskFlowId("/WEB-INF/r1.xml", "r1")); mTaskFlowBindingAttrs.add(tfAttr); tfAttr = new TaskFlowBindingAttributes(); tfAttr.setId("region2"); tfAttr.setTaskFlowId(new TaskFlowId("/WEB-INF/r2.xml", "r2")); mTaskFlowBindingAttrs.add(tfAttr); } public List<TaskFlowBindingAttributes> getTaskFlowList() { return mTaskFlowBindingAttrs; } }
TaskFlowBindingAttributes
クラスの詳細は、Oracle ADF Controller Java APIリファレンスを参照してください。
実行時に、multiTaskFlow
バインディングでは、公開するコマンド・コンポーネントを使用して、エンド・ユーザーがページに追加またはページから削除できる1つまたは複数のタスク・フローのリストが参照されます。図23-16は、このユース・ケースを作成した各種パート間の関係を示しています。
注意: バインド・タスク・フローでレンダリングされるページ・フラグメントではFaceletsドキュメント・タイプを使用する必要があります。 |
JSFページ定義ファイルのmultiTaskFlow
要素を構成して、バインド・タスク・フローのリストを参照します。TaskFlowBindingAttributes
タイプの要素を追加または削除することで、実行時にこのリストを変更できます。
始める前に:
複数の不明なADFリージョンをレンダリングするページの構成時に利用可能な構成オプションついて理解しておくと役に立つ場合があります。詳細は、23.11項「複数の不明なリージョンをレンダリングするページの構成」を参照してください。
他のタスク・フロー機能およびADFリージョン機能を使用して追加できる他の機能についても理解しておくと役立ちます。詳細は、23.1.3項「タスク・フローおよびADFリージョンのユース・ケースと例」を参照してください。
次のタスクを完了する必要があります。
TaskFlowBindingAttributes
タイプのリストを返すpageFlowスコープでマネージドBeanを作成します。例23-15は、次のリストを返すマネージドBeanクラスのコードを示します。マネージドBeanの作成方法の詳細は、26.4.1項「マネージドBeanを使用した情報の格納方法」を参照してください。複数の不明なリージョンをレンダリングするページを構成するには:
「アプリケーション」ウィンドウで、実行時にADFリージョンを追加または削除するJSFページを右クリックし、「ページ定義に移動」を選択します。
確認ダイアログが表示されたら、「はい」をクリックします。
概要エディタで、「バインディングと実行可能ファイル」タブをクリックし、「実行可能ファイル」セクションで「追加」アイコンをクリックします。
「アイテムの挿入」ダイアログで、ドロップダウン・メニューから「ADFタスク・フロー・バインディング」を選択して、作成するアイテムとして「multiTaskFlow」を選択し、「OK」をクリックします。
「multiTaskFlowの挿入」ダイアログで、次の値を入力します。
ID *: 複数タスク・フロー・バインディングの一意のIDを入力します。
taskFlowList *: 実行時にTaskFlowBindingAttributes
のリストを返すEL式を入力します。たとえば、例23-15のリストを返すには、次のEL式を入力します。
#{pageFlowScope.multiBean.taskFlowList}
「アプリケーション」ウィンドウで、エンド・ユーザーがADFリージョンを実行時に追加または削除するJSFページをダブルクリックします。
「コンポーネント」ウィンドウの「ADF Faces」ページで、「操作」パネルから「各」を、「各」コンポーネントの包含が必要な「構造」ウィンドウのコンポーネント上にドロップします。
「各」コンポーネントの「プロパティ」ウィンドウで、次のフィールドに値を入力します。
アイテム: 複数タスク・フロー・バインディングの実行時オブジェクトからタスク・フロー・バインディングのリストを返すメソッドを参照するEL式を入力します。
たとえば、次のようにEL式を入力します。
#{bindings.multiRegion1.taskFlowBindingList}
Var: タスク・フロー・バインディングのリストを識別する値を入力します。
「各」コンポーネントを含むJSFページで、例23-16で示すように、EL式を使用して「リージョン」コンポーネントのリージョン・モデルを参照する「各」コンポーネント内にある「リージョン」コンポーネントを挿入します。
複数タスク・フロー・バインディングのJSFページ定義ファイルに、例23-17で示されたものと類似するメタデータが表示されます。
例23-17 複数タスク・フロー・バインディングの作成用にページ定義に追加されるメタデータ
<multiTaskFlow id="multiRegion1" taskFlowList="${pageFlowScope.multiBean.taskFlowList}" activation="deferred" xmlns="http://xmlns.oracle.com/adf/controller/binding"/>
複数タスク・フロー・バインディングのメタデータのtaskFlowList
属性ではマネージドBeanが指定されます。マネージドBeanでは、実行時にページに追加可能なタスク・フローを記載するオブジェクトのリストが格納されています。
ページに作成するADFリージョンの個数を10までに制限してください。
各タスク・フロー・バインディングは、TaskFlowBindingAttributes
によって公開されたメソッドを使用して動作をオーバーライドしないかぎり、複数タスク・フロー・バインディングに定義された属性を継承します。
23.4項「パラメータ・マップを使用したADFリージョンのパラメータの指定」の説明のとおり、各タスク・フロー・バインディングは、複数タスク・フロー・バインディングで定義されたパラメータとともに、parametersMap
プロパティを使用して定義されたパラメータも継承します。
バインド・タスク・フローは、アクセスするセキュリティ権限のないユーザーによって起動される場合、ADFリージョンでレンダリングされません。リージョンは、これが発生する場合、リクエストされたタスク・フローのかわりに空白エリアをレンダリングします。起動しようとしたタスク・フローが表示されない理由に関してフィードバックを提供されないため、これによりユーザーが困惑する場合があります。ユーザーの操作性を向上させるために、ユーザーが必要とされるセキュリティ権限がないバインド・タスクにアクセスしようとする場合は、レンダリングする別のバインド・タスク・フローを指定できます。たとえば、ユーザーに必要なセキュリティ権限がないことを伝えるページを表示する別のバインド・タスク・フローを構成できます。より複雑なアプローチにより、システム管理者から必要な権限を要求するためのプロセスを通して、ユーザーが段階的に行うことができるバインド・タスク・フローをレンダリングできます。
セキュリティ権限のないバインド・タスク・フローにアクセスできない場合に、ユーザーが確実に表示できるように別のバインド・タスク・フローのセキュリティ・レベルを構成します。これには、41.5.1項「ADFリソースを公開する方法」で説明するように、別のバインド・タスク・フローを公開することが含まれます。バインド・タスク・フローを含む、Fusion Webアプリケーションのセキュリティ保護の詳細は、第41章「Fusion WebアプリケーションでのADFセキュリティの有効化」を参照してください。
セキュリティ権限がないためバインド・タスク・フローにアクセスできない場合にユーザーに表示する内容で、別のバインド・タスク・フローを構成します。Fusion Webアプリケーションのadf-config.xml
ファイルで「未許可リージョン・タスクフロー」プロパティの値として別のバインド・タスク・フローを指定します。
始める前に:
タスク・フローにセキュリティ権限がないユーザーにメッセージを表示する必要がある場合について理解しておくと役立ちます。詳細は、23.12項「未認可のユーザーによるセキュリティ保護されたタスク・フローへのアクセスの処理」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、23.1.4項「ADFリージョンにレンダリングされるタスク・フローの追加の機能」を参照してください。
次のタスクを完了する必要があります。
セキュリティ権限がないためバインド・タスク・フローにアクセスできない場合に、ユーザーに表示する別のバインド・タスク・フローを作成します。
バインド・タスク・フローの作成の詳細は、20.2項「タスク・フローの作成」を参照してください。
ユーザーがアクセスできるようにこのタスク・フローを構成します。
詳細は、41.5.1項「ADFリソースを公開する方法」を参照してください。
タスク・フローにセキュリティ権限がないユーザーにメッセージを表示するには:
「アプリケーション・リソース」パネルで、「ディスクリプタ」および「ADF META-INF」ノードを開き、「adf-config.xml」ファイルをダブルクリックします。
概要エディタで、「コントローラ」ナビゲーション・タブをクリックします。
「コントローラ」ページの「未許可リージョン・タスクフロー」フィールドで、起動するバインド・タスク・フローの名前を入力するか、「参照」をクリックして選択します。
例23-18で示すように、JDeveloperでは、adf-config.xml
ファイルの<unauthorized-region-taskflow>
要素の値として選択したバインド・タスク・フローの名前を記述します。
例23-18 認証なしでアクセス可能なタスク・フローを指定するためのメタデータの入力
<?xml version="1.0" encoding="windows-1252" ?> <adf-config xmlns="http://xmlns.oracle.com/adf/config" xmlns:config="http://xmlns.oracle.com/bc4j/configuration" xmlns:adf="http://xmlns.oracle.com/adf/config/properties"> ... <adf-controller-config xmlns="http://xmlns.oracle.com/adf/controller/config"> <unauthorized-region-taskflow>/WEB-INF/task-flow-definition.xml </unauthorized-region-taskflow> </adf-controller-config> ... </adf-config>
実行時に、Fusion Webアプリケーションでは、ユーザーがセキュリティ権限のないバインド・タスク・フローを起動しようとすると、この別のバインド・タスク・フローをレンダリングします。