JSFのライフサイクル

JSFのライフサイクル
エンタープライズアプリケーション II
第10回 / 2006年7月23日
1
ここでの目標

UIコンポーネント・ツリー、イベント、JSFの
ライフサイクルについて一通り理解する。
2
UIコンポーネント・ツリー
3
UIコンポーネント・ツリー




JSFでは、JSF独自のタグでJSPの画面を構成す
る。
JSFのアプリケーションの内部では、このタグの
階層構造をJavaオブジェクトの階層構造に置き
換えたものを管理する。
このJavaオブジェクトの階層構造が「コンポーネ
ント・ツリー」
JSFでは、この「コンポーネント・ツリー」を使って、
さまざまな処理を実行する。
4
guessNumberアプリケーション
を構成するタグ
<f:view>
<h:form id="helloForm">
<h:outputText ...... />
<h:outputText ...... />
<h:graphicImage …… />
<h:inputText ...... />
<h:commandButton ...... />
<h:message ...... />
</h:form>
</f:view>
5
タグと
UIコンポーネント・ツリー (1)
<f:view>
<h:form id="helloForm">
<h:outputText ...... />
<h:outputText ...... />
<h:graphicImage …… />
<h:inputText ...... />
<h:commandButton ...... />
<h:message ...... />
</h:form>
</f:view>
6
タグと
UIコンポーネント・ツリー (2)

UIコンポーネント・ツリーの各コンポーネン
トとJSPのタグが対応する






UIViewRoot --> f:view
UIForm --> h:form
UIOutputText --> h:outputText
UIInputText --> h:inputText
UICommandButton --> h:commandButton
UIMessage --> h:message
7
UIコンポーネント・ツリーの
保存場所 (1)

UIコンポーネント・ツリーの保存場所は2通
りある。




サーバ → HttpSession に。
クライアント → 表示される HTMLの hidden
タグに。
デフォルトではサーバ側で保存される。
web.xmlで設定できる。
8
UIコンポーネント・ツリーの
保存場所 (2)

web.xmlで設定できる。
<context-param>
<param-name>
javax.faces.STATE_SAVING_METHOD
</param-name>
<param-value>client</param-value>
</context-param>
9
JSFのイベント処理
10
イベント処理とは

イベント = アプリケーションで行
われる操作



ボタンを押する
入力フィールドにデータを入力する
イベント処理とは、ある特定のイベン
トが起こったときに、何らかの処理を
行うこと
11
イベント処理のしくみ

イベント発生元



イベントが起こるところ
ボタン、テキストフィールドなど
イベントリスナー

発生したイベントを受け取り、イベントに
対応する処理を行うところ
12
JSFでの2種類のイベント処
理

Action イベント


ボタンやハイパーリンクが押されたときに
発生するイベント
Value Change イベント

ボタンが押されたとき、対象となるUIコン
ポーネントが変化していたら発生するイベ
ント
13
JSFのライフサイクル
14
JSFのライフサイクル


JSFのアプリケーションが、Webブラウザ
からリクエストを受け取ってからレスポンス
を返すまでの処理手順
ライフサイクルには6つのフェーズがある
15
ライフサイクルの
6つのフェーズ (1)
(1) ビューの復元

リクエスト元の画面のUIコンポーネントツ
リーを復元
(2) リクエスト値の適用

リクエストのときのパラメータ情報をUIコン
ポーネントツリーにセットする
(3) 入力値の検証

設定された値にコンバータとバリデータを適
用
16
ライフサイクルの
6つのフェーズ (2)
(4) モデル値の更新

UIコンポーネントの値を Managed Bean のプ
ロパティにセット
(5) アプリケーションの起動

Action Method を実行して遷移先を決定
(6) レスポンスのレンダリング

遷移先画面のUIコンポーネントツリーから、ブ
ラウザに返すレスポンスを生成
17
ライフサイクルの詳細
18
guessNumberを題材に

guessNumber
サンプルアプリ
ケーションの動
作を確認しな
がら、ライフサ
イクルの各
フェーズの動き
を追ってみよう。
19
guessNumberを
題材に




Webブラウザで0〜10までの数を入力して
"Submit" ボタンを押すと
WebブラウザからJSFのアプリケーションに
対してリクエストが行われる。
その後でレスポンスとして「あたり」か「はず
れ」の画面が出力される。
このリクエストからレスポンスにいたるまで
のライフサイクルについて見てみよう。
20
(1) ビューの復元


WebブラウザからのリクエストがあってJSFのア
プリケーションが呼ばれた場合、ライフサイクル
はこのフェーズからはじまります。
2つのパターンがある


このJSFアプリケーションに対する、最初のリクエスト
である場合
JSFアプリケーション内でのページ遷移によって、JSF
ページにアクセスがあった場合
21
(1) ビューの復元

