【问题标题】:When to use NavigationHandler.handleNavigation vs ExternalContext.redirect/dispatch何时使用 NavigationHandler.handleNavigation 与 ExternalContext.redirect/dispatch
【发布时间】:2011-09-11 01:55:12
【问题描述】:

以下内容似乎是等价的:

FacesContext.getCurrentInstance().getApplication().getNavigationHandler().handleNavigation("/index.xhtml?faces-redirect=true");

FacesContext.getCurrentInstance().getExternalContext().redirect("/testapp/faces/index.xhtml");

有什么不同吗?应该在什么时候使用?

【问题讨论】:

    标签: jsf redirect jsf-2 navigation


    【解决方案1】:

    使用NavigationHandler#handleNavigation() 方法,您依赖于实现的导航处理程序。您或第 3 方可以轻松地在 webapp 中覆盖/提供它。如果您想要更细粒度的控制,这可能是有利的,但如果您根本不想有外部可控影响,这可能是不利的。使用某些 URL 和/或参数可能会导致不同的导航行为。

    ExternalContext#redirect() 在幕后立即委托给HttpServletResponse#sendRedirect(),而不涉及任何导航处理程序。因此,当使用导航处理程序可能是不利的时,这可能是一个优势。但缺点是它不处理隐式导航,也不考虑定义的导航情况。

    总而言之,这取决于 :) 如果您只想要一个完全有价值的、直接指向的重定向,请使用 ExternalContext#redirect()。如果您想通过结果而不是 URL 进行导航,请使用 NavigationHandler#handleNavigation()

    另见:

    【讨论】:

    • 我猜另一个小的区别是 NavigationHandler 方法需要一个 viewId 而 ExternalContext 方法需要一个实际的 URL。在这两种情况下,我都认为 FacesContext.getCurrentInstance().responseComplete() 是不必要的。
    • 是的,这就是我所说的“结果”。
    • 对于其他阅读这篇文章的人:另一个 API 级别的区别是 ExternalContext 方法会引发检查异常 (IOException) 而 NavigationHandler 方法不会。
    • 您不一定需要处理。无论如何它是不可恢复的(例如,对等方重置连接)。只需将throws IOException 添加到调用ExternalContext#redirect() 的方法中,让JSF/webbrowser 自行处理。
    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多