JSF は便利なテクノロジですが、使いこなすこともできます。
コンポーネントに大きな値を設定してビューステートのサイズを大きくしている、またはコンポーネントへの参照を他のセッション状態にリークしている (これは悪いことです) ようです。もう 1 つの潜在的な原因は、ビューが大きすぎることです (UI ツリーを簡単に作成できると、どこにでもデータ テーブルがある非常に大きなコントロール グラフが作成されることがわかりました)。IBM がリッチ テキストとスプレッドシート コントロールを提供していることは知っていますが、これらの使用が状態サイズに与える影響についてコメントすることはできません。
簡単に達成できる成果は、faces-config.xmlでセッション スコープ用に構成されたマネージド Bean を確認することです。
JSF は、リクエスト間で次の 2 つのことを保存します。
- ビュー (ページ上のすべてのコントロール)
- ビューステート (コントロールの状態)
データ テーブルの子など、一部のコントロールは複数の状態 (行ごとに 1 つ) を持つことができるため、これらは分離されています。状態は、フォームの非表示フィールド (暗号化されていない場合、大きなセキュリティ上の問題になる可能性があります) またはセッションに保存できます。同じセッションを共有する複数のブラウザ ウィンドウに対応するため (および、一部の実装では戻るボタンのサポート)、複数のビューが保存されます。
- アプリが特定のユーザーの特定の時間にセッションで保持するビュー ステートの数を設定する構成オプションが必要です。
- 保存されたビュー/ステートのサイズを測定するStateManagerを提供することで、ビュー ステートのサイズを測定できます (StateManager を受け取るパブリック コンストラクターを使用して、faces-config.xml で StateManager を構成します。詳細については、JSF 仕様のPDF を参照してください。状態はシリアライズ可能であり、ストリームにダンプすることでサイズを確認できます)。
ほとんどの IDE ビルド JSF アプリにはバッキング Bean があります。セッション Bean スコープを介して、必要以上に長く状態を保持し、セッションに負担をかける可能性があります。ページごとに 1 つのバッキング Bean が存在する傾向があるため、ページ数が多いほど問題は大きくなります。faces-config.xmlをチェックして、これが潜在的な問題の原因であるかどうかを確認してください。
他にできることは、web.xmlでHttpSessionAttributeListenerを構成することです。スタック トレースを取得して、アプリの問題領域を特定できます。