Omnifaces面孔.重定向失去会话作用域



我对org.omnifaces.util有问题。面#redirect和conversation作用域bean:

there is a button

<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的init之后在同一会话范围内做一个导航到createCar页面:

在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中只返回所需的结果-然后它就可以正常工作了。

也许我没有完全理解这两种导航方法之间的差别。如果有人能帮助我理解这个问题,我会很感激的。

谢谢!

对话传播由导航处理程序处理。Faces#redirect()委托给不使用导航处理程序的ExternalContext#redirect()。您最好使用Faces#navigate(),而不是委托给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()仅在不支持返回导航用例结果(如@PostConstructpreRenderView)的(侦听器)方法中才有用。

相关内容

  • 没有找到相关文章

最新更新