1、转发和重定向
[x] 一个web应用中通过两种方式,可以完成资源的转跳
[x] 转发是一次请求,不管转发多少次,都在一个Servlet中
- 请求路径不需要加项目名,因为他不是前端请求,是Tomcat内部跳转 ```java //获取请求转发器对象 RequestDispatcher dispatcher = request.getRequestDispatcher(“/dept/list”);
//调用请求转发器对象的forward方法完成转发 dispatcher.forward(request,response);
//合并一行代码 request.getRequestDispatcher(“/dept/list”).forward(request,response);
<a name="NSSjt"></a>
## 1.2 重定向
- [x] 重定向时的路径当中需要以项目名开始,需要添加项目名
- [x] 浏览器发送请求,请求路径上需要添加项目名
- [x] response对象将这个路径:"/项目名/b"响应给了浏览器,浏览器又自发的向服务器发送了一个全新的请求:`http://localhost:8080/项目名/b`
- [x] 所以浏览器一共发送了两次请求
- 第一次请求:`http://localhost:8080/项目名/a`
- 第二次请求:`http://localhost:8080/项目名/b`
- 最终浏览器地址栏上显示地址当然是最后一次请求的地址,所以重定向会导致浏览器地址栏上的地址发生改变
```java
//重定向
reponse.sendRedirect(request.getContextPath() + "/项目/b");
2、转发和重定向的区别
- 转发:在浏览器地址栏上发送的请求是什么,请求结束后,浏览器的地址栏还是这个,没变
- 重定向:浏览器地址上的地址会根据第二次请求的路径而改变
- 转发:是由WEB服务器来控制的,A资源转跳到B资源,这个跳转的动作是Tomcat服务器内部完成的
- 重定向:是浏览器完成的,具体转跳的哪个资源,浏览器决定
- 用一个例子去描述转发和重定向
- 借钱(转发:发送一次请求)
- 老王没钱了,找张三借钱,其实张三没有钱,但是张三够义气,张三自己找李四借了钱,然后张三把这个钱给了老王,老王不知道这个钱是李四的,老王只求了一个人
- 借钱(重定向:发送两次请求)
- 老王没钱了,找张三借钱,张三没有钱,张三有个好哥们叫李四,张三把这个地址告诉了老王,然后老王按着这个地址去找到了李四借了钱,求了两个人,而且老王知道这个钱是李四借给他的
- 借钱(转发:发送一次请求)
3、如何选择转发和重定向?
- 如果在上一个Servlet当中向request域中绑定了数据,希望从下一个Servlet当中把request域里的数据取出来,使用转发机制
- 剩下所有的请求均使用重定向 (重定向较多)
- 转发会存在浏览器的刷新问题,可以用重定向解决问题