4

ユーザーがクリックしたときに新しいタブを開くにはどうすればよいp:commandButtonですか?また、FlashScopeを使用していくつかのパラメーターを新しいページに渡したいと思います。コードは次のとおりです。

<h:form>
  <p:commandButton value="open new tab" action="#{myBean.newTab}"/>
</h:form>

public String newTab() {
  Faces.setFlashAttribute("foo", bar);
  return "otherView";
}

otherViewページで、f:event type="preRenderView"Flashパラメータを読み取るために使用します。2つのメモ:

  1. URLパラメータではなく、FlashScopeを使用する必要があります。
  2. 可能であれば、メソッドを変更newTab()preRenderView()たくありません。

手伝ってくれてありがとう

4

1 に答える 1

6

フォームで使用target="_blank"して、フォームの同期応答を新しい(空白の)タブ/ウィンドウに表示する必要があることをブラウザに通知します。<p:commandButton>同期リクエストにするために必要なのは、のajax動作をオフにすることだけです。

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

バッキングBeanを変更する必要はありません。意図したとおりに機能します。アクションメソッドではPOST-Redirect-GETパターンのみを使用することをお勧めします。

return "otherView?faces-redirect=true";

それ以外の場合、新しいタブには元のページのURLが表示され、F5でPOSTが再度呼び出されます。また、このようにフラッシュスコープも実際に使用されるように設計されています(リダイレクトしなかった場合は、リクエストスコープに保存するだけで十分でした)。


更新:コメントによると、最初のタブ/ウィンドウのビュースコープのBeanはこの方法で強制終了されます。Stringナビゲーションケースの結果を返すことによって。そうです、ビュースコープのBeanを存続させたい場合は、ナビゲーションケースをFaces#redirect()呼び出しに置き換えます(実際にそこで使用しているのはOmniFacesFaces#setFlashAttribute()であると想定しています)。リダイレクトが発生することをフラッシュスコープに指示するには、事前に設定Flash#setRedirect()する必要があります。true

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