何らかのメソッドが呼び出されたときにJSFバッキングBeanによってリセットしたい。コマンドボタンがあり、誰かがそれを押して、成功したトランザクションの後に、私のViewまたはSessionスコープのJSF beanをリセットする必要があるとします。それを行う方法はありますか?JSFバッキングBean(ビューまたはセッションスコープ)をリセットする
感謝
何らかのメソッドが呼び出されたときにJSFバッキングBeanによってリセットしたい。コマンドボタンがあり、誰かがそれを押して、成功したトランザクションの後に、私のViewまたはSessionスコープのJSF beanをリセットする必要があるとします。それを行う方法はありますか?JSFバッキングBean(ビューまたはセッションスコープ)をリセットする
感謝
私はViewスコープの解決策を見つけました。
public static void removeViewScopedBean(String beanName)
{
FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(beanName);
}
ビューでは、アクションメソッドから非null
または非void
を返すとき、それは同じビューに戻って行くだろう場合でもBeanは、再作成されますスコープ。だから、ただそれだけで空の文字列だ場合でも、アクションメソッドからString
を返す:
public String submit() {
// ...
return "";
}
が、それは完全なものにするには、返された結果に?faces-redirect=true
クエリ文字列を追加することで、リダイレクトを送信考えることができます。
public String submit() {
// ...
return "viewId?faces-redirect=true";
}
セッションスコープのBeanは、現在達成しようとしているものの間違ったスコープです。問題のBeanはビュースコープのものであったはずです。これを無視して、アクションメソッドでモデルを再作成するか、セッションを完全に無効にすることができます(他のビューやセッションスコープのBeanもすべて破棄します。
バッキングビーンがセッションスコープで、まだ上記の結果を得たい場合はどうすればいいですか? –
ちょうどすべてクリアビュー:
FacesContext.getCurrentInstance().getViewRoot().getViewMap().clear();
と、すべてのビューに
私はこれがより好きです - あなたは個々の豆が残っていることに気を付ける必要はありません...清潔なスレート - すべてをクリアします。 – Falco
をSerializableを実装することを忘れないでください、あなたはまた、JavaScriptからページを更新することができ、そうViewScoped Beanがresetedされますたとえば、プリムコマンドのコマンドボタン:
<p:commandButton value="Button" action="#{bean.someAction()}" oncomplete="location.reload()"/>
これはちょっと面倒なだけで、ビュースコープのBeanには必要ないはずです。 – BalusC
@BalusC必要はないはずですが、ユーザーがページを閉じるとき(Tabを閉じるかカスタムURLを入力することで)、Beanが破棄されます。セッションが無効になるまで、View Beanは破棄されません。だからビューはなくなりましたが、Beanはまだそこにあります - これが唯一の方法だと思われます。そして、セッションは他のタブがまだアクティブである限り、無効にすることはできません... – Falco