2012-02-27 14 views

答えて

11

私はViewスコープの解決策を見つけました。

public static void removeViewScopedBean(String beanName) 
    { 
     FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(beanName); 
    } 
+8

これはちょっと面倒なだけで、ビュースコープのBeanには必要ないはずです。 – BalusC

+0

@BalusC必要はないはずですが、ユーザーがページを閉じるとき(Tabを閉じるかカスタムURLを入力することで)、Beanが破棄されます。セッションが無効になるまで、View Beanは破棄されません。だからビューはなくなりましたが、Beanはまだそこにあります - これが唯一の方法だと思われます。そして、セッションは他のタブがまだアクティブである限り、無効にすることはできません... – Falco

10

ビューでは、アクションメソッドから非nullまたは非voidを返すとき、それは同じビューに戻って行くだろう場合でもBeanは、再作成されますスコープ。だから、ただそれだけで空の文字列だ場合でも、アクションメソッドからStringを返す:

public String submit() { 
    // ... 

    return ""; 
} 

が、それは完全なものにするには、返された結果に?faces-redirect=trueクエリ文字列を追加することで、リダイレクトを送信考えることができます。

public String submit() { 
    // ... 

    return "viewId?faces-redirect=true"; 
} 

セッションスコープのBeanは、現在達成しようとしているものの間違ったスコープです。問題のBeanはビュースコープのものであったはずです。これを無視して、アクションメソッドでモデルを再作成するか、セッションを完全に無効にすることができます(他のビューやセッションスコープのBeanもすべて破棄します。

+0

バッキングビーンがセッションスコープで、まだ上記の結果を得たい場合はどうすればいいですか? –

2

ちょうどすべてクリアビュー:

FacesContext.getCurrentInstance().getViewRoot().getViewMap().clear();

と、すべてのビューに

+0

私はこれがより好きです - あなたは個々の豆が残っていることに気を付ける必要はありません...清潔なスレート - すべてをクリアします。 – Falco

1

をSerializableを実装することを忘れないでください、あなたはまた、JavaScriptからページを更新することができ、そうViewScoped Beanがresetedされますたとえば、プリムコマンドのコマンドボタン:

<p:commandButton value="Button" action="#{bean.someAction()}" oncomplete="location.reload()"/>