8

トラフィックの多い Web サイトで JSF を使用する可能性を評価しています。JSF 2.0 では、コンポーネント ツリーはセッションに保存されず、コンポーネント ツリーが変更されるとデルタのみが保存されると言われました。

ここに私が見ているページがあります:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:h="http://java.sun.com/jsf/html">
    <body>
        <h:form>
            hello, world
        </h:form>
    </body>
</html>

このページを表示するたびに、1K 近くがセッションに割り当てられます。<form>タグを削除すると、セッションには何も保存されません。

コンポーネントツリーがセッションに保存されている理由は何ですか? これは、ポストバック要求で計算されると思います。

4

1 に答える 1

20

部分的な状態の保存は、状態がセッションに保存されないという意味ではありません。これは、コンポーネント ツリーの状態全体ではなく、コンポーネント ツリーの状態の一部が保存されることを意味するだけです。部分的な状態保存の重要なアイデアは、後続のリクエストでクライアント側によって変更されないコンポーネントの状態は保存されないということです。代わりに、ビューの復元中にサーバー側でビューを再実行することによって取得されます。クライアントによる変更に敏感なコンポーネントの状態 (フォーム、入力、ボタンなど) のみが保存されます。セッションで表示される 1K は、部分的な状態そのものです。

context-param自分でテストするには、 で次のように状態のオンとオフを切り替えますweb.xml

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

設定が の場合、サイズが大きくなることがわかります。これは、代わりにコンポーネント ツリー全体が保存されたfalseことを意味します。

これは、リクエスト スコープよりも大きなスコープを持つサーブレット API によって提供される唯一のものであるため、セッションに格納されます。リクエストスコープに保存しても、後続のリクエストでは使用できなくなるため、価値がありません。サーブレット API には、JSF のようなビュー スコープの概念はありません (これは、間接的にセッション スコープを使用して隠れています。基本的に、ビュー ステートはコンポーネント ツリーの状態です)。

クライアントが変更できるものは実際には何も残っていないため (つまり、ポストバックがないため)、フォームを削除しても実際には表示されません。その場合、状態を保存しても意味がありません。その上、保存された状態のキーを非表示の入力フィールドとして (名前でjavax.faces.ViewState) 渡すものは何もありません。

以下も参照してください。

于 2010-12-08T19:35:17.233 に答える