Web中的转发与重定向

转发与重定向

  • 一、转发和重定向的概念
    • 1.转发
    • 2.重定向
  • 二、JavaWeb 中的转发和重定向
  • 三、SpringMVC 中的转发和重定向
    • 1.转发
      • (1) 默认的方式
      • (2) 完整的方式
    • 2.重定向
  • 四、总结


一、转发和重定向的概念

  • 在 Web 应用中,转发和重定向都是用于将请求从一个页面传递到另一个页面的操作(资源跳转),它们的主要区别在于传递的方式不同。

1.转发

  • 转发(Forward) 是指将请求从一个 Servlet 转发到另一个 Servlet、JSP 或 HTML 页面。在转发的过程中,请求对象和响应对象都会被传递给下一个 Servlet 或页面,而客户端并不知道这个过程。也就是说,转发是在服务器端完成的,客户端并不知道。
    • 转发(浏览器发送了一次请求)
      • 在浏览器地址栏上发送的请求是:http://localhost:8080/servletA ,最终请求结束之后,浏览器地址栏上的地址还是这个。没变。
    • 转发会存在浏览器的刷新问题。

在这里插入图片描述

2.重定向

  • 重定向(Redirect)是指将请求从一个页面重定向到另一个页面。在重定向的过程中,服务器会发送一个特殊的响应给客户端,这个响应会告诉客户端请求的地址已经发生了变化,需要重新发起请求。客户端会根据这个响应重新发起请求,并直接访问新的地址。也就是说,重定向是在客户端完成的,客户端完成的这个过程。
    • 重定向(浏览器发送了两次请求)
      • 在浏览器地址栏上发送的请求是:http://localhost:8080/servletA,最终在浏览器地址栏上显示的地址是:http://localhost:8080/servletB。

在这里插入图片描述


二、JavaWeb 中的转发和重定向

  • 转发
    • 由于是在项目内部中进行跳转,所以转发的时候路径上不需要写项目名。
    // 获取请求转发器对象
    RequestDispatcher dispatcher = request.getRequestDispatcher("/target.jsp");
    // 调用请求转发器对象的forward方法完成转发
    dispatcher.forward(request, response);
    
    // 合并一行代码
    request.getRequestDispatcher("/target.jsp").forward(request, response);
    // 转发的时候是一次请求,不管你转发了多少次。都是一次请求。
    // AServlet转发到BServlet,再转发到CServlet,再转发到DServlet,不管转发了多少次,都在同一个request当中。
    // 这是因为调用forward方法的时候,会将当前的request和response对象传递给下一个Servlet。
    
    在这里插入图片描述
  • 重定向
    • 注意:路径上要加一个项目名,因为浏览器发送请求,请求路径上是需要添加项目名的。
    • 重定向不可以访问WEN-INF下的文件,在WEB-INF下的目录是不可以直接方法,是被保护的。
    // 以下这一行代码会将请求路径“/crm/ServletA”发送给浏览器
    // 浏览器会自发的向服务器发送一次全新的请求:http://localhost:8080/crm/ServletA
     response.sendRedirect(request.getContextPath() + "/target.jsp");
    
    在这里插入图片描述

三、SpringMVC 中的转发和重定向

  • 在 SpringMVC 中默认的就是转发,在我们使用 ModelAndView 或者是直接 return 字符串时,其实就是默认走的转发。

1.转发

  • 我们如果使用默认的方式进行转发的话,我们的路径是会去拼接视图解析器的前缀和后缀。
  • 如果我们选择显式的完整的去进行使用转发,那么这时候视图解析器就不起作用了,我们需要在 forward: 后面添加完整的路径。
    • 这样做其实是可以让我们可以去访问其他目录下的一些文件,避免了视图解析器只能访问前缀的指定目录 。

(1) 默认的方式

@GetMapping("/ServletA")
public String ServletA(){
  // 默认的情况会去帮助我们去拼接视图解析器,我们只需要返回文件名
  return "target";
}

