JSF 2.0部分状態の節約は機能しないようです
-
10-10-2019 - |
質問
私は、トラフィックの高いウェブサイトで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-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
).