2010-12-08 21 views
3

私はどの範囲を使用すべきか混乱しています。JSF 2:どのようなスコープを使用しますか?

ここでは、ページの閲覧 - ページヘッダー - ページの詳細など、その詳細のヘッダー - ページのサブディテールの4つのレベルからなるモジュールがあります。自分のマネージドビーンが各ページにあると思っています。

レベル4(サブ詳細ページ)の最も深いレベルは、外部レベルの他のすべてのマネージドビーンの状態にアクセスできます。レベル3(詳細ページ)は、レベル2のマネージドビーンの状態(ヘッダーページ)とレベル1のマネージドビーンの状態(ブラウズ)にアクセスできます。深いレベルのページは、外側のレベルで他の状態にアクセスする必要があるため

外managedbeanの文句を言わないが、より深いmanagedbeanの状態行うことはありませんリクエストスコープを使用して

にアクセスすることができます。

セッションスコープを使用しますが、ユーザーが無関係の他のプログラムモジュールに切り替えるとメモリが消費され、未使用のBeanはセッション中はメモリに残ります。また、これらのページのチェーンを別のタブで開くこともできません。

ウィザードスタイルのページやクイズページのような明確なbegin()とend()がありませんので、会話スコープを使用すると混乱します。ユーザーはこれらのページを使用してn個前のページに戻り、任意のページでアクションを実行できます。

ビュースコープの使用は可能ですが、あるページから別のページに渡すパラメータを使用する必要があります。より深いレベルのBeanは外部Beanにアクセスできませんが、前のページから文字列パラメータを受け取ることができます。これは以前の管理対象Beanで実行された可能性があるデータベースの多くの情報を再度照会する必要があるかもしれないので、これはちょっと醜いです。

私は間違っていると思いますか?

あなたの考えをお伝えください。

は、JSF 2の新しいフラッシュスコープはあなたを助けるかもしれない
アルバート・カム

+0

パラメータを使用して、HTTPリクエストパラメータについて話していますか? – BalusC

+0

あるビュースコープから別のビュースコープにビューパラメータを渡すと、ソースページのh:buttonとf:paramのネスト、f:viewParamのネストf:viewParamの出力が目的のページにあります。私自身は確かではありませんが、ビューのスコープ内のあるページから別のページにパラメータを渡すために今私が考えることができるものだけです。 – bertie

答えて

3

、ありがとうございます。一度読んだ後にクリアされるSessionスコープのように考えてください。それはアノテーションではなく、マップであるという点で、他のスコープとは少し異なります。あなたは、page2がflashスコープで必要とするpage1からのすべての情報を置くことができ、page2のPostConstruct annotedメソッドを読んでから、3ページ目以降に必要なすべてのデータを入れることができます。やや乱雑ですが、少なくともビューのパラメータを使う必要はありません。実際の管理BeanはRequestscopedにすることができます。あなたが短い例hereを見つけることができます

Level1Bean

@public String toLevel2Button(){ 
    ELFlash.getFlash().put("data1", object1); 
    ELFlash.getFlash().put("data2", object2); 
    return "level2"; 

Level2Bean

@PostConstruct 
public void init(){ 
    object1 = (MyType1)ELFlash.getFlash().get("data1"); 
    object2 = (MyType2)ELFlash.getFlash().get("data2"); 
} 

public String toLevel3(){ 
    ELFlash.getFlash().put("data1", object1); 
    ELFlash.getFlash().put("data2", object2); 
    ELFlash.getFlash().put("data3", object3); 
    return "level3"; 
} 

:それは次のようになります。フラッシュスコープはビューから直接読み取ることができます。この他にも、ビューパラメータを使用せずにビュー間でデータを転送する方法は考えられません。

+0

ああ私の良さ。私は一度それについて読むが、忘れてしまった。私は十分にあなたに感謝しない!!!!!!ありがとうございました !! – bertie

+0

"一度読んだ後にクリアされました" - それは理論上の考えです。実際にはそうでなければ素晴らしいアイデアの非常にバグの実装のためにそれはあまりにも悪いことに動作しません。 –