質問

私は、トラフィックの高いウェブサイトで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> タグ、セッションには何も保存されていません。

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

役に立ちましたか?

解決

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

自分でテストするには、次のように状態のオンとオフを切り替えます context-paramweb.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).

参照:

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top