当前位置: 首页 > article >正文

【Java web】-转发和重定向

作者:学Java的冬瓜

博客主页:☀冬瓜的主页🌙

专栏:【Java Web】
分享:从大小凉山,到金沙江畔,从乌蒙山脉,到红河两岸。——山鹰组合
主要内容:转发和重定向的区别、优缺点以及选择。

在这里插入图片描述

文章目录

    • 1. 二者代码上的区别
    • 2. 二者形式上的区别
    • 3. 二者本质上的区别
    • 4. 转发和重定向如何选择
    • 5. 转发和重定向优缺点

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


http://www.kler.cn/a/1706.html

相关文章:

  • const修饰指针
  • 项目:停车场车辆管理系统
  • 【图像处理】OpenCv + Python 实现 Photoshop 中的色彩平衡功能
  • 【Vue】vue项目中命名规范(结合上一篇项目结构)
  • 二、AI知识(神经网络)
  • dfs复习
  • C++单继承和多继承
  • 智能生活垃圾检测与分类系统(UI界面+YOLOv5+训练数据集)
  • Kubernetes学习(七)补充:基于自定义指标进行扩缩容
  • 浅析“面向对象编程思想”
  • 【C语言】字符串函数和内存函数
  • 【Spring】我抄袭了Spring,手写一套MySpring框架。。。
  • 来到CSDN的一些感想
  • 狄拉克符号系统
  • 手把手教你基于HTML、CSS搭建我的相册(上)
  • Qt学习_11_构建内嵌子界面与独立子界面的框架
  • html+css 实现 熊猫样式
  • 【Docker】镜像的原理定制化镜像
  • 极智AI | 百度推出文心一言,对标ChatGPT功力几成
  • 【AI大比拼】文心一言 VS ChatGPT-4
  • 网络作业1【计算机网络】
  • 面部表情识别3:Android实现表情识别(含源码,可实时检测)
  • YOLOv8 多目标跟踪
  • 【Unity3D】Unity3D中在创建完项目后自动创建文件夹列表
  • ABC294(A-E)
  • Redis的写时复制(Copy On Write),你真的了解么?