[salesforce]Visualforceページ表示処理の実行順序
Visualforceページ内処理の実行順序は、普通にページにアクセスした場合と(GETリクエスト)、ページ内でボタンを押すなどして何かしらのポストバックリクエストを行った場合で異なります。
普通にページにアクセスしたとき
単純にVisualforceページにアクセスした時には、以下のような順序で描画処理が行われます。
- 対象のVisualforceページのコントローラと、そのextensionに指定されたコントローラのコンストラクタが呼び出されて、コントローラのインスタンス化が行われます。
- Visualforceページ内でカスタムコンポーネントを使っている時にはそれらが呼び出されて、そのコントローラもしくはextensionのコンストラクタが実行されます。カスタムコンポーネントに属性値が式で設定されている場合は、コンストラクタの実行後に評価されます。
- その後Visualforceページは、カスタムコンポーネント内の全てのassignTo属性を実行します。その後、<apex:page>タグのaction属性のメソッドが評価されて、その後全てのgetterメソッド、setterメソッド、プロパティが呼び出されます。
- もしページ内に<apex:form>タグがある場合は、最終的にデータベースに保存する必要がある全ての情報は、ページ遷移をする途中で受け渡されるビューステートに暗号化されて保持されます。
- その後、ユーザのブラウザにHTML情報が返されます。そしてJavaScriptやFlashなどのクライアントサイドでブラウザ上で行われる処理が実行されます。
ポストバックリクエストを送信したとき
ポストバックリクエストとは、formタグからPOST送信をする送信先が送信元と同じページの場合のPOSTリクエストのことをいいます(たぶん)。Visualforceページ上で<apex:form>タグを使って保存処理とか更新処理とかのポストバックリクエストを行った場合は、以下の順番で処理が行われます。
- 暗号化されたビューステート情報がデコードされます。
- ページのコントローラとextension、カスタムコンポーネントのコントローラとextensionの中のsetメソッドが実行されます。
- ポストバックリクエストを実行した大元のアクションメソッドが実行されます。無事完了すればデータも更新されます。ポストバックリクエストのリターンページとして同一ページが返される場合は、ビューステートの値は更新されたものになります。
※ちなみに、<apex:page>タグのaction属性のメソッドは、ポストバックリクエスト時には評価されず、GETリクエストで直接そのページにアクセスされた場合にのみ評価されます。 - 結果のHTMLがユーザのブラウザに返されます。
pageReferenceオブジェクトのsetRedirectを使ってリダイレクトを行う時に、上記二つのGETリクエスト、ポストバックリクエストを使い分けることが出来ます。基本的には、setRedirectをtrueにするとGETリクエスト、falseにするとポストバックリクエストが実行されます。ただし、falseの場合でも例外があります。falseの場合でもリダイレクト先のページがリダイレクト元のページと同一のコントローラとextensionを使っている場合に限りポストバックリクエストが実行されます。それ以外の場合はfalseの場合もGETリクエストが実行されることになります。
GETリクエストで別ページにリダイレクトした場合には、ビューステートやコントローラオブジェクトは全て破棄されます。