1

我对 org.omnifaces.util.Faces#redirect 和对话范围 bean 有疑问:

有一个按钮

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

在我的对话范围 bean 初始化之后,它必须在同一对话范围内导航到 createCar 页面: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 中返回所需的结果 - 然后它工作正常。

也许我不了解这两种导航方法之间差异的每一个细节。如果有人可以帮助我理解问题,我将不胜感激。

谢谢!

4

1 回答 1

3

对话传播由导航处理程序处理。不使用导航处理程序的Faces#redirect()委托。ExternalContext#redirect()你最好Faces#navigate()改用 which delegates to NavigationHandler#handleNavigation()

public void gotoCreateCar() {
    // ...

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

(注意:<navigation-case>在这种情况下不需要)

或者,只需从 action 方法中准确返回该字符串。

public String gotoCreateCar() {
    // ...

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

仅当Faces#navigate()您处于不支持返回导航案例结果的(侦听器)方法中时才有用,例如@PostConstructor preRenderView

于 2014-06-17T08:52:19.033 回答