0

これが私がやろうとしていることの例です。

sessionScoped Bean 内

SessionBeanloadRecord(){
Do something
ViewScopedBean viewScopedBean = (ViewScopedBean) context.getApplication().evaluateExpressionGet(context, "#{viewScopedBean}", ViewScopedBean.class);
return viewScopedBean.viewScopedBeanLoadRecord();
}

viewScoped Bean 内

ViewScopedBeanloadRecord(){
Retrieve and populateFields    
return "viewRecord.xhtml";    
}

したがって、簡単に言うと、別のビュー (listRecords.xhtml) にある別の Bean からビュー スコープ Bean 内のメソッドを呼び出したいと思います。これを実行すると(標準のコマンドリンクを使用するだけで)、セッション Bean は期待どおりに動作し、viewScoped Bean が作成され、ViewScopedBeanloadRecord メソッドが呼び出されますが、viewScoped Bean が再作成されます(コンストラクターが再度呼び出されます)が、今回は ViewScopedBeanloadRecordは実行されず、ページは空白のフィールドで読み込まれます。

ビュー スコープ Bean は、同じビューにとどまるために null を返す (または void メソッドがある) 場合にのみ有効であることは理解していますが、その後、listRecords.xhtml から viewRecord.xhtml に移行して load メソッドを実行するにはどうすればよいでしょうか?

viewRecord.xhtml ビューにアクセスすると、(別のブラウザー ウィンドウで) より多くのレコードを同時に読み込む必要があるため、セッションでレコードを保持できません。

注: 会社のポリシーに基づいて、実際のコードを投稿することは許可されていないため、この例に限定されます。ごめん!

どんな助けでも大歓迎です!

ありがとう

エリック

4

2 に答える 2

0

Requestscoped、Viewscoped、および @PostConstruct と格闘してさまざまな組み合わせを試した後、このシナリオを適切に機能させることができませんでした。また、ビルドする xhtml ファイルを決定するために Bean のプロパティに依存する動的インクルード ファイルを使用しています。

そこで、完全にセッション ベースのソリューションを採用しました。

viewScoped または requestScoped Bean の代わりに、セッション Bean 内に「レコード」タイプのプロパティを作成し、セッション Bean のビュー レコード メソッドが呼び出されるたびに、以前のレコード プロパティを新しいものに置き換えてから、表示レコード ビューに転送しました。そのため、ビュー レコード メソッドへの新しい呼び出しごとに上書きされる一種の「リクエスト」レコード プロパティが作成されました。そのため、最後に記録された表示のみがセッションに残ります。

問題を解決する可能性のあるタグについて読みました<t:saveState>が、プロジェクトとして、JSF の上に追加のフレームワークを使用しないことが決定されたため、それはオプションではありませんでした。

于 2012-08-14T19:38:18.910 に答える
0

同様の問題があり、@SessionScopedセッション全体で Bean をバッキング Bean として使用することで解決しました。@ViewScopedセッションで必要なデータを管理する他の@RequestScopedBeanに注入します。

もう 1 つの回避策は、GET パラメーターを使用することです。

Bean のライフ サイクルを思い出し、データを汚染する目的でさまざまな関数を使用します。@PostConstruct注釈も非常に便利です。

幸運を :)

于 2012-08-14T08:20:01.447 に答える