请求转发和重定向
请求转发和请求包含
- 作用: 解决一次请求中不同Servlet的数据共享。
- 特点:一次请求,浏览器的地址栏信息不会变
- 注意:转发后还会执行后续代码,使用完成后要添加return
请求转发与请求包含比较
-
- 如果ServletA请求转发到ServletB,那么在ServletA中就不允许再输出响应体,这一工作将由ServletB来完成。如果是请求包含,则不会有这个限制。
-
- 请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”)。
-
- 请求包含大多用在JSP页面中,用于页面合并。
-
- 请求转发大多用在Servlet中,转发目标大多是JSP页面。
ServletB 代码
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/plain;charset=utf-8");
resp.getWriter().println("servlet - a");
req.getRequestDispatcher("/b").forward(req,resp); //请求转发
return; //不返回,还会执行后续代码
}
ServletA 代码
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/plain;charset=utf-8");
resp.getWriter().println("servlet - b"); //只输出
}
- 访问 ServletA值打印 servlet-b
换成请求包含 getRequestDispatcher inclued
- 如图所示
重定向 sendRedirect
- 特点:两次请求,而且第二次请求一定是GET,由浏览器发送请求,会改变浏览器地址栏。
resp.sendRedirect(req.getContextPath()+"/b"); //重定向
重定向与请求转发的区别
forward 请求转发
- 是服务器请求资源,服务器直接访问目标地址的URL,然后再把这个URL的响应内容发给浏览器,浏览器不知道这个内容是从哪里来的,因为这个跳转过程是服务器实现的,并不是客户端,所以地址栏不会改变。
sendRedirect 重定向
- 是服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新的URL。
转发是服务器行为,重定向是客户端行为
区别
1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL。
2.从数据共享来说
forward: 转发页面和转发到的页面可以共享request里面的数据。
redirect: 不能共享数据
3.从运用地方来说
forward: 一般用于用户登录的时候,根据角色转发到相应的模块
redirect: 一般用于用户注销登录时返回主页面和跳转到其他的网站等
4.从效率来说
forward:高
redirect:低