一、sendRedirect()
sendRedircet() 重定向。服务端收到客户端请求后,让客户端到新地址去请求。
- sendRedircet() 是
HttpServletResponse
接口中的方法。resp.sendRedirect("http://www.baidu.com");
- sendRedircet() 是
-
- sendRedircet() 请求转发,客户端会发两次请求. Response类sendRedirect()方法的关键两个步骤。
setStatus(status); setHeader("Location", locationUri);
- a. 设置响应的状态码为302.
public static final int SC_FOUND = 302; setStatus(status);
- b. 设置响应头上设置key ="Location" , value = "locationUri" 。
- 客户端请求的URL地址会变为重定向的地址。
-
图解
sendRedircet
二、forward() 与 include()
(一)forward()
forward() 转发。服务端A Servlet收到客户端请求后,将这个请求转给B Servlet处理。
先看看如何使用:
RequestDispatcher dispatcher = req.getRequestDispatcher("myhttp2");
dispatcher.forward(req,resp);
- forward() 要先通过getRequestDispatcher()方法获取RequestDispatcher类。
- 通过RequestDispatcher类调用forward()方法转发。
- forward() 是转发给另外一个B Servlet处理,而B Servlet处理的结果不会再经过A处理。
- 客户端请求的URL地址不会变化,还是原先请求的地址。
-
图解
forward()
运行结果如下:
forward()
结果里包含B Servet的输出== myhttp2,不会包含A Servlet的输出== myhttp1
(二)include()
include() 转发。服务端A Servlet收到客户端请求后,将这个请求转给B Servlet处理,B Servlet处理后 A Servlet会继续处理。
先看看如何使用:
RequestDispatcher dispatcher = req.getRequestDispatcher("myhttp2");
dispatcher.forward(req,resp);
resp.getWriter().write("a1");
- 要先通过getRequestDispatcher()方法获取RequestDispatcher类。
- 通过RequestDispatcher类调用include()方法转发。
- include() 是转发给另外一个B Servlet处理,而B Servlet处理的结果会再经过A处理。
- 客户端请求的URL地址不会变化,还是原先请求的地址。
-
图解
include()
运行结果如下:
include()
结果里包含B Servet的输出== myhttp2,同时也包含A Servlet的输出== myhttp1
三、小结比较
比较项目 | sendRedirect | forward | include |
---|---|---|---|
使用 | resp.sendRedirect("http://www.baidu.com"); |
RequestDispatcher dispatcher = req.getRequestDispatcher("myhttp2"); dispatcher.forward(req,resp); |
RequestDispatcher dispatcher = req.getRequestDispatcher("myhttp2"); dispatcher.include(req,resp); |
归属类 | HttpServletResponse | RequestDispatcher | RequestDispatcher |
范围 | 可以在本web工程,也可以在外部项目绝对URL地址 | 只能将请求转发到同一个web应用中 | 只能将请求转发到同一个web应用中 |
地址变化 | 变成重定向的地址 | 地址不变 | 地址不变 |
客户端请求次数 | 两次 | 一次 | 一次 |
Request对象&Response对象 | Request对象&Response对象 各自独立 | Request对象&Response对象共享 | Request对象&Response对象共享 |
线程情况 | 独立线程,独立请求与独立响应 | 同一个线程 | 同一个线程 |
forward与include | - | 输出结果只会是forward的servlet处理的最后结果 | 输出结果会是include包含的servlet + 本身 处理的结果。 |