2012-10-03 29 views
2

我有頁面1,導航到頁面2的按鈕,頁面2添加一些消息並導航回頁面1。我想在第1頁上顯示這些消息。我嘗試了很多解決方案,但沒有任何工作。JSF - 從@PostConstruct重定向後保留面孔信息

示例代碼page1.xhtml:

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

在Managed Bean:

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

第2頁託管bean

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

兩個豆視圖作用域和兩個頁面都<p:messages>在身體的盡頭。

+0

您是否嘗試過使用導航? – KSHiTiJ

回答

1

首先,我不完全確定@PostConstruct是執行重定向的最佳位置。請參閱this。話雖如此,谷歌翻了起來this,它看起來很合理。嘗試使用接近頁面頂部的preRender事件標記在facelets頁面內重定向。歡呼聲

+0

但我相信這並不能解決上述問題。 – KSHiTiJ

+1

起初我使用http://ocpsoft.org/java/persist-and-pass-facesmessages-over-page-redirects/,但它沒有工作,我不得不改變'afterPhase()',現在沒關係。 – mm1

-1

只需使用nevigation。它一定會奏效。檢查下面的代碼。 public String redirect()throws Exception FacesContext.getCurrentInstance()。addMessage(「Msg1」,new FacesMessage(「Message 1 is」)); //FacesContext.getCurrentInstance().getExternalContext().redirect("/Sam/page2.jsf「); 返回「page2」; }

+0

但我需要從PostConstruct或preRenderView重定向,這些都是無效的方法... – mm1

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 demo page

和只是一個簡單的方法<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中已經修復。