【Java web】-转发和重定向

作者:学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服务器第一个资源后,重定向让浏览器发送二次请求,最终只有最后一次是提交到了数据库。
在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学Java的冬瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值