servlet重定向与请求转发的区别

转发和重定向都能让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。

1、转发:有两种方式获得转发对象(RequestDispatcher):一种是通过 HttpServletRequest 的 getRequestDispatcher() 方法获得,一种是通过 ServletContext 的 getRequestDispatcher() 方法获得;

以前的request范围中存放的变量不会失效,就像把两个页面拼到了一起。 例如:

request.getRequestDispatcher (“demo.jsp"). forward(request, response);//转发到demo.jsp

详解:假设浏览器访问 servlet1,而 servlet1 想让 servlet2 为客户端服务。此时servlet1 调用 forward()方法,将请求转发给servlet2。但是调用 forward() 方法,对于浏览器来说是透明的,浏览器并不知道为其服务的 Servlet 已经换成 Servlet2,它只知道发出了一个请求,获得了一个响应。浏览器URL的地址栏不变。

2、重定向:HttpServletResponse 的 sendRedirect() 方法。

服务器根据此请求寻找资源并发送给客户,它可以重定向到任意URL,不能共享 request范围内的数据。例如:

 response.sendRedirect(“demo.jsp");//重定向到demo.jsp

详解:假设浏览器访问 servlet1,而 servlet1 想让 servlet2 为客户端服务。此时servlet1 调用 sendRedirect() 方法,将客户端的请求重新定向到 Servlet2。接着浏览器访问servlet2,servlet2 对客户端请求作出反应。浏览器URL的地址栏改变。

3、主要区别

(1)sendRedirect() 方法不但可以在位于同一个主机上的不同 Web 应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。而 forward() 方法只能将请求转发给同一 Web 应用的组件。

(2)sendRedirect() 方法不能转发到 “/WEB-INF/” 路径下的 jsp 页面资源,而getRequestDispatcher().forword() 可以重定向到 “/WEB-INF/” 路径下的 jsp 页面资源。如

request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);

(3)转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变。

  • 重定向:浏览器实际发出了两次请求,第一次请求访问 Servlet1,第二次请求访问 Servlet2,浏览器最终展示的是 Servlet2 生成的 HTML 页面
  • dispatcher.forward(request,response)方法处理流程如下:
    1. 清空用于存放响应正文数据的缓冲区
    2. 如果目标组件为 Servlet 或 JSP,就调用它们的 service() 方法,把该方法产生的响应结果发送到客户端;如果目标组件为文件系统中的静态 HTML 文档,就读取文档中的数据并把它发送到客户端

你可能感兴趣的:(Java,Web)