请求转发和重定向

请求转发和请求包含

  • 作用: 解决一次请求中不同Servlet的数据共享
  • 特点:一次请求,浏览器的地址栏信息不会变
  • 注意:转发后还会执行后续代码,使用完成后要添加return

请求转发与请求包含比较

    1. 如果ServletA请求转发到ServletB,那么在ServletA中就不允许再输出响应体,这一工作将由ServletB来完成。如果是请求包含,则不会有这个限制。
    1. 请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”)。
    1. 请求包含大多用在JSP页面中,用于页面合并。
    1. 请求转发大多用在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:低

posted @ 2021-01-31 20:39  阿肆啊  阅读(110)  评论(0编辑  收藏  举报