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
© Copyright 2024 ExpyDoc