作者
:学Java的冬瓜
博客主页
:☀冬瓜的主页🌙
专栏
:【Java Web】
分享
:从大小凉山,到金沙江畔,从乌蒙山脉,到红河两岸。——山鹰组合
主要内容
:转发和重定向的区别、优缺点以及选择。
1. 二者代码上的区别
- 在web应用中,可以通过两种方式,完成资源的跳转。
- 1>转发、2>重定向
- 跳转的资源只要是服务器内部合法的资源即可,可以是Servlet、Jsp,HTML等等。
例子前提:在Aservlet类中 跳转
到Bservlet类中:
转发
代码:(以下两段代码均在Aservlet类中实现)
// 1.获取请求转发器对象
RequestDispatcher dispatcher = request.getRequestDispatcher("/b"); // /b是xml文件中给类的路径,Tomcat服务器通过这个路径找到这个类,再通过这个类调用类的doGet(doPost)方法。
// 2.调用请求转发器对象的forward方法完成转发。
dispatcher.forward(request, response); // 用forward方法把request和response传进去
// 合并在一起为一行代码
request.getRequestDispatcher("/b").forward(request, response);
重定向
代码:在Aservlet类中
// 重新定方向
// 重定向的路径中需要以项目名开始。
response.sendRedirect(request.getContextPath() + "/b"); // 注意:转发和重定向都不加项目名,
2. 二者形式上的区别
转发的时候是一次请求,不管转发了多少次
。如A转发到B,B转发到C… 因为调用forward的时候,会将当前的request和response传给下一个servlet对象。
转发在浏览器地址栏上的请求是:http://localhost:8080/servlet10/a,那么不管转发了多少次,最终都是这个URL(地址栏上请求不变),即转发是一次请求。- 转发request和response被类共享。从Aservlet转发到Bservlet时,Aservlet和Bservlet共享同一个request,response。
重定向是多次请求,地址栏上请求发生变化
。response对象将路径根路径"/b"
响应给浏览器,浏览器又自发的向服务器发送了一次全新的请求:http://localhost:8080/servlet10/b。所以对重定向来说,浏览器对服务器发送了两次请求,第一次:http://localhost:8080/servlet10/a,第二次:http://localhost:8080/servlet10/b;浏览器地址栏上的请求发生变化。最终的地址由最后的转发到的类的路径决定。- 重定向每个类有自己的request,response,不是共享的,浏览器每次发送一次新的请求,就会有对应的request和response出现。
3. 二者本质上的区别
- 转发:
由WEB服务器控制
,A资源跳转到B资源,这个操作是利用format函数传request和response,由Tomcat服务器内部完成的。 - 重定向:
由浏览器控制
,浏览器会根据重定向路径,向服务器发送新的请求。
4. 转发和重定向如何选择
- 如果在上一个Servlet中向request域中绑定了数据,,希望从下一个servlet中把request域里面的数据取出,就用转发,因为转发的两个servlet类共享同一组request,response。
- 其它情况都用重定向。
5. 转发和重定向优缺点
- 转发,
是服务器内部的资源跳转。速度快,对服务器压力大,地址栏不会改变
,且向数据库中插入数据时如果数据库中的表没有主键约束(非空,唯一),那么在转发后的网页刷新页面时,可能会发生当前数据反复插入的情况。 - 重定向,
是浏览器重新向服务器发送请求,速度慢,但是对服务器压力小,浏览器地址栏显示为最后一个资源的路径
。不会发生刷新页面时数据反复插入的情况。
原因解释:下图中,左边是浏览器,中间是服务器,右边是数据库。
转发会让tomcat服务器向数据库多次提交同一组数据
,因为是一次请求(刷新页面就相当于在服务器向数据库多次提交了同一组数据)。
重定向只有在最后一个资源处才提交到数据库(或者说不会重复提交)
,重定向是执行到tomcat服务器第一个资源后,重定向让浏览器发送二次请求,最终只有最后一次是提交到了数据库。