【问题标题】:Omnifaces Faces.redirect loses conversation scopeOmnifaces Faces.redirect 失去对话范围
【发布时间】:2014-08-07 04:37:52
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: jsf redirect jsf-2.2 omnifaces conversation-scope


    【解决方案1】:

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

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

    (注意:在这种情况下不需要&lt;navigation-case&gt;

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

    public String gotoCreateCar() {
        // ...
    
        return "/portal/createCar.xhtml?faces-redirect=true";
    }    
    

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

    【讨论】:

    • 好的,谢谢!你能解释一下 ExternalContext#redirect 和导航处理程序重定向之间的区别吗?
    • 一个不使用 JSF 导航处理程序,而另一个使用。
    • 所以导航处理程序除了重定向之外还处理对话,而 ExternalContext 只是进行普通重定向?抱歉,我只是想为我澄清一下这个问题。
    • 是的。正如所回答的,对话传播由 JSF 导航处理程序处理。 ExternalContext#redirect() 不使用 JSF 导航处理程序。它只是在响应上设置“普通香草”HTTP Location 标头,而不对给定路径进行任何操作。 JSF 导航处理程序支持对此进行更细粒度的控制,例如它可以将给定路径解释为(相对)JSF 视图 ID,并基于例如执行一些附加操作。当前会话状态,或者faces-redirectincludeViewParams等附加的具体参数。
    • 请注意,我的答案中的蓝色文本实际上是指向文档的链接(像往常一样)。单击它们以查看和阅读文档。那边也有说明。
    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多