请求转发
Response对象在请求头中设置转发属性
//把响应头中的状态码改为302
response.setStatus(302);
//在请求头中设置location属性为要转发的路径
response.setHeader("location","http://www.sohu.com");
这类请求首先客户端发起初始请求 http://localhost:8080/abc 这个我们配置的请求Servlet
GET /abc HTTP/1.1
> Host: localhost:8080
> User-Agent: insomnia/6.5.4
> Accept: */*
Servlet通过response修改了状态码为302,并在响应头中添加转发路径 location属性,下面的响应信息发送到了客户端浏览
HTTP/1.1 302
< Content-Type: text/html;charset=utf-8
< Content-Language: zh-CN
< location:http://www.sohu.com
< Content-Length: 1072
< Date: Wed, 14 Aug 2019 07:18:10 GMT
浏览器接收到响应消息后,发现响应是302,就在头属性中找出location属性,重新封装下面的Http请求 http://www.sohu.com ,再次发出请求
GET / HTTP/1.1
> Host:http://www.sohu.com
> User-Agent: insomnia/6.5.4
> Accept: */*
最后就会得到转发页面
Response中还封装了一个SendRedirect()方法,能更简单实现请求转发功能。
SendRedirect方法(重定向)
特点:可以实现跨域转发
response.sendRedirect("http://www.sohu.com");
//等同于
//把响应头中的状态码改为302
response.setStatus(302);
//在请求头中设置location属性为要转发的路径
response.setHeader("location","http://www.sohu.com");
请求派发
1.创建请求派发对象
RequestDispatcher dispatcher = request.getRequestDispatcher("/bbc");//得到请求派发对象
2.forward(request,response)
dispatcher.forward(request,response);//转发
说明:用forward()方法转发,第一个Servlet无法向客户端响应,只有转给的第二个Servlet可以向客户端响应
3.include(request,response)
dispatcher.include(request,response);//包含
说明:用include方法转发,第一个Servlet和第二个Servlet均可向客户端响应,响应顺序按代码顺序响应,形成一种第一个Servlet的响应信息包含第二个Servlet的响应信息效果