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 つのFlowScopedBeanMyBeanAと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 は、参照されると、指定されたスコープへのユーザーエージェントのエントリの後に遅延して作成され、ユーザーエージェントがフローを離れるときにガベージコレクションに使用できるようにする必要があります。
flowScopeJakarta 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, waitSEpublic 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.