第 8 章 Component Binding 61
10.4 ライフサイクルの詳細
それでは、
guessNumber
サンプルアプリケーションの動作を確認しながら、ライフサイ クルの各フェーズの動きを追ってみましょう。guessNumber
サンプルアプリケーションは、第1回(2005
年1
月号)
でもご紹介したよ うに、Duke
くんが考えている数を当ててみるアプリケーションです(
図10.3
参照)
。ここでは、
Web
ブラウザで0
〜10
までの数を入力して”Submit”
ボタンを押すとWeb
ブ ラウザからJSF
のアプリケーションに対してリクエストが行われます。その後でレスポン スとして「あたり」か「はずれ」の画面が出力されます。このリクエストからレスポンス にいたるまでのライフサイクルについて見ていきます。図
10.3: guessNumber
の動作10.4.1 (1)
ビューの復元Web
ブラウザからのリクエストがあってJSF
のアプリケーションが呼ばれた場合、ラ イフサイクルはこのフェーズからはじまります。このフェーズには、次の2つのパターンがあります。
• この
JSF
アプリケーションに対する、最初のリクエストである場合•
JSF
アプリケーション内でのページ遷移によって、JSF
ページにアクセスがあった 場合Web
ブラウザからのリクエストが、このJSF
アプリケーションに対する、最初のリク エストである場合には、次のような手順で処理が実行されます。1.
空のUI
コンポーネント・ツリーを生成2.
「(6)
レスポンスのレンダリング」フェーズに移るJSF
アプリケーション内でのページ遷移によって、JSF
ページにアクセスがあった場合 には、1.
サーバかクライアントから、保存されているUI
コンポーネント・ツリーを復元 という処理が行われます。guessNumber
では、前掲の図10.1
の画面に対応する、図10.2
のようなUI
コンポーネ ント・ツリーが復元されます。10.4.2 (2)
リクエスト値の適用このフェーズでは、リクエストのパラメータ情報を、
UI
コンポーネント・ツリーに設定 します。guessNumber
の場合、図10.1
のように、h:inputText
タグに入力された”9”
がUIInput
にセットされるのです。アクションイベント
h:commandButton
やh:commandLink
が押された場合、アクションイベントが発生し て、アクションイベントが「イベント・キュー」に蓄えられます。このとき、これらのイベントをどのフェーズで処理するか、アプリケーション制作者が 調整できます。
JSP
でのh:commandButton
タグで、以下のようにimmediate
属性の値がtrue
になっ ているとき、アクションリスナへの通知とアクションの実行は、このフェーズで行われます。これ以降のフェーズ
(Managed Bean
への値の設定など)
を実行せずとも処理できるの で、キャンセルボタンなどの実現に使われます。<h:commandButton immediate="true"
action="cancel" value="キャンセル" />
immediate
属性の値がfalse
のとき、アクションリスナへの通知とアクションの実行は、「
(5)
アプリケーションの起動」フェーズで行われます。immediate
属性を指定しなかった ときのデフォルト値はfalse
になります。Value Change イベント
<h:inputText immediate="true" value="#{bean.quantity}" />
h:inputText
などで値が変更された場合、immediate
属性の値がtrue
のとき、このフェー ズで当該コンポーネントに関する次の処理が行われます。1.
コンバータ2.
バリデータ3. Managed Bean
のプロパティへの値のセット4. Value Change
リスナの実行immediate
属性の値がfalse
のとき、Value Change
リスナへの通知とリスナの実行は、「
(5)
アプリケーションの起動」フェーズで行われます。immediate
属性を指定しなかった ときのデフォルト値はfalse
になります。10.4.3 (3)
入力値の検証バリデータが設定されているときに実行されます。
(必要があれば)まずコンバータを実行します。その後でバリデータを実行します。
バリデータが成功なら、
Value Change
イベントがイベントキューに蓄えられます。失 敗なら、「(6)
レスポンスのレンダリング」フェーズに移ります。guessNumber
では、Validator
であるUserNumberBean.validate
メソッドを実行してい ます。10.4.4 (4)
モデル値の更新このフェーズでは、
UI
コンポーネント・ツリーの値をManaged Bean
のプロパティに セットします。必要があれば、まずコンバータを実行します。コンバータに失敗したら、「
(6)
レスポン スのレンダリング」フェーズに移ります。その後で、
Value Binding
式で指定されたManaged Bean
のプロパティに、UI
コンポー ネントの値をセットします。guessNumber
の場合には、h:inputText
のValue Binding
式で指定されているuserNum-ber
プロパティはInteger
型になります。そこで、まずコンバータを実行して、入力データ をInteger
に変換します。その後でuserNumber
プロパティに格納するのです。10.4.5 (5)
アプリケーションの起動このフェーズでは、まずこれまでイベントキューに蓄積されたアクションイベントと
Value Change
イベントを、それぞれのイベントに通知します。その後で
Action Method
を実行します。そして、次の遷移先が決まります。
guessNumber
では、action
属性の値とfaces-config.xml
での設定によって、次の画面遷 移先が決まります。<h:commandButton id="submit" action="success" value="Submit" />
10.4.6 (6)
レスポンスのレンダリングこのフェーズでは、遷移先画面の
UI
コンポーネントツリーから、ブラウザに返すレス ポンスを生成する処理を行います。そのためには、まず遷移先画面がどこかわかっている必要があります。しかし、これま でのフェーズで、次はどの画面に移り変わるかわかっているはずです。
通常は「
(5)
アプリケーションの起動」で遷移先が決まります。しかし、次のようなケー スでは、エラーが起きているため、元の画面にとどまる場合もあります。• 「
(3)
入力値の検証」でエラーが起きた。• 「
(4)
モデル値の更新」でエラーが起きた。遷移先が決定すると、次の順番で処理が行われます。
1.
遷移先に移り変わる。
ドキュメント内
1 JSF JSF JSF MVC 2 We
(ページ 93-98)