一个请求往往需要多个servlet协同合作才能完成,此时我需要请求转发 或 请求包含(不常用)
请求转发: 由下一个servlet完成响应体(通过response两个流发送给浏览器的叫做响应体),当前servlet完成响应头(setHeader()) 请求包含: 由两个(多个)servlet共同完成响应体
特点: url中的地址不会改变
由图我们可以知道属于一次请求,一次响应。而重定向数据多次请求对次响应
请求转发: servlet1:
response.setContentType("text/html; charset=utf-8") //设置编码格式 response.setHeader("aa","AA") //设置响应头 response.getWriter().print("你好,我是servlet1") //设置响应体 request.getRequestDispatcher("/servlet2").forword(request,response);servlet2:
response.setContentType("text/html; charset=utf-8") response.getWriter().print("你好,我是servlet2") //设置响应体结果: 你好,我是servlet2 解释:因为通过servlet1向servlet2转发了,所以servlet1中的响应体是不会输出带浏览器上的
请求包含: 如果想让servlet1中的响应体输出到浏览器上,那么就要使用请求包含 servlet1:
response.setContentType("text/html; charset=utf-8") response.setHeader("aa","AA") //设置响应头 response.getWriter().print("你好,我是servlet1") //设置响应体 request.getRequestDispatcher("/servlet2").include(request,response);servlet2:
response.setContentType("text/html; charset=utf-8") response.getWriter().print("你好,我是servlet2") //设置响应体结果: 你好,我是servlet1 你好,我是servlet2
注意:如果你是用的是请求转发,但是你在被转发的servlet中做了太多的响应体,那么被转发的servlet中的响应体也会被打印到浏览器,此时会抛出异常