Java > JavaEE > WebTier > JSFAdvanced


Overviewof the JavaServer Faces Lifecycle

  • 一般的なWebアプリケーションのライフサイクル
    • 入力リクエストのハンドリング
    • パラメータのでコード
    • 状態の変更と保存
    • プラウザへのページの描画
  • 簡単なアプリケーションでは、JSFの自動的なライフサイクル管理を利用
  • 複雑なアプリケーションでは、自分でライフサイクル管理
  • 良いコンポーネントを作るためには、ライフサイクルのフェーズを理解する必要がある

The Lifecycle of a JavaServer Faces Application

  • クライアントがページに対してHTTPリクエストを送信したときに開始
  • サーバがページのレスポンスを返却したら終了
  • ライフサイクルは大きくexecuteとrenderの2フェーズ分けられる
  • executeフェーズはコンポーネントツリーを扱うためにさらにサブフェーズに分けられる
    • コンポーネントデータの変換、バリデート、コンポーネントイベントのハンドリング、ビーンへのコンポーネントデータ設定
  • JSFページはviewと呼ばれるコンポーネントツリーにより表現される
    • JSFはライフサイクル中に、過去のページサブミットで保存された状態を考えながらviewを生成する
  • ライフサイクルでは2種類のリクエストを扱う
    • initialリクエスト
      • ページに対して初回のリクエスト
      • Restore View と Render Response のみ実行される
    • postbadk
      • すでにプラウザに表示されているページ上でフォームをサブミット
      • すべてのフェーズを実行
  • 別ページを描画するために、アプリケーションは新規にviewを作成しFacesContextインスタンスに保存する
  • FacesContext.renderResponseで即時にビューをレンダリング
  • FacesContext.responseCompleteでRender Responseフェーズをスキップ
    • Webサービスなどの異なるアプリケーションへのリダイレクト
    • JSFコンポーネントを含まないレスポンス生成
  • コンポーネントのimmediate属性をtrueにすると変換、バリデーション、イベントハンドリングがApply Request Values Phaseで行われる

Restore Viewフェーズ

  • JSFページへのリクエストがあったとき
  • ページビューのビルド
  • イベントハンドラとバリデータをコンポーネントに紐付け
  • FacesContextへのビューの保存
  • ページへの初回リクエストの場合、空ビューを生成し、Render Responseフェーズへ
  • ページへのボスとバックリクエストの場合、FacesContextにページ情報が保存されていて、クライアントまたはサーバに保存されている状態の情報を使ってビューをリストア

Apply Request Valuesフェーズ

  • ポストバックリクエストでビューがリストアされた後、ツリー内のコンポーネントはprocessDecodes()でリクエストパラメータから新しい値を抜き出し、コンポーネントのローカル値が設定される
    • 値の変換が失敗したらコンポーネントに対するエラーメッセージの生成とFacesContextへのキューイングが行われる
      • エラーメッセージはRender Responseフェーズでバリデーションエラーメッセージとともに表示
  • デコードまたはイベントリスナがFacesContext.renderResponseメソッドを読んだらRender Responseフェーズまでスキップされる
  • このフェーズでキューイングされたイベントは、関連リスナーにブロードキャストされる
  • コンポーネントのimmediate属性がtrueの場合は、バリデータ、変換、イベント処理が実行される
  • 別リソースへのリダイレクティング、JSFコンポーネントを含まないレスポンス生成の場合は、FacesContext.responseCompleteを呼べば良い
  • 終了状態:
    • コンポーネントには新しい値が設定
    • メッセージとイベントがキューされている

ProcessValidationsフェーズ

  • ツリー中のコンポーネントに登録されたすべてのバリデータが実行(processValidatorsメソッド)される
    • コンポーネントの属性としてしていされたバリデーションルールとローカルのコンポーネント値
  • ローカル値が不正な場合は、FacesContextにエラーメッセージが追加され、Render Responseフェーズへ
    • バリデーションと変換(Apply Request Valueフェーズ)のエラーメッセージが表示される
  • バリデートメソッドまたはイベントリスナの処理中でFacesContext.renderResponseが呼ばれると、Render Responseフェーズへ
  • 別リソースへのリダイレクティング、JSFコンポーネントを含まないレスポンス生成の場合は、FacesContext.responseCompleteを呼べば良い
  • このフェーズでキューイングされたイベントは、関連リスナーにブロードキャストされる

Update Model Valuesフェーズ

  • データバリデーションが済んだら、JSFはコンポーネントツリーを横断してサーバサイドのオブジェクトのプロパティにコンポーネントのローカル値を設定
    • 入力コンポーネント値属性で指定したビーンのプロパティを更新する
  • ローカルデータがビーンプロパティに変換できない場合は、エラーメッセージを表示するRender Responseフェーズへ
  • updateModelsメソッドまたはリスナの処理中でFacesContext.renderResponseが呼ばれると、Render Responseフェーズへ
  • 別リソースへのリダイレクティング、JSFコンポーネントを含まないレスポンス生成の場合は、FacesContext.responseCompleteを呼べば良い
  • このフェーズでキューイングされたイベントは、関連リスナーにブロードキャストされる

