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