发一个请求给Servlet,接力棒就传递到了Servlet手中。而绝大部分情况下,Servlet不能独自完成一切,需要把接力棒继续传递下去,此时我们就需要请求的转发或重定向。
一.转发
请求转发可以理解为是服务器端的行为,客户端发起一次请求,这个请求在整个服务器端可以被多次传递,但都是由服务器端的处理程序传递给另一个处理程序,客户端不需要发起第二次请求,无论这个请求经历多少个处理程序,始终都是同一请求,也就意味着,这个请求中的数据经历过的每一个处理程序都可以使用。而客户端路径栏显示的还是第一次访问的路径。
request.getRequestDispatcher("/fruit/apple/red/sweet/big.html").forward(request, response);
| 代码 | 类比实际 |
|---|---|
| request | 飞机 |
| getRequestDispatcher("转发地址") | 告诉机长目的地 |
| forward(request, response) | 芜湖起飞 |
二.重定向
重定向可以理解为是客户端行为,客户端发起一次请求,服务器端给出一次响应,但这个响应包含下一次客户端需要访问的服务器端处理程序的地址,客户端再次发起请求,将会得到处理结果,也就意味着重定向客户端至少发起两次请求。并且当使用了重定向跳转页面后,客户端路径栏显示的是其重定向的路径。
response.sendRedirect("/app/fruit/apple/red/sweet/big.html");
三.对比
| 转发 | 重定向 |
|---|---|
| 一次请求 | 两次请求 |
| 浏览器地址栏显示的是第一个资源的地址 | 浏览器地址栏显示的是第二个资源的地址 |
| 全程使用的是同一个request对象 | 全程使用的是不同的request对象 |
| 在服务器端完成 | 在浏览器端完成 |
| 目标资源地址由服务器解析 | 目标资源地址由浏览器解析 |
| 目标资源可以在WEB-INF目录下 | 目标资源不能在WEB-INF目录下 |
| 目标资源仅限于本应用内部 | 目标资源可以是外部资源 |
四.转发和重定向的应用场景
- 需要通过同一个request对象把数据携带到目标资源:只能用转发
- 如果希望前往下一个资源之后,浏览器刷新访问的是第二个资源:只能用重定向