1

この投稿https://stackoverflow.com/a/13838907のヒントを使用して新しいタブを開きますが、古いタブに戻るとnullPointerExceptionが発生し、ViewScopedBeanデータが失われます。

<h:form target="_blank">
  <p:commandButton value="open new tab" action="#{otherBean.newTab}" ajax="false" />
</h:form>

<h:form>
  <p:commandButton value="this wll cause NPE" action="#{pageBean.action}"/>
</h:form>

最初のボタンをクリックし、前のタブに戻り、2番目のボタンをクリックします。PageBeanが再度作成され、すべてのデータが失われます。両方のBeanはViewScopedです。

4

2 に答える 2

2

String実際、最初のタブ/ウィンドウのビュー スコープ Bean は、ナビゲーション ケースの結果を返すことによって強制終了されます。あなたは戻ってきたい、nullまたはvoidそれを生かしたいと思っています。他の質問に示されているコードに基づいて、ナビゲーション ケースを呼び出しnewTab()に置き換える必要があります (実際に使用しているのがOmniFacesであると仮定します)。リダイレクトが発生することをフラッシュ スコープに指示するには、事前にを設定するだけで済みます。Faces#redirect()Faces#setFlashAttribute()Flash#setRedirect()true

public void newTab() throws IOException {
    Faces.setFlashAttribute("foo", bar); 
    Faces.getFlash().setRedirect(true);
    Faces.redirect("otherView.xhtml");
}
于 2012-12-12T14:51:05.490 に答える
1

ViewScope Bean は、同じビューにポストバックする限り存続します。

actionViewScope Bean が再作成されるため、データ内の他のビューにポストバックすると、データが失われます。

于 2012-12-12T14:45:35.450 に答える