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

Rya*_*yan 16 navigation jsf redirect jsf-2

似乎以下是等价的:

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

FacesContext.getCurrentInstance().getExternalContext().redirect("/testapp/faces/index.xhtml");
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 16

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

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

总而言之,这取决于:)如果你只想要一个完整的和重点指向,请使用ExternalContext#redirect().如果您想按结果导航而不是URL,请使用NavigationHandler#handleNavigation().

也可以看看: