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

时间:2011-06-08 17:20:53

标签: jsf redirect jsf-2 navigation

似乎以下内容是等效的:

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

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

是否有任何差异,何时应该使用?

1 个答案:

答案 0 :(得分:16)

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

ExternalContext#redirect()代表直接向HttpServletResponse#sendRedirect()提供代理,不涉及任何导航处理程序。因此,当使用导航处理程序可能是不利的时,这可能是一个优势。但缺点是它不处理隐式导航,也没有考虑定义的导航案例。

总而言之,这取决于:)如果您只想要一个完整且重要的重定向,请使用ExternalContext#redirect()。如果您想按结果而不是网址导航,请使用NavigationHandler#handleNavigation()

另见: