クラス FlowHandler
FlowHandler は、ランタイムがフェイスフロー機能と対話できるようにする主要なエントリポイントです。NavigationHandler は、フローに関連するナビゲーション上の決定を行う必要がある場合にこのクラスを使用します。フェイスフロー機能は、ClientWindow 機能と CDI に完全に依存しています。
フローの定義
実装は、アプリケーション構成リソースの XML スキーマ定義で指定されている <flow-definition> 要素を使用するか、FlowBuilder API を使用して、フェースフローの定義をサポートする必要があります。フローを定義する追加の手段は、FlowHandlerFactory を装飾することによって提供される場合があります。
フローの管理
このクラスのシングルトンインスタンスはスレッドセーフである必要があるため、ユーザーごとの状態を格納してはなりません。ただし、フローはユーザーごとにトラバースされるため、現在の
ClientWindowに関連付ける必要があります。さらに、フローはネストされる場合があります。これらの要件は、スタックのようなランタイムデータ構造でフローを管理し、ユーザーごとに保存され、ClientWindowに関連付けられることを強くお勧めします。フローインスタンスは不変ですが、フロースタックはユーザーごとであるため、実装では、フロースコープのデータ(FlowScopedとして宣言されたマネージド Bean およびgetCurrentFlowScope()によって返されるMapに格納されたデータ)を完全に再入可能にする必要があります。例: A と B の 2 つのフローがあり、それぞれが 1 つのFlowScopedBeanMyBeanAとMyBeanBを持つアプリケーションについて考えてみます。フロー A に入ると、MyBeanAがアクティブになります。A から B に呼び出すと、MyBeanBがアクティブになります。A にコールバックすると、MyBeanAの以前のインスタンスが再アクティブ化されるのではなく、MyBeanAの新しいインスタンスがアクティブになります。フローグラフ
以前のバージョンの仕様ではフローグラフが定義されていましたが、グラフ内のノードの種類は VDL ビューのみでした。Faces Flow 機能は現在、次のノード型を定義しています。
表示
これは、最初から仕様に含まれている通常の Jakarta Faces VDL View です。
切り替え
これは Jakarta Expression Language 式のリストです。制御がスイッチノードに渡されると、リスト内の各式が評価され、
trueを返す最初の式を使用して、制御を渡す必要がある次のノードの ID が定義されます。どの式もtrueに評価されない場合、制御は指定されたデフォルト ID に渡されます。リターン
このノード型は、呼び出しフローに返される結果を指定します。
メソッド呼び出し
このノード型では、フローの実行の任意の時点で任意のアプリケーションロジックを呼び出すことができます。メソッドが呼び出された後にナビゲーションケースがナビゲートされるようにする結果を指定できます。
フェイスフローコール
このノード型により、あるフローが別のフローを呼び出すことができます。呼び出しフローはアクティブのままであり、制御が呼び出されたフローから戻るまで終了しません。
グラフのエッジは、既存の Jakarta Faces ナビゲーションルールシステムによって定義されます。
フローとモデルオブジェクト
CDI アノテーション
FlowScopedでアノテーションが付けられたマネージド Bean は、参照されると、指定されたスコープへのユーザーエージェントのエントリの後に遅延して作成され、ユーザーエージェントがフローを離れるときにガベージコレクションに使用できるようにする必要があります。
flowScopeJakarta Expression Language 暗黙オブジェクトは、「現在の」勾配に値を格納するためにも使用できます。このスコープに格納されている値は、ユーザーエージェントがフローを離れるときにガベージコレクションに使用できるようにする必要があります。
- 導入:
- 2.2
フィールド概要
フィールド修飾子と型フィールド説明static final StringSEコンポーネントファミリjakarta.faces.OutcomeTargetのRenderersによってレンダリングされるコンポーネントは、この定数を、このコンポーネントが入力されるフローのフロー ID を表すパラメーターのパラメーター名として使用する必要があります。static final StringSEコンポーネントファミリjakarta.faces.OutcomeTargetのRenderersによってレンダリングされるコンポーネントは、そのようなコンポーネントを使用してフローから(別のフローに入らずに)戻るときに、TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAMEによって指定されたパラメーターの値としてこの定数を使用する必要があります。static final StringSEコンポーネントファミリjakarta.faces.OutcomeTargetのRenderersによってレンダリングされるコンポーネントは、この定数を、このコンポーネントが入力されるフローの定義ドキュメント ID を表すパラメーターのパラメーター名として使用する必要があります。コンストラクター概要
コンストラクター方法の概要
修飾子と型メソッド説明abstract voidaddFlow(FacesContext context, Flow toAdd) 現在のアプリケーションで認識されているFlowのコレクションに引数Flowを追加します。abstract voidclientWindowTransition(FacesContext context) コンポーネントファミリjakarta.faces.OutcomeTargetのレンダラーによってレンダリングされたコンポーネントの場合にフロー遷移を許可します。FacesContext.getCurrentInstance()を呼び出してからgetCurrentFlow(jakarta.faces.context.FacesContext)を呼び出す便利なオーバーロード。abstract FlowgetCurrentFlow(FacesContext context) #{flowScope}Jakarta Expression Language 暗黙オブジェクトをバックアップするMapを返します。現在アクティブなフローがない場合は、nullを返します。abstract FlowgetFlow(FacesContext context, StringSE definingDocumentId, StringSE id) abstract StringSEgetLastDisplayedViewId(FacesContext context) getCurrentFlow(jakarta.faces.context.FacesContext)によって返される現在のフローの最後に表示された viewId を返します。現在のフローがない場合はnullを返します。abstract booleanisActive(FacesContext context, StringSE definingDocument, StringSE id) 引数definingDocumentおよびidによって参照されるフローが現在アクティブである場合にのみ、trueを返します。abstract voidpopReturnMode(FacesContext context) リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。abstract voidpushReturnMode(FacesContext context) リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。abstract voidtransition(FacesContext context, Flow sourceFlow, Flow targetFlow, FlowCallNode outboundCallNode, StringSE toViewId) 現在のユーザーのClientWindowのフローグラフで遷移を実行します。
フィールドの詳細
FLOW_ID_REQUEST_PARAM_NAME
コンポーネントファミリ
jakarta.faces.OutcomeTargetのRenderersによってレンダリングされるコンポーネントは、この定数を、このコンポーネントが入力されるフローのフロー ID を表すパラメーターのパラメーター名として使用する必要があります。- 導入:
- 2.2
- 関連事項:
TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME
コンポーネントファミリ
jakarta.faces.OutcomeTargetのRenderersによってレンダリングされるコンポーネントは、この定数を、このコンポーネントが入力されるフローの定義ドキュメント ID を表すパラメーターのパラメーター名として使用する必要があります。- 導入:
- 2.2
- 関連事項:
NULL_FLOW
コンポーネントファミリ
jakarta.faces.OutcomeTargetのRenderersによってレンダリングされるコンポーネントは、そのようなコンポーネントを使用してフローから(別のフローに入らずに)戻るときに、TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAMEによって指定されたパラメーターの値としてこの定数を使用する必要があります。- 導入:
- 2.2
- 関連事項:
コンストラクターの詳細
FlowHandler
public FlowHandler()
方法の詳細
getCurrentFlowScope
#{flowScope}Jakarta Expression Language 暗黙オブジェクトをバックアップするMapを返します。現在アクティブなフローがない場合は、nullを返します。- 戻り値:
- このフロースコープの
Map。 - 導入:
- 2.2
getFlow
引数
definingDocumentのスコープ内で、idが引数idと同等であるFlowを返します。- パラメーター:
context- 現在のリクエストのFacesContext。definingDocumentId- 返されるフローが定義されているドキュメントのアプリケーション固有の識別子。id-definingDocumentのスコープ内で一意のFlowの ID。- 戻り値:
- 引数識別子の
Flow。 - 例外:
NullPointerExceptionSE- パラメーターのいずれかがnullの場合- 導入:
- 2.2
addFlow
現在のアプリケーションで認識されている
Flowのコレクションに引数Flowを追加します。実装はスレッドセーフでなければなりません。- パラメーター:
context- 現在のリクエストのFacesContext。toAdd- 追加するFlow。- 例外:
NullPointerExceptionSE- パラメーターのいずれかがnullの場合IllegalStateExceptionSE-definingDocumentのスコープ内に引数Flowと同じidのフローがすでに存在する場合。IllegalArgumentExceptionSE- 追加するフローのidがnullまたは空の文字列の場合。IllegalArgumentExceptionSE-toAddのdefiningDocumentIdがnullの場合。- 導入:
- 2.2
getCurrentFlow
引数
FacesContextに対して現在アクティブなFlowを返します。アクティブなフローがない場合は、nullを返します。Flowは常に正確に 1 つのClientWindowに関連付ける必要がありますが、ClientWindowには複数のFlowが含まれる場合があります。このメソッドを呼び出す前に、引数として
trueを使用してpushReturnMode(jakarta.faces.context.FacesContext)が呼び出された場合は、実際の現在のフローの代わりにスタック上の先行するフローを返します。先行するフローがない場合はnullを返します。それ以外の場合は、現在のフローを返します。- パラメーター:
context- 現在のリクエストのFacesContext。- 戻り値:
- フローがアクティブでない場合は、現在の
Flowまたはnull - 例外:
NullPointerExceptionSE- パラメーターのいずれかがnullの場合- 導入:
- 2.2
getCurrentFlow
FacesContext.getCurrentInstance()を呼び出してからgetCurrentFlow(jakarta.faces.context.FacesContext)を呼び出す便利なオーバーロード。- 戻り値:
- フローがアクティブでない場合は、現在の
Flowまたはnull - 導入:
- 2.2
getLastDisplayedViewId
getCurrentFlow(jakarta.faces.context.FacesContext)によって返される現在のフローの最後に表示された viewId を返します。現在のフローがない場合はnullを返します。- パラメーター:
context- 現在のリクエストのFacesContext。- 戻り値:
- 最後に表示された viewId。
- 例外:
NullPointerExceptionSE-contextがnullの場合- 導入:
- 2.2
pushReturnMode
リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。デフォルトの
NavigationHandler仕様では、フローリターンのナビゲーションルールを処理する前にこのメソッドを呼び出し、その直後にfinallyブロックからpopReturnMode(jakarta.faces.context.FacesContext)を呼び出す必要があります。- パラメーター:
context- 現在のリクエストのFacesContext。- 例外:
NullPointerExceptionSE-contextがnullの場合。- 導入:
- 2.2
popReturnMode
リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。デフォルトの
NavigationHandler仕様では、finallyブロックからこのメソッドを呼び出し、フローリターンのコンテキストでナビゲーションルールの処理をすぐに試行する必要があります。- パラメーター:
context- 現在のリクエストのFacesContext。- 例外:
NullPointerExceptionSE-contextがnullの場合。- 導入:
- 2.2
transition
public abstract void transition(FacesContext context, Flow sourceFlow, Flow targetFlow, FlowCallNode outboundCallNode, StringSE toViewId) 現在のユーザーの
ClientWindowのフローグラフで遷移を実行します。originおよびdestination引数に対応するFlowインスタンスへの参照を取得します。origin Flowがdestination Flowと等しい場合は、何も実行せずにnullを返します。それ以外の場合、outboundCallNode引数がnullでない場合は、送信パラメーターを保存します。説明のために、evaluatedParams は、送信パラメーターの評価された値を格納するデータ構造です。フロースコープをポップする前にこれらの値を評価する必要があります。値は、ターゲットフローに渡す必要があるが、新しいスコープがアクティブになると使用できなくなるスコープインスタンスを参照する可能性があるためです。次のアルゴリズムを使用して、送信パラメーターを保存します。outboundCallNodeのoutboundParametersプロパティが非 nullかつ空でなく、ターゲットフローのinboundParametersプロパティが非 nullかつ空でない場合、名前が受信 パラメーターのエントリと一致する送信 パラメーターの各エントリについて、パラメーターの値を評価し、評価した値を対応する名前の evaluatedParams に格納します。それ以外の場合は、evaluatedParams を空と見なします。destination Flowがorigin Flowのサブフローである場合は、destination Flowをフローデータ構造にプッシュし、the destination Flowを返します。それ以外の場合は、フローデータ構造から現在のFlowをポップします。destination Flowがnullでない場合は、destination Flowを現在のフローにして、データ構造にプッシュします。evaluatedParams が空でない場合は、各エントリについて、ターゲットフローの受信パラメーターで対応するパラメーターを見つけ、そのsetValueメソッドを呼び出して、evaluatedParams からの値を渡します。- パラメーター:
context- 現在のリクエストのFacesContext。sourceFlow- 現在のFlow、またはソースフローがない場合はnull。targetFlow- 宛先Flow、または宛先フローがない場合はnull。outboundCallNode- この遷移を引き起こしているフロー呼び出しノード、またはこの遷移がフロー呼び出しによって引き起こされていない場合はnull。toViewId- この遷移の結果として表示されるビューの viewId。このパラメーターにより、getLastDisplayedViewId(jakarta.faces.context.FacesContext)を実装できるようになります。- 例外:
NullPointerExceptionSE-contextまたはtoViewIdがnullの場合。- 導入:
- 2.2
clientWindowTransition
コンポーネントファミリ
jakarta.faces.OutcomeTargetのレンダラーによってレンダリングされたコンポーネントの場合にフロー遷移を許可します。これらの遷移は、そのようなコンポーネントの HTTP GET ベースの性質により、リクエスト処理ライフサイクルの前に発生する必要があります。このメソッドは、ライフサイクルのビューの復元フェーズから呼び出されます。flowId を、
FLOW_ID_REQUEST_PARAM_NAMEの値によって名前が指定されたパラメーターのリクエストパラメーターマップの値とします。toFlowDocumentId を、TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAMEの値によって名前が指定されたパラメーターのリクエストパラメーターマップの値とします。toFlowDocumentId がnullの場合、何も実行せず戻ります。それ以外の場合、sourceFlow をgetCurrentFlow(jakarta.faces.context.FacesContext)からの戻り値とします。null値は、現在のフローが存在しないことを示します。これは、このナビゲーションがフローに入ろうとしている場合に当てはまります。flowId がnullでなく、toFlowDocumentId がNULL_FLOWの値と等しくない場合、getFlow(jakarta.faces.context.FacesContext, java.lang.String, java.lang.String)を呼び出して、最後の 2 つの引数としてそれぞれ toFlowDocumentId と flowId を渡した結果を targetFlow とします。結果がnull以外の場合、sourceFlow でFlow.getFlowCall(jakarta.faces.flow.Flow)を呼び出した際の戻り値を flowCallNode とし、引数として targetFlow を渡します。それ以外の場合、targetFlow と flowCallNode はnullのままで、これがフロー戻り値であることを示します。FacesContext.getViewRoot()を呼び出し、UIViewRoot.getViewId()を呼び出した際の戻り値を toViewId とします。前のアルゴリズムで収集された引数を渡して、
transition(jakarta.faces.context.FacesContext, jakarta.faces.flow.Flow, jakarta.faces.flow.Flow, jakarta.faces.flow.FlowCallNode, java.lang.String)を呼び出します。- パラメーター:
context- 現在のリクエストのFacesContext。- 例外:
NullPointerExceptionSE-contextがnullの場合。- 導入:
- 2.2
isActive
引数
definingDocumentおよびidによって参照されるフローが現在アクティブである場合にのみ、trueを返します。- パラメーター:
context- 現在のリクエストのFacesContext。definingDocument- 返されるフローが定義されているドキュメントのアプリケーション固有の識別子。id-definingDocumentのスコープ内で一意のFlowの ID。- 戻り値:
- 参照されたフローがアクティブである場合にのみ true
- 例外:
NullPointerExceptionSE- パラメーターのいずれかがnullの場合- 導入:
- 2.2