理系学生日記

おまえはいつまで学生気分なのか

JSFにおけるPostback、そしてライフサイクル

JSF における Postback とは何なのか、っていうのはなかなか本を見てもわかりませんでした。 かといって、こういう概念は実装してもよくわかんなかったりするので、こういうのはやっぱり公式ドキュメントを読んで理解した方が良いだろうと、そこで学んだことを書き留めておきたいと思います。

JSF の仕様書をパッと見たのですが、postback というのはあまり定義されていないようで、もはや前提知識なのかなとも感じました。 そういうわけなので、仕様書からではなく、Oracle の JSF のチュートリアルから引用します。

The request-response lifecycle handles two kinds of requests: initial requests and postbacks. An initial request occurs when a user makes a request for a page for the first time. A postback request occurs when a user submits the form contained on a page that was previously loaded into the browser as a result of executing an initial request.

https://docs.oracle.com/javaee/7/tutorial/jsf-intro006.htm

要するに、JSF におけるリクエストには 2 種類があると。

  • 初期リクエスト (initial request)
  • ポストバックリクエスト (postback request)

要するに、初期リクエストというのがユーザがページに初めてアクセスするときのリクエストで、postback request は、(既にロード済のページから) POST するときのリクエストということかな。

JSF には、リクエストの処理に明確なフェーズがあるのですが、Initial request か Postback Request かによって、個々のフェーズで何をするのか、そして、そもそもどのフェーズを通るのかというのが異なります。 せっかくチュートリアルに記載があるので、そのあたりもまとめてみました。

結論からいえば、initial request は Restore View Phase -> Render Response Phase が実行され、postback request に対しては、基本的に以下の全フェーズが実行されます。

Restore View Phase

このフェーズ自体は、Facelets として記述された View を構築し、Backing Bean 等へのメソッドとの紐付けを行うフェーズになります。

Initial Request に対しては、最初に空の View を構築し、そのまま最終的な Render Response View フェーズに移行します。このフェーズにて、View が構築され、FacesContext にその View が格納されます。ここでいう View っていうのは、たぶん UIViewRoot のことですかね。

一方、Postback Request の場合は、FacesContext の中に既にコンテキストが構築済なので、クライアントあるいはサーバ側(これは設定で切り替えられる)に保存されている状態の情報を通して、それを復元することになります。

Apply Request Values Phase

Postback の場合に行われるフェーズなのですが、ここでは View 中の各コンポーネント、たとえば InputText などが、入力された情報を読み取り、自分自身に保存するというフェーズになります。

Process Validation Phase

このフェーズも Postback で実行されるフェーズですが、各コンポーネントに登録された Validator と Converter を利用して、個々のコンポーネントに入力された値の検証と変換を行います。

Update Model Values Phase

Postback で行われるフェーズですが、ここでは検証済の入力値をコンポーネントツリー中の各コンポーネントに反映します。このフェーズで、Managed Bean にその値が反映されます。

Invoke Application Phase

アプリケーションレベルの処理を実行するフェーズです。ボタンやリンクに設定したイベントが実行されます。

Render Response Phase

View を構築して、そのレンダリングを行うフェーズです。

Initial Request に対しては、リクエストの対象となるページの View を構築して、コンポーネントツリーに登録します。

Postback に対しては、既に View が構築済・コンポーネントツリーにも登録済の状態です。もし、今までのフェーズでエラーがあったのであれば、次画面に留まり、そのエラー内容を表示することになります。

いずれも、コンポーネントツリーから XHTML が生成されます。