3

スコープの質問が常に出てくることは知っていますが、ソリューションへのわずかに異なるアプローチに興味があります。はと の@ViewScope間の素晴らしい架け橋です。@RequestScope@SessionScope

ただし、実際には使用したくない@SessionScopeが、いくつかのビューでデータが必要な一般的なユースケースがまだあります (少なくとも私にとっては)。非常に単純なケースは、以前の選択に応じて、複数のデータテーブルがそれぞれチェーンされている場合です。

<f:paramView>単一または複数のデータをアドレスのパラメータとして使用して渡し、データベースからすべてを再度取​​得することは完全に可能です。私は、Bean の状態/変数の「スナップショット」を作成し、新しいものを作成して@ViewScopeから、「スナップショットの状態」を新しい Bean に「復元」する方法を見つけることにもっと興味があります。

そのようなものは存在しますか?アイデア?意見?

4

2 に答える 2

2

これが「受け入れられた解決策」であるかどうかはわかりませんが、私にとって有効なアイデアを実装しました。(フィードバックは大歓迎です!)

そこで@SessionScoped、いくつかの静的マップを持つクラスを作成しました。

private static Map<String, Object> objectVariableMap;

// Getters, setters and methods etc. are omitted for simplicity

キーとして文字列を、値としてオブジェクトを受け入れるマップを指定したという考えです。任意のタイプのオブジェクトをそこに格納できるように、オブジェクトのタイプを特に設定していません。注意点は、元の型にキャストできるように、オブジェクトを取得するときにオブジェクトの型を確認する必要があることです。

ここで最初からデータを設定します@ViewScopedMapキーとしてランダムな UUID (または必要なもの) を生成し、そのを使用しているオブジェクト (つまりthis、次のビューに渡したい他のオブジェクト) に設定します。キーと値をマップに保存し、URL パラメータをキーに設定します。

URLパラメーターでユーザーIDなどのデータを渡すことに熱心ではありません(暗号化されている場合でも)。このアイデアには、指定可能な寿命を持つ使い捨ての URL 値を提供するという追加の利点があります。

受信側 (つまり、新しい@ViewScopedBean、またはその他のスコープ) で、URL パラメータ (マップ キー) を読み取り<f:paramView>、イベントを使用して、操作preRenderViewするオブジェクトを取得および設定します。

この時点で、マップからキー ペアを削除してそのオブジェクトを取得する機能を無効にするか、変更があった場合にオブジェクトを更新するだけでキー ペアを長期間保持することができます。

更新:概念的には、これは本当に成功しています (少なくとも私にとっては)。概念をより普遍的なものにするために、この概念に関連するいくつかの便利なメソッドとクラスを作成しました。より具体的な指示が必要な場合、または必要に応じて小さなライブラリを作成することさえできます。

于 2013-03-22T10:21:02.913 に答える