Jsf 何时使用NavigationHandler.HandlenNavigation vs ExternalContext.redirect/dispatch

Jsf 何时使用NavigationHandler.HandlenNavigation vs ExternalContext.redirect/dispatch,jsf,redirect,jsf-2,navigation,Jsf,Redirect,Jsf 2,Navigation,似乎以下各项是等效的: FacesContext.getCurrentInstance().getApplication().getNavigationHandler().handleNavigation("/index.xhtml?faces-redirect=true"); FacesContext.getCurrentInstance().getExternalContext().redirect("/testapp/faces/index.xhtml"); 是否存在任何差异以及何时应

似乎以下各项是等效的:

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

FacesContext.getCurrentInstance().getExternalContext().redirect("/testapp/faces/index.xhtml");
是否存在任何差异以及何时应使用每种方法?

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

学员在不涉及任何导航处理程序的情况下,立即将其放在掩护下。因此,当使用导航处理程序可能是不利的时,这可能是一个优势。但缺点是它不处理隐式导航,也不考虑已定义的导航情况

总而言之,这取决于:)如果您只是想要一个完整且切中要害的重定向,请使用
ExternalContext#redirect()
。如果希望通过结果而不是URL进行导航,请使用
NavigationHandler\handleNavigation()

另见:

我想另一个小区别是NavigationHandler方法需要一个viewId,而ExternalContext方法需要一个实际的URL。在这两种情况下,我都假设FacesContext.getCurrentInstance().responseComplete()是不必要的。是的,这就是我对“结果”的意思。对于阅读本文的其他人来说:另一个API级别的差异是ExternalContext方法抛出一个选中的异常(IOException)而NavigationHandler方法不需要处理这些问题。无论如何它都不可恢复(例如,由对等方重置连接)。只需将
抛出IOException
添加到调用
ExternalContext#redirect()
的方法中,并让JSF/webbrowser自己处理它。