何时使用 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的主要内容,如果未能解决你的问题,请参考以下文章
何时使用 GetXXX() 方法以及何时使用 Getter 属性