Invoke Application フェーズ

  • アプリケーションレベルのイベントハンドリング
    • サブミット、リンク
  • 別リソースへのリダイレクティング、JSFコンポーネントを含まないレスポンス生成の場合は、FacesContext.responseCompleteを呼べば良い
  • 過去のリクエストの状態からビューが再構成され、コンポーネントがイベントを発生させていたら、関連リスナーにブロードキャストされる
  • 最後にRender Responseフェーズへ

Render Responseフェーズ

  • ビューをビルドし、適切なリソースにページレンダリングを委譲
  • 初回リクエストの場合、ページ上のコンポーネントはコンポーネントツリーに追加される
  • ポストバックリクエストでエラーが発生した場合、元のページがレンダリングされる
    • Apply Request Values, Process Validations, UpdateModel Values
    • message, messagesタグがあればエラーメッセージが表示される
  • ビューがレンダリングされた後は、レスポンスの状態が保存される
    • 続くリクエストのRestore Viewフェーズから利用可能

Partial Processing and Partial Rendering

  • 単一コンポーネントに対して、処理とレンダリングが可能
  • パーシャルリクエストはJSFではPartialViewContextで扱われる
  • f:ajaxタグのexecute、render属性

The Lifecycle of a Facelets Application

  • Faceletsを使用したページに対して初回リクエストした場合、UIViewRootが作成されFacesContextに置かれる
  • UIViewRootはFaceletsに適用され、ビューはコンポーネントを集めて作られる
  • 最新のビューがレスポンスとしてレンダリングされる
  • レンダリング時に、ビューの状態が次回のリクエストのために保存される
    • 入力コンポーネントとフォームデータが保存される
  • クライアントはビューとやり取りする。この時ビューが保存された状態からリストアされる
  • リストアされたビューがJSFライフサイクルを通った結果、新規ビューまたは、現在のビューを再描画する
  • 同じビューが要求されたら、保存されたビューが描画される
  • 新規ビューが要求されたら、2番目へ
  • 新規ビューがレスポンスとしてレンダリングされる

User Interface Component Model

User Interface Component Classes

  • JSFはUIコンポーネントクラスとUIコンポーネントの機能のインターフェースを提供
    • コンポーネント状態の維持
    • オブジェクトへの参照の管理
    • イベントハンドリング
    • 標準コンポーネントの描画
  • コンポーネントクラスを拡張してカスタムコンポーネントが作れる
  • コンポーネントクラスはUIComponentBaseを継承
    UIComponent 抽象基底クラス
    UIComponentBase JSFのUIコンポーネントクラスの親。デフォルト状態と振る舞いを定義 UIComponentのサブクラス
    UIColumn UIDataコンポーネント中の単一カラム
    UICommand アクションを引き起こすコントローラ
    UIData DataModelで表現されるデータの集合を表現する
    UIForm データをサブミットするコントローラ。<form>タグ
    UIGraphic 画像を表示
    UIInput ユーザ入力を受け取る。 UIOutputのサブクラス
    UIMessage ローカライズされたエラーメッセージを表示
    UIMessages ローカライズされたエラーメッセージのセットを表示
    UIOutcomeTarget リンクまたはボタンでハイパーリンクを表示
    UIOutput ページへのデータの出力を表示
    UIPanel 子コンポーネントのレイアウトを管理
    UIParameter 置換パラメータを表現
    UISelectBoolean ユーザに選択/未選択機能を提供 UIInputのサブクラス
    UISelectItem 単一項目を表現
    UISelectItems 項目セット全体を表現
    UISelectMany ユーザに項目グループから複数の項目を選択する機能を提供 UIInputのサブクラス
    UISelectOne ユーザに項目グループから単一の項目を選択する機能を提供 UIInputのサブクラス
    UIViewParameter リクエストのクエリパラメータを表現 UIInputのサブクラス
    UIViewRoot コンポーネントツリーのルート
  • コンポーネントクラスは振る舞いのインタフェースを実装
    ActionSource アクションイベントを引き起こす。JSF2.xではduplicate
    ActionSource2 ActionSourceを継承。アクションイベントハンドラメソッドの指定にUnified EL式を使える
    EditableValueHolder ValueHolderを継承。バリデーションやValueChangeイベント発生などの追加フィーチャ
    NamingContainer このコンポーネントのルートコンポーネントは一意のIDをもつ
    StateHolder コンポーネント状態がリクエスト間で保存される
    ValueHolder コンポーネントがローカル値を保持する。
    SystemEventListenerHolder SystemEventListenerのリストを保持する
    ClientBehaviorHolder ClientBehaviorインスタンスを付加できる
  • UICommandはActionSource2、StateHolderを実装
  • UIOutputはStateHolder、ValueHolderを実装
  • UIInputはEditableValueHolder、StateHolder、ValueHolderを実装
  • UIComponentBaseはStateHolderを実装
  • コンポーネント作成者はコンポーネントクラスと振る舞いインターフェースを直接つかう
  • ページ作成者は標準コンポーネントをページにタグを埋め込むことでつかう
  • 多くのコンポーネントは異なる形式で描画できる

