gpt4 book ai didi

redirect - 重定向和导航/转发之间的区别是什么?何时使用?

转载 作者:行者123 更新时间:2023-12-03 08:45:10 25 4
gpt4 key购买 nike

JSF中的导航有什么区别

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

和重定向
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.sendRedirect(url);

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

导航的问题在于,除非将 faces-redirect=true添加到导航URL的查询字符串中,否则页面URL不会更改。但是,在我的情况下,如果我想重定向到非JSF页面(如纯HTML页面),则添加 faces-redirect=true会引发错误。

另一个选项是baltC在 JSF 2.0 redirect error中建议的

最佳答案

首先,术语“重定向”是在Web开发 Realm 中的一种操作,它向客户端发送一个空的HTTP响应,该响应仅带有Location header ,其中包含新的URL,客户端必须在该URL上发送全新的GET请求。所以基本上:

  • 客户端将一个HTTP请求发送到somepage.xhtml
  • 服务器通过Location: newpage.xhtml header
  • 发送回HTTP响应
  • 客户端向newpage.xhtml发送HTTP请求(这将反射(reflect)在浏览器地址栏中!)
  • 服务器将HTTP响应发送回newpage.xhtml的内容。

  • 您可以使用Web浏览器的内置/附加开发人员工具集对其进行跟踪。在Chrome / IE9 / Firebug中按F12,然后检查“网络”部分以查看它。
    JSF导航处理程序不发送重定向。相反,它将目标页面的内容用作HTTP响应。
  • 客户端将一个HTTP请求发送到somepage.xhtml
  • 服务器将HTTP响应发送回newpage.xhtml的内容。

  • 但是,由于原始HTTP请求是 somepage.xhtml,因此浏览器地址栏中的URL保持不变。如果您熟悉 basic Servlet API,那么您应该了解这与 RequestDispatcher#forward() 具有相同的作用。

    至于是否从JSF幕后拉下 HttpServletResponse并对其调用 sendRedirect()是正确的用法;不,那不是正确的用法。您的服务器日志将被 IllegalStateException困惑,因为这样您就不会告诉JSF您已经接管了响应处理的控制,因此JSF不应执行其默认响应处理工作。实际上,您应该随后再执行 FacesContext#responseComplete()
    此外,每当每次需要从JSF Artifact (例如托管Bean)中的 javax.servlet.*包中导入某些内容时,都应该绝对停止编写代码,并三思而后行,是否真的在以正确的方式做事,并问自己是否还没有无论您要实现什么目标和/或任务是否真正属于JSF托管Bean,都可以使用“标准JSF方式”(在某些情况下,简单的 servlet filter会是更好的选择)。
    在JSF中执行重定向的正确方法是在操作结果中使用 faces-redirect=true查询字符串:
    public String submit() {
    // ...
    return "/newpage.xhtml?faces-redirect=true";
    }
    当您不在ajax或prerender侦听器方法之类的操作方法中时,请使用 ExternalContext#redirect() :
    public void listener() throws IOException {
    // ...
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(ec.getRequestContextPath() + "/newpage.xhtml");
    }
    (是的,您不需要在 try-catch上放置一个 IOException,只需让异常通过 throws进行处理,servlet容器就会处理它)
    如果要使用XML导航案例和/或带有某些内置侦听器的自定义导航处理程序,请在特定情况下使用 NavigationHandler#handleNavigation() :
    public void listener() {
    // ...
    FacesContext fc = FacesContext.getCurrentInstance();
    NavigationHandler nh = fc.getApplication().getNavigationHandler();
    nh.handleNavigation(fc, null, "/newpage.xhtml?faces-redirect=true");
    }
    关于导航处理程序对“纯HTML”文件失败的原因,这仅仅是因为导航处理程序只能处理JSF View ,而不能处理其他文件。然后,您应该使用 ExternalContext#redirect()
    也可以看看:
  • How to navigate in JSF? How to make URL reflect current page (and not previous one)
  • When should I use h:outputLink instead of h:commandLink?
  • 关于redirect - 重定向和导航/转发之间的区别是什么?何时使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11277366/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com