重定向和导航/前进有什么区别,什么时候使用什么?

重定向和导航/前进有什么区别,什么时候使用什么?

JSF中的导航有什么区别?

FacesContext context = FacesContext.getCurrentInstance();context.getApplication().getNavigationHandler().
handleNavigation(context, null, url);

重定向

HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().
getResponse();response.sendRedirect(url);

以及如何决定什么时候使用什么?

导航的问题是页面URL不会更改,除非faces-redirect=true添加到导航URL的查询字符串中。然而,在我的案例中faces-redirect=true如果我想重定向到非JSF页面(就像普通的HTML页面),就会抛出错误。

另一种选择是BalusC建议在JSF2.0重定向错误


繁星点点滴滴
浏览 473回答 1
1回答

www说

首先,“重定向”一词在web开发世界中是指向客户机发送一个空HTTP响应的动作,只需要一个Location其中包含新URL的标头,客户端必须在该URL上发送全新的GET请求。所以基本上:客户端发送HTTP请求到somepage.xhtml.服务器将HTTP响应发送回Location: newpage.xhtml标头客户端发送HTTP请求到newpage.xhtml(这反映在浏览器地址栏中!)服务器发送HTTP响应,内容为newpage.xhtml.您可以使用WebBrowser的内置/addonDeveloper工具集来跟踪它。在Chrome/IE9/Firebug中按F12并检查“网络”部分来查看它。JSF导航处理程序不发送重定向。相反,它使用目标页面的内容作为HTTP响应。客户端发送HTTP请求到somepage.xhtml.服务器发送HTTP响应,内容为newpage.xhtml.但是,由于最初的HTTP请求是somepage.xhtml,浏览器地址栏中的URL保持不变。如果您熟悉BASIC Servlet API,那么您应该明白,这与RequestDispatcher#forward().关于是否拉着.HttpServletResponse在JSF引擎下调用sendRedirect()这是正确的用法;不,这不是正确的用法。你的服务器日志会被弄得乱七八糟的IllegalStateException因为这样您就不会告诉JSF您已经接管了响应处理的控制,因此JSF不应该做它的默认响应处理工作。实际上你应该执行FacesContext#responseComplete()之后。而且,每次您需要从javax.servlet.*在JSF工件中包(如托管bean),您应该完全停止编写代码,如果您真的以正确的方式做事,应该三思而后问自己,对于您想要达到的目标,是否已经有了“标准JSF方法”,和/或任务是否真的属于JSF管理bean(也就是有些情况下,简单的JSF方法)Servlet过滤器会是个更好的地方)。在JSF中执行重定向的正确方法是使用faces-redirect=true操作结果中的查询字符串:public String submit() {     // ...     return "/newpage.xhtml?faces-redirect=true";}或使用ExternalContext#redirect()当您不在动作方法(如Ajax或预发布监听器方法)中时:public void listener() throws IOException {     // ...     ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();     ec.redirect(ec.getRequestContextPath() + "/newpage.xhtml");}(是的,你不需要把try-catch绕着它IOException,就让这个例外过去吧throws,服务器容器将处理它)或使用NavigationHandler#handleNavigation()在特定情况下,如果您使用XML导航案例和/或带有内置监听器的自定义导航处理程序:public void listener() {     // ...     FacesContext fc = FacesContext.getCurrentInstance();     NavigationHandler nh = fc.getApplication().getNavigationHandler();     nh.handleNavigation(fc, null, "/newpage.xhtml?faces-redirect=true");}至于导航处理程序为什么不能处理“普通HTML”文件,这只是因为导航处理程序只能处理JSF视图,而不能处理其他文件。你应该用ExternalContext#redirect()然后。另见:如何在JSF中导航?如何使URL反映当前页面(而不是前一页)什么时候应该使用h:outputLink而不是h:CommandLink?
打开App,查看更多内容
随时随地看视频慕课网APP