何时使用 NavigationHandler.handleNavigation 与 ExternalContext.redirect/dispatch

Posted

技术标签:

【中文标题】何时使用 NavigationHandler.handleNavigation 与 ExternalContext.redirect/dispatch【英文标题】:When to use NavigationHandler.handleNavigation vs 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");

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

【问题讨论】:

【参考方案1】:

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

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

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

另见:

What is the difference between redirect and navigation/forward and when to use what? How to navigate in JSF? How to make URL reflect current page (and not previous one)

【讨论】:

我猜另一个小的区别是 NavigationHandler 方法需要一个 viewId 而 ExternalContext 方法需要一个实际的 URL。在这两种情况下,我都认为 FacesContext.getCurrentInstance().responseComplete() 是不必要的。 是的,这就是我所说的“结果”。 对于其他阅读这篇文章的人:另一个 API 级别的区别是 ExternalContext 方法会引发检查异常 (IOException) 而 NavigationHandler 方法不会。 您不一定需要处理。无论如何它是不可恢复的(例如,对等方重置连接)。只需将throws IOException 添加到调用ExternalContext#redirect() 的方法中,让JSF/webbrowser 自行处理。

以上是关于何时使用 NavigationHandler.handleNavigation 与 ExternalContext.redirect/dispatch的主要内容,如果未能解决你的问题,请参考以下文章

何时使用,何时不使用 Try Catch Final

何时使用 Storyboard 以及何时使用 XIB

何时使用 GetXXX() 方法以及何时使用 Getter 属性

Vuex - 何时使用 getter 以及何时使用状态

何时使用 .First 以及何时将 .FirstOrDefault 与 LINQ 一起使用?

何时使用 OSGi EventAdmin,何时不使用?