このJSFアプリケーションに対する、最初の
リクエストである場合


空のUIコンポーネント・ツリーを生成
「(6)レスポンスのレンダリング」フェーズに移る
22
(1) ビューの復元

JSFアプリケーション内での
ページ遷移によって、JSF
ページにアクセスがあった場
合

サーバかクライアントからUIコ
ンポーネント・ツリーを復元
23
(2) リクエスト値の適用


リクエストのパラメータ
情報をUIコンポーネン
ト・ツリーに設定する。
guessNumber の場合、
h:inputTextタグに入力
された “9” が UIInput
にセットされる。
24
(2) リクエスト値の適用
アクションイベントの発生




h:commandButton や h:commandLink
が押された場合
「アクションイベント」が発生して
アクションイベントが「イベント・キュー」に
蓄えられる。
これらのイベントをどのフェーズで処理する
か、アプリケーション制作者が調整できる。
25
(2) リクエスト値の適用
immediate / アクションイベント
<h:commandButton immediate=“true”
action=“cancel” value=“キャンセル” />


immediate属性の値が true のとき、アクションリ
スナへの通知とアクションの実行は、このフェー
ズで行われる。
これ以降のフェーズ (Managed Bean への値の
設定など) を実行せずとも処理できるので、キャ
ンセルボタンなどの実現に使われる。
26
(2) リクエスト値の適用
immediate / アクションイベント


immediate属性の値が false のとき、アク
ションリスナへの通知とアクションの実行
は、「(5) アプリケーションの起動」フェーズ
で行われる。
デフォルト値は false
27
(2) リクエスト値の適用
immediate/Value Changeイベント
<h:inputText immediate=“true”
value=“#{bean.quantity}” />


h:inputText などで値が変更された場合
immediate属性の値が true のとき、このフェー
ズで当該コンポーネントに関する次の処理が行
われる。




コンバータ
バリデータ
Managed Bean のプロパティへの値のセット
Value Change リスナの実行
28
(2) リクエスト値の適用
immediate/Value Changeイベント


immediate属性の値が false のとき、
Value Change リスナへの通知とリスナの
実行は、「(5) アプリケーションの起動」
フェーズで行われる。
デフォルト値は false
29
(3) 入力値の検証



バリデータが設定されているときに実行さ
れる。
(必要があれば)まずコンバータを実行
次にバリデータを実行


成功なら → Value Change イベントがイベン
トキューに蓄えられる
失敗なら → 「(6) レスポンスのレンダリング」
フェーズに移る
30
(3) 入力値の検証
guessNumber では

Validator である
UserNumberBean#validate メソッドを実
行している
31
(4) モデル値の更新


UIコンポーネント・ツリーの値を Managed
Bean のプロパティにセット。
必要があれば、まずコンバータを実行する


失敗なら → 「(6) レスポンスのレンダリング」
フェーズに移る
Value Binding 式で指定された Managed
Bean のプロパティに、UIコンポーネントの
値をセットする。
32
(4) モデル値の更新
guessNumber の場合



h:inputText の Value Binding 式で指定さ
れている userNumber プロパティは
Integer 型である。
まずコンバータを実行して、入力データを
Integer に変換する。
その後で userNumber プロパティに格納
する。
33
(5) アプリケーションの起動

イベントキューの中身をリスナに通知する。




アクションイベント
Value Change イベント
Action Method を実行する。
次の遷移先を決定する。
34
(5) アプリケーションの起動
guessNumber の場合
<h:commandButton id="submit"
action="success" value="Submit" />

action 属性の値と faces-config.xml での
設定によって、次の画面遷移先が決まる。
35
(6) レスポンスのレンダリング

これまでのフェーズで、次はどの画面に移
り変わるかわかっている。


通常は「(5) アプリケーションの起動」で遷移先
が決まる。
これまでのフェーズでエラーが起きているため、
元の画面にとどまる場合もある


「(3)入力値の検証」でエラーが起きた。
「(4)モデル値の更新」でエラーが起きた。
36
(6) レスポンスのレンダリング
遷移先で





遷移先に移り変わる。
UIコンポーネント・ツリーを生成する。
Managed Bean の値をUIコンポーネント・
ツリーに設定する。
レスポンスで返す HTML を生成する。
UIコンポーネント・ツリーを保存する。

サーバかクライアントに
37
(6) レスポンスのレンダリング
guessNumber の場合


h:inputText の action 属性の値と facesconfig.xml の設定によって、response.jsp に遷
移する。
response.jsp では、Managed Bean の
response プロパティの値をUIコンポーネントに
設定する。


このとき、「あたり」か「はずれ」かをチェックする
UIコンポーネント・ツリーから HTML を生成する。
38