パッケージ jakarta.faces.flow

クラス FlowHandler

java.lang.ObjectSE
jakarta.faces.flow.FlowHandler

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

flowScope Jakarta 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 void
    addFlow(FacesContext context, Flow toAdd)
    現在のアプリケーションで認識されている Flow のコレクションに引数 Flow を追加します。
    abstract void
    コンポーネントファミリ jakarta.faces.OutcomeTarget のレンダラーによってレンダリングされたコンポーネントの場合にフロー遷移を許可します。
    FacesContext.getCurrentInstance() を呼び出してから getCurrentFlow(jakarta.faces.context.FacesContext) を呼び出す便利なオーバーロード。
    abstract Flow
    引数 FacesContext に対して現在アクティブな Flow を返します。アクティブなフローがない場合は、null を返します。
    #{flowScope} Jakarta Expression Language 暗黙オブジェクトをバックアップする Map を返します。現在アクティブなフローがない場合は、null を返します。
    abstract Flow
    getFlow(FacesContext context, StringSE definingDocumentId, StringSE id)
    引数 definingDocument のスコープ内で、 id が引数 id と同等である Flow を返します。
    abstract StringSE
    getCurrentFlow(jakarta.faces.context.FacesContext) によって返される現在のフローの最後に表示された viewId を返します。現在のフローがない場合は null を返します。
    abstract boolean
    isActive(FacesContext context, StringSE definingDocument, StringSE id)
    引数 definingDocument および id によって参照されるフローが現在アクティブである場合にのみ、true を返します。
    abstract void
    リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。
    abstract void
    リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。
    abstract void
    transition(FacesContext context, Flow sourceFlow, Flow targetFlow, FlowCallNode outboundCallNode, StringSE toViewId)
    現在のユーザーの ClientWindow のフローグラフで遷移を実行します。

    クラス java.lang.ObjectSE から継承されたメソッド

    clone, equalsSE, finalize, getClass, hashCode, notify, notifyAll, toString, wait, waitSE, waitSE
  • フィールドの詳細

    • FLOW_ID_REQUEST_PARAM_NAME

      public static final StringSE FLOW_ID_REQUEST_PARAM_NAME

      コンポーネントファミリ jakarta.faces.OutcomeTarget の Renderers によってレンダリングされるコンポーネントは、この定数を、このコンポーネントが入力されるフローのフロー ID を表すパラメーターのパラメーター名として使用する必要があります。

      導入:
      2.2
      関連事項:
    • TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME

      public static final StringSE TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME

      コンポーネントファミリ jakarta.faces.OutcomeTarget の Renderers によってレンダリングされるコンポーネントは、この定数を、このコンポーネントが入力されるフローの定義ドキュメント ID を表すパラメーターのパラメーター名として使用する必要があります。

      導入:
      2.2
      関連事項:
    • NULL_FLOW

      public static final StringSE NULL_FLOW

      コンポーネントファミリ jakarta.faces.OutcomeTarget の Renderers によってレンダリングされるコンポーネントは、そのようなコンポーネントを使用してフローから(別のフローに入らずに)戻るときに、TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME によって指定されたパラメーターの値としてこの定数を使用する必要があります。

      導入:
      2.2
      関連事項:
  • コンストラクターの詳細

    • FlowHandler

      public FlowHandler()
  • メソッドの詳細

    • getCurrentFlowScope

      public abstract MapSE<ObjectSE,ObjectSE> getCurrentFlowScope()

      #{flowScope} Jakarta Expression Language 暗黙オブジェクトをバックアップする Map を返します。現在アクティブなフローがない場合は、null を返します。

      戻り値:
      このフロースコープの Map
      導入:
      2.2
    • getFlow

      public abstract Flow getFlow(FacesContext context, StringSE definingDocumentId, StringSE id)

      引数 definingDocument のスコープ内で、 id が引数 id と同等である Flow を返します。

      パラメーター:
      context - 現在のリクエストの FacesContext
      definingDocumentId - 返されるフローが定義されているドキュメントのアプリケーション固有の識別子。
      id - definingDocument のスコープ内で一意の Flow の ID。
      戻り値:
      引数識別子の Flow
      例外:
      NullPointerExceptionSE - パラメーターのいずれかが null の場合
      導入:
      2.2
    • addFlow

      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 の場合。
      導入:
      2.2
    • getCurrentFlow

      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 の場合
      導入:
      2.2
    • getCurrentFlow

      public Flow getCurrentFlow()

      FacesContext.getCurrentInstance() を呼び出してから getCurrentFlow(jakarta.faces.context.FacesContext) を呼び出す便利なオーバーロード。

      戻り値:
      フローがアクティブでない場合は、現在の Flow または null 
      導入:
      2.2
    • getLastDisplayedViewId

      public abstract StringSE getLastDisplayedViewId(FacesContext context)

      getCurrentFlow(jakarta.faces.context.FacesContext) によって返される現在のフローの最後に表示された viewId を返します。現在のフローがない場合は null を返します。

      パラメーター:
      context - 現在のリクエストの FacesContext
      戻り値:
      最後に表示された viewId。
      例外:
      NullPointerExceptionSE - context が null の場合
      導入:
      2.2
    • pushReturnMode

      public abstract void pushReturnMode(FacesContext context)

      リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。デフォルトの NavigationHandler 仕様では、フローリターンのナビゲーションルールを処理する前にこのメソッドを呼び出し、その直後に finally ブロックから popReturnMode(jakarta.faces.context.FacesContext) を呼び出す必要があります。

      パラメーター:
      context - 現在のリクエストの FacesContext
      例外:
      NullPointerExceptionSE - context が null の場合。
      導入:
      2.2
    • popReturnMode

      public abstract void popReturnMode(FacesContext context)

      リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。デフォルトの 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

      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 つの引数としてそれぞれ toFlowDocumentIdflowId を渡した結果を targetFlow とします。結果が null 以外の場合、sourceFlowFlow.getFlowCall(jakarta.faces.flow.Flow) を呼び出した際の戻り値を flowCallNode とし、引数として targetFlow を渡します。それ以外の場合、targetFlowflowCallNode は 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

      public abstract boolean isActive(FacesContext context, StringSE definingDocument, StringSE id)

      引数 definingDocument および id によって参照されるフローが現在アクティブである場合にのみ、true を返します。

      パラメーター:
      context - 現在のリクエストの FacesContext
      definingDocument - 返されるフローが定義されているドキュメントのアプリケーション固有の識別子。
      id - definingDocument のスコープ内で一意の Flow の ID。
      戻り値:
      参照されたフローがアクティブである場合にのみ true
      例外:
      NullPointerExceptionSE - パラメーターのいずれかが null の場合
      導入:
      2.2