JavaWeb: sendRedirect()、forward()、include() 区别

一、sendRedirect()

sendRedircet() 重定向。服务端收到客户端请求后,让客户端到新地址去请求。

    1. sendRedircet() 是HttpServletResponse接口中的方法。 resp.sendRedirect("http://www.baidu.com");
    1. sendRedircet() 请求转发,客户端会发两次请求. Response类sendRedirect()方法的关键两个步骤。
    setStatus(status);
    setHeader("Location", locationUri);
    
    • a. 设置响应的状态码为302.
      public static final int SC_FOUND = 302; setStatus(status);
    • b. 设置响应头上设置key ="Location" , value = "locationUri" 。
    1. 客户端请求的URL地址会变为重定向的地址。
  • 图解


    sendRedircet

二、forward() 与 include()

(一)forward()

forward() 转发。服务端A Servlet收到客户端请求后,将这个请求转给B Servlet处理。
先看看如何使用:

RequestDispatcher dispatcher = req.getRequestDispatcher("myhttp2");
dispatcher.forward(req,resp);
    1. forward() 要先通过getRequestDispatcher()方法获取RequestDispatcher类。
    1. 通过RequestDispatcher类调用forward()方法转发。
    1. forward() 是转发给另外一个B Servlet处理,而B Servlet处理的结果不会再经过A处理。
    1. 客户端请求的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");
    1. 要先通过getRequestDispatcher()方法获取RequestDispatcher类。
    1. 通过RequestDispatcher类调用include()方法转发。
    1. include() 是转发给另外一个B Servlet处理,而B Servlet处理的结果会再经过A处理。
    1. 客户端请求的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 + 本身 处理的结果。

你可能感兴趣的:(JavaWeb: sendRedirect()、forward()、include() 区别)