public abstract class FlowHandler extends ObjectSE
FlowHandler は、ランタイムがフェイスフロー機能と対話できるようにする主要なエントリポイントです。NavigationHandler
は、フローに関連するナビゲーション上の決定を行う必要がある場合にこのクラスを使用します。フェイスフロー機能は、ClientWindow
機能と CDI に完全に依存しています。
フローの定義
実装は、アプリケーション構成リソースの XML スキーマ定義で指定されている <flow-definition>
要素を使用するか、FlowBuilder
API を使用して、フェースフローの定義をサポートする必要があります。フローを定義する追加の手段は、FlowHandlerFactory
を装飾することによって提供される場合があります。
フローの管理
このクラスのシングルトンインスタンスはスレッドセーフである必要があるため、ユーザーごとの状態を格納してはなりません。ただし、フローはユーザーごとにトラバースされるため、現在の
ClientWindow
に関連付ける必要があります。さらに、フローはネストされる場合があります。これらの要件は、スタックのようなランタイムデータ構造でフローを管理し、ユーザーごとに保存され、ClientWindow
に関連付けられることを強くお勧めします。フローインスタンスは不変ですが、フロースタックはユーザーごとであるため、実装では、フロースコープのデータ(FlowScoped
として宣言されたマネージド Bean およびgetCurrentFlowScope()
によって返されるMap
に格納されたデータ)を完全に再入可能にする必要があります。例: A と B の 2 つのフローがあり、それぞれが 1 つのFlowScoped
BeanMyBeanA
とMyBeanB
を持つアプリケーションについて考えてみます。フロー A に入ると、MyBeanA
がアクティブになります。A から B に呼び出すと、MyBeanB
がアクティブになります。A にコールバックすると、MyBeanA
の以前のインスタンスが再アクティブ化されるのではなく、MyBeanA
の新しいインスタンスがアクティブになります。フローグラフ
以前のバージョンの仕様ではフローグラフが定義されていましたが、グラフ内のノードの種類は VDL ビューのみでした。Faces Flow 機能は現在、次のノード型を定義しています。
表示
これは、最初から仕様に含まれている通常の Jakarta Server Faces VDL View です。
切り替え
これは Jakarta Expression Language 式のリストです。制御がスイッチノードに渡されると、リスト内の各式が評価され、
true
を返す最初の式を使用して、制御を渡す必要がある次のノードの ID が定義されます。どの式もtrue
に評価されない場合、制御は指定されたデフォルト ID に渡されます。リターン
このノード型は、呼び出しフローに返される結果を指定します。
メソッド呼び出し
このノード型では、フローの実行の任意の時点で任意のアプリケーションロジックを呼び出すことができます。メソッドが呼び出された後にナビゲーションケースがナビゲートされるようにする結果を指定できます。
フェイスフローコール
このノード型により、あるフローが別のフローを呼び出すことができます。呼び出しフローはアクティブのままであり、制御が呼び出されたフローから戻るまで終了しません。
グラフのエッジは、既存の Jakarta Server Faces ナビゲーションルールシステムによって定義されます。
フローとモデルオブジェクト
CDI アノテーション
FlowScoped
でアノテーションが付けられたマネージド Bean は、参照されると、指定されたスコープへのユーザーエージェントのエントリの後に遅延して作成され、ユーザーエージェントがフローを離れるときにガベージコレクションに使用できるようにする必要があります。
flowScope
Jakarta Expression Language 暗黙オブジェクトは、「現在の」勾配に値を格納するためにも使用できます。このスコープに格納されている値は、ユーザーエージェントがフローを離れるときにガベージコレクションに使用できるようにする必要があります。
修飾子と型 | フィールドと説明 |
---|---|
static StringSE | FLOW_ID_REQUEST_PARAM_NAME コンポーネントファミリ |
static StringSE | NULL_FLOW コンポーネントファミリ |
static StringSE | TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME コンポーネントファミリ |
コンストラクターと説明 |
---|
FlowHandler() |
修飾子と型 | メソッドと説明 |
---|---|
abstract void | addFlow(FacesContext context, Flow toAdd) 現在のアプリケーションで認識されている |
abstract void | clientWindowTransition(FacesContext context) コンポーネントファミリ |
Flow | getCurrentFlow()
|
abstract Flow | getCurrentFlow(FacesContext context) 引数 |
abstract MapSE<ObjectSE, ObjectSE> | getCurrentFlowScope()
|
abstract Flow | getFlow(FacesContext context, StringSE definingDocumentId, StringSE id) 引数 |
abstract StringSE | getLastDisplayedViewId(FacesContext context)
|
abstract boolean | isActive(FacesContext context, StringSE definingDocument, StringSE id) 引数 |
abstract void | popReturnMode(FacesContext context) リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。 |
abstract void | pushReturnMode(FacesContext context) リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。 |
abstract void | transition(FacesContext context, Flow sourceFlow, Flow targetFlow, FlowCallNode outboundCallNode, StringSE toViewId) 現在のユーザーの |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public static final StringSE FLOW_ID_REQUEST_PARAM_NAME
コンポーネントファミリ jakarta.faces.OutcomeTarget
の Renderers
によってレンダリングされるコンポーネントは、この定数を、このコンポーネントが入力されるフローのフロー ID を表すパラメーターのパラメーター名として使用する必要があります。
public static final StringSE TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME
コンポーネントファミリ jakarta.faces.OutcomeTarget
の Renderers
によってレンダリングされるコンポーネントは、この定数を、このコンポーネントが入力されるフローの定義ドキュメント ID を表すパラメーターのパラメーター名として使用する必要があります。
public static final StringSE NULL_FLOW
コンポーネントファミリ jakarta.faces.OutcomeTarget
の Renderers
によってレンダリングされるコンポーネントは、そのようなコンポーネントを使用してフローから(別のフローに入らずに)戻るときに、TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME
によって指定されたパラメーターの値としてこの定数を使用する必要があります。
public abstract MapSE<ObjectSE,ObjectSE> getCurrentFlowScope()
#{flowScope}
Jakarta Expression Language 暗黙オブジェクトをバックアップする Map
を返します。現在アクティブなフローがない場合は、null
を返します。
Map
。public abstract Flow getFlow(FacesContext context, StringSE definingDocumentId, StringSE id)
引数 definingDocument
のスコープ内で、id
が引数 id
と同等である Flow
を返します。
context
- 現在のリクエストの FacesContext
。definingDocumentId
- 返されるフローが定義されているドキュメントのアプリケーション固有の識別子。id
- definingDocument
のスコープ内で一意の Flow
の ID。Flow
。NullPointerExceptionSE
- パラメーターのいずれかが null
の場合 public abstract void addFlow(FacesContext context, Flow toAdd)
現在のアプリケーションで認識されている Flow
のコレクションに引数 Flow
を追加します。実装はスレッドセーフでなければなりません。
context
- 現在のリクエストの FacesContext
。toAdd
- 追加する Flow
。NullPointerExceptionSE
- パラメーターのいずれかが null
の場合 IllegalStateExceptionSE
- definingDocument
のスコープ内に引数 Flow
と同じ id
のフローがすでに存在する場合。IllegalArgumentExceptionSE
- 追加するフローの id
が null
または空の文字列の場合。IllegalArgumentExceptionSE
- toAdd
の definingDocumentId
が null
の場合。public abstract Flow getCurrentFlow(FacesContext context)
引数 FacesContext
に対して現在アクティブな Flow
を返します。アクティブなフローがない場合は、null
を返します。Flow
は常に正確に 1 つの ClientWindow
に関連付ける必要がありますが、ClientWindow
には複数の Flow
が含まれる場合があります。
このメソッドを呼び出す前に、引数として true
を使用して pushReturnMode(jakarta.faces.context.FacesContext)
が呼び出された場合は、実際の現在のフローの代わりにスタック上の先行するフローを返します。先行するフローがない場合は null
を返します。それ以外の場合は、現在のフローを返します。
context
- 現在のリクエストの FacesContext
。Flow
または null
NullPointerExceptionSE
- パラメーターのいずれかが null
の場合 public Flow getCurrentFlow()
FacesContext.getCurrentInstance()
を呼び出してから getCurrentFlow(jakarta.faces.context.FacesContext)
を呼び出す便利なオーバーロード。
Flow
または null
public abstract StringSE getLastDisplayedViewId(FacesContext context)
getCurrentFlow(jakarta.faces.context.FacesContext)
によって返される現在のフローの最後に表示された viewId を返します。現在のフローがない場合は null
を返します。
context
- 現在のリクエストの FacesContext
。NullPointerExceptionSE
- context
が null
の場合 public abstract void pushReturnMode(FacesContext context)
リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。デフォルトの NavigationHandler
仕様では、フローリターンのナビゲーションルールを処理する前にこのメソッドを呼び出し、その直後に finally
ブロックから popReturnMode(jakarta.faces.context.FacesContext)
を呼び出す必要があります。
context
- 現在のリクエストの FacesContext
。NullPointerExceptionSE
- context
が null
の場合。public abstract void popReturnMode(FacesContext context)
リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。デフォルトの NavigationHandler
仕様では、finally
ブロックからこのメソッドを呼び出し、フローリターンのコンテキストでナビゲーションルールの処理をすぐに試行する必要があります。
context
- 現在のリクエストの FacesContext
。NullPointerExceptionSE
- context
が null
の場合。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
の場合。public abstract void clientWindowTransition(FacesContext context)
コンポーネントファミリ 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
の場合。public abstract boolean isActive(FacesContext context, StringSE definingDocument, StringSE id)
引数 definingDocument
および id
によって参照されるフローが現在アクティブである場合にのみ、true
を返します。
context
- 現在のリクエストの FacesContext
。definingDocument
- 返されるフローが定義されているドキュメントのアプリケーション固有の識別子。id
- definingDocument
のスコープ内で一意の Flow
の ID。NullPointerExceptionSE
- パラメーターのいずれかが null
の場合 Copyright © 2018,2020 Eclipse Foundation.
Use is subject to license terms.