2

ページ1にページ2に移動するボタンがあり、ページ2にいくつかのメッセージを追加してページ1に戻ります。これらのメッセージをページ1に表示したい。私は多くの解決策を試しましたが、何もうまくいきません。

サンプル コード page1.xhtml:

<p:commandButton value="edit" action="#{bean1.edit}"/>

マネージドBeanで:

public String edit() {
  return "page2?faces-redirect=true";
}

page2マネージドBean

@PostConstruct
private void postConstruct() {
  Faces.getFlash().setKeepMessages(true);
  Messages.addFlashGlobalError("cannot edit!");
  Faces.navigate("page1?faces-redirect=true");
}

両方の Bean はビュー スコープであり、両方のページに<p:messages>は body の最後にあります。

4

3 に答える 3

2

これは、 の@PostConstruct呼び出しが遅すぎる場合に発生する可能性があります。どうやら Bean は参照されているため、ビューの比較的「遅い」(たとえば、一番下) で初めて構築されます。その時点で、応答はすでにコミットされている可能性があり、これは後戻りできないポイントです。別のビューに移動することはできなくなりました。

基本的には、レスポンスをレンダリングするinit()にメソッドを呼び出したいと考えています。OmniFaces では、次のアプローチを で使用できます。page2.xhtml

<f:metadata>
    <f:viewParam name="dummy" />
    <f:event type="postInvokeAction" listener="#{bean.init}" />
</f:metadata>

<f:viewParam name="dummy" />(そのページに独自のビュー パラメーターが既にある場合は、を削除できます。これは、INVOKE_ACTIONフェーズが確実に実行されるようにするためです。postInvokeActionデモ ページも参照してください)

そして単純な<f:event listener>方法:

public void init() {
    Messages.addFlashGlobalError("cannot edit!");
    Faces.navigate("page1?faces-redirect=true"); // Or Faces.redirect("page1.xhtml");
}

Faces.getFlash().setKeepMessages(true);不要Messages#addFlashGlobalError()です。Mojarra では、ナビゲーションが URL 内の別のフォルダーにある場合、Flash スコープは機能しないことに注意してください。両方のページが URL の同じフォルダーにある必要があります。これは、今後の Mojarra 2.1.14 で修正されます。

于 2012-10-04T14:43:52.930 に答える
1

まず第一に@PostConstruct、リダイレクトを実行するのに最適な場所かどうかは完全にはわかりません。これを参照してください。そうは言っても、グーグルはこれを発見し、それは合理的に見えます. preRenderページの上部に近いイベント タグを使用して、Facelets ページ自体内でリダイレクトしてみてください。乾杯

于 2012-10-04T04:04:00.110 に答える
-1

ネビゲーションを使用するだけです。きっとうまくいくでしょう。次のコードを確認してください。public String redirect()は例外をスローします{FacesContext.getCurrentInstance()。addMessage( "Msg1"、new FacesMessage( "Message 1 is"​​)); //FacesContext.getCurrentInstance().getExternalContext().redirect("/Sam/page2.jsf"); 「page2」を返します。}

于 2012-10-04T07:58:10.740 に答える