(2) 完整的方式

@GetMapping("/ServletA")
public String ServletA(){
  // 我们这里把forward写出来以后,视图解析器就不会去拼接了,我们需要直接去写完整的路径
  return "forward:/templates/target.jsp";
}

2.重定向

  • 使用重定向其实和上面转发的完整方式是一样的,这时候需要我们显式的把 redirect: 写出来。
  • 当我们使用这种方式来进行重定向时,和上面完整的转发方式一样,需要把完整的路径写出来,这时的视图解析器也是不会去拼接前缀和后缀。
  • 重定向不可以访问WEN-INF下的文件,在WEB-INF下的目录是不可以直接方法,是被保护的。
@GetMapping("/ServletA")
public String ServletA(){
  // 和使用forward一样,需要把完整的路径写出来
  return "redirect:/templates/target.jsp";
}

四、总结

  • 转发和重定向应该如何选择?什么时候使用转发,什么时候使用重定向?
    • 如果在上一个 Servlet 当中向 request 域当中绑定了数据,希望从下一个 Servlet 当中把 request 域里面的数据取出来,使用转发机制。
    • 剩下所有的请求均使用重定向。(重定向使用较多。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/362632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MIMIC-IV官方视图解析 - cardiac_marker心脏标记表

今天在学习官方衍生表mimiciv_derived.cardiac_marker心脏标记表时候发现了一些问题: 该表中troponin_t (肌钙蛋白t)的值结果都是空值null 或者 ___ (由于去标识化), 这明显是不合理的 小编查看了该表的官…

提升小波的理解

本文简要介绍一下提升小波的计算过程和基本原理: 1、划分 假设有序列X, 将其奇数索引上的元素构成,Xo将其偶数索引上的元素构成,Xe之所以能文献中都用Xo和Xe划分,是因为 o来源于odd,奇数;e来源于even,偶数;举个例子: 有序列:X=[3,5,22,33,12,34,56,77,99,29] Xo…

乐鑫与 Elektor 杂志合作推出特刊,聚焦 AIoT 创新

在新一年的起始之际,我们很荣幸地与 Elektor 合作推出由乐鑫领衔编辑的杂志特刊。欢迎点此阅读电子版本。 Elektor 杂志作为国际电子工程和科技创新的重要平台,自 20 世纪 60 年代起,就引领着电子制造的发展潮流。如今,它已经发展…

服务端渲染

SSR简单来说就是页面上的内容是通过服务端渲染生成的,浏览器直接显示服务端返回的html就可以了。相比之前常用的SPA来说有很多的优点,如下图,但也有一些实际存在的问题,在实际应用中需要多方面权衡利弊。 SSR优势 SSR缺点&#xf…

THREE.JS动态场景开发实战【赛博朋克】

在本教程中,我们将探索如何创建类似 Three.js 的赛博朋克场景,灵感来自 Pipe 网站上的背景动画。 我们将指导你完成使用 Three.js 编码动态场景的过程,包括后处理效果和动态光照,所有这些都不需要任何着色器专业知识。 我用这个场…

【网络】:网络套接字(TCP)

网络套接字(TCP) 一.编写TCP服务器二.编写Tcp客户端三.多进程四.多线程版本五.线程池版完整源代码六.使用示例 一.编写TCP服务器 1.先搭一个架子 2.创建sockfd domain参数依然是AF_INET(因为是IPV4) type方式选择SOCK_STREAM(提供可靠的连接…

优思学院|如何评价质量经理这个角色?

简单来说,公司的成败已经取决于质量的水准。质量是任何公司的重要组成部分,无法保证商品质量的公司将很快失去信誉与消费者的认可,最终导致销售额直线下降。 所以,质量经理的意义首先体现在他们对于质量控制体系的建立和维护上。…

辽宁链家新房数据采集与可视化实现

摘 要 网络爬虫也叫做网络机器人,是一种按照一定的规则,自动地抓取网络信息,进行数据信息的采集与整理的程序或者脚本。随着海量数据的出现,如何快速有效的获取到我们想要的数据成为难题。以房源信息为例,该文使用Pyt…

MySQL之索引分类,语法以及SQL性能分析(慢日志,profile,explain)

索引分类 分类含义特定关键字主键索引针对于表中主键创建的索引默认自动创建,只能有一个PRIMARY唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE常规索引快速定位特定数据可以有多个全文索引全文索引查找的文本中的关键字,而不是比较索引中的…

Java正则表达式之Pattern和Matcher

目录 前言一、Pattern和Matcher的简单使用二、Pattern详解2.1 Pattern 常用方法2.1.1 compile(String regex)2.1.2 matches(String regex, CharSequence input)2.1.3 split(CharSequence input)2.1.4 pattern()2.1.5 matcher(CharSequence input) 三、Matcher详解3.1 Matcher 常…

猫头虎博主第10期赠书活动:《写给大家看的Midjourney设计书》

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

基于Spark+Springboot的电商用户行为分析系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容:SpringBoot、Vue、SSM、HLM…

中科星图——2020年全球30米地表覆盖精细分类产品V1.0(29个地表覆盖类型)

数据名称: 2020年全球30米地表覆盖精细分类产品V1.0 GLC_FCS30 长时序 地表覆盖 动态监测 全球 数据来源: 中国科学院空天信息创新研究院 时空范围: 2015-2020年 空间范围: 全球 数据简介: 地表覆盖分布…

有向图查询所有环,非递归

图&#xff1a; 有向图查询所有环&#xff0c;非递归&#xff1a; import java.util.*;public class CycleTest {private final int V; // 顶点数private final List<List<Integer>> adjList; // 邻接表public CycleTest(int vertices) {this.V vertices;this.…

etcd自动化安装配置教程

文章目录 前言一、简介1. 简介2. 特点3. 端口介绍 二、etcd安装教程&#xff08;单机版&#xff09;1. 复制脚本2. 增加执行权限3. 执行脚本4. 查看启动状态5. 卸载etcd 三、etcd安装教程&#xff08;集群版&#xff09;1. 复制脚本2. 增加执行权限3. 分发脚本4. 执行脚本5. 启…

【Linux】yum与vim命令详解

&#x1f497;个人主页&#x1f497; ⭐个人专栏——Linux学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读1. yum命令1.1 基本使用1.2 注意事项1.3 lrzsz软件包示例 2. vim命令2.1 vim的基本概念2.2 vim配置2.3 vim的基本操作2.3…

归并排序+非比较排序

Hello everyone&#xff01;欢迎来到排序章节目前的“终章”——归并排序&#xff0c;经过了前面三种排序的敲打&#xff0c;尤其是快速排序&#xff0c;相信你一定可以闯过这最后一关&#xff01; 归并排序 基本思想&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;…

Idea编写mapper.xml文件提示表名和字段

一、连接database 二、setting- > language -> sql Dialects中 的选项设为 mysql就可以了 三、测试

CS144--Chapter0--wsl2+docker环境搭建

我的笔记本配置 荣耀magicbook16&#xff0c;容量是500G&#xff0c;芯片是R7-5800 由于笔记本容量较小&#xff0c;因此考虑这个方案&#xff0c;对于台式机用户&#xff0c;建议可以直接用虚拟机或者双系统。 前言 斯坦福官网给出的方法是用他们的镜像&#xff08;基于Ubu…

Android 12 系统开机动画

修改Android开机动画有两种方式 方式一、通过adb 命令来修改&#xff1a; 进入/system/media目录&#xff0c;将里面的 bootanimation.zip 文件pull出来&#xff0c;然后解压&#xff0c;替换part0和part1中的图片&#xff0c;并且根据图片大小修改文件 desc.txt 中的内容&…