Component Rendering Model

  • コンポーネントの機能はコンポーネントクラスで、描画は描画クラスでと分割している
    • 機能は一度書けばよく、レンダリングは複数用意できる
    • ページ作成者はコンポーネントの見かけをタグを変更することで変えられる
  • レンダーキットはコンポーネントクラスから特定クライアント向けのコンポーネントタグへのマップを定義する
    • JSFはHTMLクライアント向けの標準HTMLレンダーキットを定義している
  • レンダーキットはコンポーネントクラスに対してレンダークラスを定義している
    • レンダークラスは対応するコンポーネントのそれぞれの描画方法を定義
      • UISelectOneコンポーネントに対して、ラジオボタン、コンポボックス、リストボックス
      • UICommandコンポーネントに対して、commandButtonタグ、commandLinkタグ

Conversion Model

  • JSFではコンポーネントをサーバ側のオブジェクトのプロパティに関連付ける
  • コンポーネントがオブジェクトに関連付けられると、コンポーネントのデータのビューが2つある
    • データの型で表現されるモデルビュー
    • ユーザ向けのプレゼンテーションビュー
  • JSFはモデルビューとプレゼンテーションビューのデータを自動的に変換する
  • JSFでは変換処理をカスタマイズできる
    • UIOutputコンポーネントにConverter実装を登録する

Event and Listener Model

  • アプリケーションイベント
    • UIComponentによって生成される、特定のアプリ向けのイベント
    • Eventオブジェクトは生成元のコンポーネントの情報とイベント情報をもつ
    • コンポーネントにListener実装を登録することで、イベントがリスナーに通知される
      • リスナー実装クラスを作成し、<actionListener>,<valueChangeListener>タグをコンポーネントタグに設定する
      • 管理ビーンのメソッドを実装し、コンポーネントタグの属性で参照
    • ActionEvent
      • ActionSourceを実装したコンポーネントがアクティブになったときに生成
      • コンポーネントのimmediateがtrueの場合は、invoke applicationまたはapply request valuesフェーズで実行
    • ValueChangeEvent
      • UIInput(UIInput, UISelectOne, UISelectMany,UISelectBoolean)コンポーネントの値が変更されたとき生成
      • バリデーションエラーがないときのみイベントが生成
      • コンポーネントのimmediateがtrueの場合は、process validationsまたはapply request valuesフェーズで実行
  • システムイベント
    • アプリケーション実行中にUIComponentではなくオブジェクトによって生成される
  • データモデルイベント
    • UIDataの新規行が選択されたら発生

Validation Model

  • JSFはローカルデータがモデルデータに反映される前にバリデーションを行う
  • 標準バリデータクラスの実装と対応するタグ(JSFコアタグ)が提供されている
  • コンポーネントタグにバリデータタグをネストすることで、バリデータを登録する
  • すべてのUIInputコンポーネントにデフォルトバリデータを登録することも可能
  • カスタムバリデータ(バリデータ実装とタグ)を作成できる
    • Validator実装クラス、または管理ビーンのメソッド
    • アプリケーションにバリデータ実装を登録、またはカスタムタグをコンポーネントに登録

Navigation Model

  • JSFのナビゲーションモデルによって、ページ遷移の定義と、遷移に必要な処理のハンドリングが行える
  • ナビゲーションはアプリケーションのアクション(ボタン押下とか)によって次のページを決定するルールセット
    • 暗黙的ナビゲーション
    • ユーザ定義ナビゲーション
      • ルールリソースファイル(faces-config.xmlとか)に記述
      • ルールは「from-view-idからfrom-outcomeの場合にto-view-idへ」の形式で
      • JSFはコンポーネントのアクション属性の結果文字列(固定or管理ビーンのアクションメソッドの戻り値)を使ってルールを選択する
  • ActionListenerはアクションメソッドの結果と、アクションメソッドへの参照をNavigationHandlerに渡す
  • ルールの決定はNavigationHandlerが行う
    • 現在表示されているページに対するナビゲーションルールを選択
    • 結果またはアクションメソッド参照をナビゲーションケースとマッチさせる
      • アクションメソッド参照と結果の両方を同じナビゲーションケースにマッチさせる
      • 結果をナビゲーションケースにマッチさせる
      • アクションメソッド参照をナビゲーションケースにマッチさせる
    • ナビゲーションケースが見つからなければ、同じページを表示する
    • ナビゲーションケースのマッチに成功すれば、render responseフェーズが始まり選択されたべーじが描画される
最終更新:2012年09月07日 08:13
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。