为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

重定向和导航/前进有什么区别,什么时候使用什么?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重定向错误
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

首先,“重定向”一词在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()然后。

另见:


查看完整回答
反对 回复 2019-07-10
  • 1 回答
  • 0 关注
  • 467 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信