2014-06-17 72 views
1

我有org.omnifaces.util.Faces#問題重定向和會話範圍的bean:Omnifaces Faces.redirect失去談話範圍

有一個按鈕

<p:commandButton action="#{navigationHandler.gotoCreateCar}" 
    actionListener="#{createHandler.init(searchHandler.search())} 
    value="#{msg.search}" update=":articleSearchForm"> 
    <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/> 
</p:commandButton> 

必須做一個導航createCar頁面在對話範圍的bean的init初始化後的同一個對話範圍內:createHandler。

在NavigationHandler#gotoCreateCar只是調用Faces.redirect(createCarPage)。

如果我這樣做,參數cid不會被轉移,我失去了我的談話。

如果我定義faces-config.xml中的導航規則:

<navigation-case> 
    <from-outcome>createCar</from-outcome> 
    <to-view-id>/portal/createCar.xhtml</to-view-id> 
    <redirect /> 
</navigation-case> 

,並在NavigationHandler#gotoCreateCar只返回所需的結果 - 然後正常工作。

也許我不明白這兩種導航方法之間的區別。如果有人能幫我理解這個問題,我將不勝感激。

謝謝!

回答

3

對話傳播由導航處理程序處理。 Faces#redirect()代表ExternalContext#redirect()不使用導航處理程序。您最好使用Faces#navigate()而不是代表NavigationHandler#handleNavigation()

public void gotoCreateCar() { 
    // ... 

    Faces.navigate("/portal/createCar.xhtml?faces-redirect=true"); 
} 

(注:沒有<navigation-case>需要在這種情況下)

另外,剛剛從操作方法只返回該字符串。

public String gotoCreateCar() { 
    // ... 

    return "/portal/createCar.xhtml?faces-redirect=true"; 
}  

Faces#navigate()當你不支持返回導航的情況下的結果,如@PostConstructpreRenderView一(聽衆)方法中是唯一有用的。

+0

好的,謝謝!你能否解釋一下ExternalContext#重定向和導航處理程序重定向之間的區別? – golinko

+0

其中一個不使用JSF導航處理程序,而另一個不使用。 – BalusC

+0

所以導航處理程序處理交談,另外重定向和ExternalContext只是做簡單的重定向?對不起,我只是試圖爲我澄清這個問題。 – golinko