JSF 2.0以降、以前の回答に追加して、partial state saving
デフォルトで何かが使用されています。
JSF (Facelets) のデフォルトのビュー記述言語は、リクエストごとに元の Facelet からコンポーネント ツリー全体を作成し、対応するタグ属性からコンポーネントを初期化します。次に、状態をマークします。
後続のすべての状態変更はデルタ変更として記憶され、実際に保存されるのはこの状態です。単にそのような変更がなく、ビューステートが空であることが判明する可能性があります (バグのため、状態が完全に空になることはありませんでしたが、最近修正されました。http://java.net/を参照してください)。詳細はjira/browse/JAVASERVERFACES-2203 )
ですから、大きな問題は、空でない場合、実際にこの状態にあるのは何ですか?
BalusC がすでに述べたように、これはコンポーネント ツリーへの動的な変更を保持できます。これらの変更は、バッキング Bean から、または静的コンポーネント内から開始できます。この動的な変更を行うコンポーネントの種類の簡単な例は、データ セット内の実際の列数に基づいて子列コンポーネントを作成するテーブル コンポーネントです。
ビュー ステートのもう 1 つの重要な使用法は、コンポーネント内で変更されたがモデルにプッシュされていない値を記憶することです。これは、スイッチ コンポーネントのスイッチのフリック、ダイヤル コンポーネントのスライダーの移動などです。
特定の例の 1 つは、viewParam
初期化に使用した要求パラメーター (GET のクエリ文字列パラメーターまたは顔以外の POST パラメーター) を記憶するコンポーネントです。詳細については、これを参照してください: http://arjan-tijms.omnifaces.org/2011/07/stateless-vs-stateful-jsf-view.html
また、UI の状態を記憶するステートフル コンポーネントと、失敗した変換または検証との強い関係もあります。この場合、UI コンポーネントはユーザーが入力した値を記憶し、変換/検証エラーがあったことを記憶します。
状態のさらに別の用途は最適化です。一部のコンポーネントは、計算にコストがかかると思われる値を計算し、ビュー ステートに格納します。たとえば、UIInput コンポーネントは、最初のポストバックの後にこれを行います。
private boolean validateEmptyFields(FacesContext ctx) {
if (validateEmptyFields == null) {
ExternalContext extCtx = ctx.getExternalContext();
String val = extCtx.getInitParameter(VALIDATE_EMPTY_FIELDS_PARAM_NAME);
if (val == null) {
val = (String) extCtx.getApplicationMap().get(VALIDATE_EMPTY_FIELDS_PARAM_NAME);
}
if (val == null || "auto".equals(val)) {
validateEmptyFields = isBeansValidationAvailable(ctx);
} else {
validateEmptyFields = Boolean.valueOf(val);
}
}
return validateEmptyFields;
}
これvalidateEmptyFields
がビューステートに保存された後、次のフォーム送信時に再度計算する必要はありません。ユーザーが再計算するか保存するかを選択できるようになれば、改善されるでしょう (よく知られている時空間最適化)。
状態の概念そのものが、初期の概念から Web アプリケーション開発を悩ませてきました。誰もが本質的にステートフルなインタラクションを望んでいますが、それを処理したり考えたりしたいと思う人はほとんどいません。
JSF はここで答えを出そうとしていますが、明らかに完璧ではなく、改善の余地があります。ビューステート(空のビューステートであっても)を復元できるというJSFの主張は面倒な場合がありますが、別の回答で述べたように、CSRFに対する暗黙的な保護を提供します。JSF 2.2 は、より明示的な CSRF 保護を取得する予定です (例: http://arjan-tijms.omnifaces.org/p/jsf-22.html#869を参照)。そのため、将来、ここで何らかの変更が行われる可能性があります。
コンポーネントごとに状態をオフにするオプションがあり、フレームワークが (ASP.NET のように) できない場合に状態を復元するための簡単なフックがあることも役立つ場合があります。