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

SpringMVC学习总结(路由映射、参数传递、转发和重定向...)

目录

1. MVC简介

2. SpringMVC简介

3. 路由映射注解

3.1 @RequestMapping

3.2 @GetMapping与@PostMapping

4. 接收前端传递参数

 4.1 接收单/多个参数

4.2 接收对象 

4.3 接收JSON对象

4.4 后端参数重命名/映射

4.5 设置参数必传/非必传

4.6 获取URL中的参数

4.7 获取文件

4.8 获取Cookie

4.9 获取Session

4.10 获取请求Header中的信息

5. 返回参数给前端

5.1 返回静态资源

5.2 返回text/html

5.3 返回JSON对象

6. 请求转发和请求重定向


1. MVC简介

MVC模型指的是 Model、View和Controller。

  1. 其中Model模型层用于处理应用程序中数据逻辑,作为实体类与数据库进行交互同时也是数据的载体;
  2. View视图层主要负责数据向用户的展示;
  3. Controller控制器层主要用来处理和用户的交互过程,通常负责从View层读取数据并控制Model层的数据逻辑处理。MVC模型的简介图如下:

2. SpringMVC简介

类似于Spring的控制反转容器IOC和依赖注入DI的关系一样,如果说MVC是一种思想,那SpringMVC就是MVC思想的一种具体实现。总的来说,SpringMVC是一个实现了MVC模式的框架结构,并继承了Servlet-api框架,当用户发送请求后,我们的SpringMVC就可以感受到用户的请求。同时,SpringMVC也可以被当作是Spring框架的核心,下面我们主要基于SpringBoot来构建SpringWeb框架。关于SpringBoot项目的创建步骤,可以参照之前的这篇文章:SpringBoot及其配置文件

3. 路由映射注解

3.1 @RequestMapping

这是SpringWeb项目中最容易遇到的注解一个,它的功能与我们之前学习的Servlet中的@WebServlet的功能类似,用户通过其中配置的url信息即可将请求发送到对应的类的方法上。

  • @RequestMapping可以修饰类也可以修饰方法,当只修饰方法时,我们可以通过指定一级路由直接访问到该方法;当修饰类和方法时,我们需要使用二级路由才能正确映射。

@RequestMapping的使用图解


 @RequestMapping注解的标注的方法可以接收Get请求也可以接收Post请求,以及其他类型的请求:

3.2 @GetMapping与@PostMapping

这两个注解的功能与@RequestMapping的功能类似,都用来指定后端的路由映射。不过,这两个注解相对于@RequestMapping有以下区别:

  1. 使用@GetMapping配置的路由信息对应的方法只支持Get请求
  2. 同理,使用@PstMapping配置的路由对应的方法只支持Post请求

4. 接收前端传递参数

 4.1 接收单/多个参数

在SpringMVC中,我们可以直接通过在方法的参数上添加参数来接收前端传递过来的参数,不过,在方法上添加参数时有以下注意事项:

  1. 添加的参数名称要和前端发送请求时指定的参数名称一致
  2. 添加参数的类型使用引用数据类型
  3. 当有多个参数时,后端方法参数的顺序不影响参数值的接收

我们来看看这些注意事项如没有被重视会导致什么后果:

4.2 接收对象 

接收对象只是在后端将参数的值集合进行了封装,在前端仍然是按照自己该有的方式传递参数,不过值得注意的是:

  1. 前端传递的参数的名称要和后端编写的类的属性名称一致;
  2. 后端类提供了属性的getter和setter方法才能成功获取到参数的值。

下面我们以后端接收User类为例,来学习下后端接收对象的过程:

4.3 接收JSON对象

当我们还是用普通接收对象的方法来接收前端传递过来的json格式的字符串描述的对象时,会发现根本接收不到或者说转换对象不成功。这个时候我们就需要使用@RequestBody来告诉我们的程序前端传递过来的是一个json格式的数据,我们的程序才能够成功将其转化为对应的JSON对象。如下:

 

4.4 后端参数重命名/映射

 我们的接口不是已经和前端约定好了吗?为什么还要有接收参数的重命名呢?

其实这种修改后端参数名称的场景还是存在的,比如项目已经发布了,但是突然发现前后端接口参数不一致,项目功能不能正常运转了!!而前端过年放假回家没有带电脑,这个时候测试又向你提了这个bug,那我们就需要有能力站在后端舞台上解决这个问题。而后端的业务代码又用我自己的变量名称编写了一大堆。那好的解决办法就是先接收前端的参数值,然后再对这个方法参数进行重命名。所以,参数重命名还是有必要的,有备无患嘛!


后端参数重命名通过在对应方法的对应参数的前面加上@RequestParam注解并指定重命名参数的名称即可实现:

4.5 设置参数必传/非必传

对于上面 4.4后端参数重命名/映射 中,如果我们再对参数重命名后,默认情况下这个参数是必传的,如果没有传递就会导致程序出错。我们可以通过设置RequestParam注解中的required属性为false指定当前参数为非必传即可解决上述问题,如下图:

4.6 获取URL中的参数

这里的参数值得不是获取查询字符串中的参数,而是指类似下面这种格式的URL中携带的参数的获取:


要实现上面的参数的获取方式,我们需要

  1. 修改我们后端程序中的映射URL的格式
  2. 使用注解@PathVariable

如下图所示:

4.7 获取文件

在Spring中,我们又该怎样获取前端上传的文件信息呢?获取步骤共分为以下两步:

  1. 使用@RequestPart注解标注参数代表这是一个文件变量
  2. 指定@RequestPart中的name属性
  3. 文件变量使用MultipartFile类创建

话不多说,我们现在在前端发送一个文件并通过后端程序接收将文件持久化到本地硬盘上,直接上图:

4.8 获取Cookie

 如果要获取所有的Cookie,我们仍然需要使用Servlet的写法;而如果只获取一个Cookie的值,可以直接使用框架为我们提供好的注解@CookieValue。


我来先来使用Servlet获取所有的Cookie信息,以及使用@CookieValue注解获取单个Cookie信息

4.9 获取Session

 要想获取到Session,必须先有session的存储,而对于session的存储,我们只能使用原生servlet来实现,其实想想也好理解,session是和我们后端系统相关的参数,我们也不指望这个参数是从前端传递过来的,因此SpringMVC也没有为我们提供更好的存储session的方法。下面我们先使用原生servlet将session对象存储起来。

存储session


除了可以用原生Serlvet来获取外,SpringMVC也为我们提供了一种简便的获取Session中具体属性的方法:使用@SessionAttribute注解

 获取Session对象(Servlet +框架两种获取方法)


关于session的使用特性

我们都知道,由于session是存储在内存上的,按理来说,当我们的程序重启后,内存中存放的session信息应该就不存在了,但是我在将程序重启后,发现session信息依然存在,这是怎么肥事呢?如下:

 

4.10 获取请求Header中的信息

 同样,在SpringMVC中,我们依然可以使用传统的获取方式来获取,SpringMVC也为我们提供了一种更为简便的获取请求Header中信息的方式:使用@RequestHeader注解


使用传统方式和@RequestHeader注解获取Header中信息

 

 

5. 返回参数给前端

5.1 返回静态资源

SpringMVC默认情况下返回的就是静态页面,我们只需要:

  1. 不标注@ResponseBody注解,方法的返回值类型为Object/String都可以
  2. 将返回的信息修改为静态页面路径信息即可

如下:

 

5.2 返回text/html

默认情况下,标注了返回类型为数据的@ResponseBody注解后返回的字符串即为text/html格式:

 

5.3 返回JSON对象

我们只需要返回一个对象或者一个字典类型的对象如HashMap,并使用注解@ResponseBody指定返回类型为数据格式即可。

  1. 如果返回的是普通对象:SpringMVC会将对象转换为JSON格式的字符串并以JSON的格式返回给前端。其中JSON对象的key值为对象的属性名称,value值为对象的属性的值。
  2. 如果返回的是字典类型的对象,SpringMVC也会将其转换为JSON格式的字符串并以JSON格式返回给前端。其中JSON对象的key值为字典类型的key值,JSON对象的value值为字典类型的value值。

如下:

 

6. 请求转发和请求重定向

再SpringMVC中,方法返回的不仅可以是一个页面或数据,还可以返回一个字符串来实现跳转。实现跳转的方式有以下两种:

  1. 转发 ——在方法的返回值中返回字符串: "forward:/资源名"
  2. 重定向 ——在方法的返回值中返回字符串: "redirect:/资源名"

我们来练习下请求转发和请求重定向以及发现一个细节

 


请求转发和请求重定向的具体区别:

  1. 请求重定向将重新定位到资源,相当于一次全新的访问。请求转发由服务器转发。
  2. 请求转发请求的地址不发生变化,请求重定向请求的地址发生变化。
  3. 请求重定向与直接访问新地址效果一致;请求转发由服务器端完成,可能存在原外部资源不能访问。

请求转发如果资源和转发的页面不在同一目录下,将会导致转发的页面的外部资源不可访问。

 

相关文章:

SpringMVC学习总结(路由映射、参数传递、转发和重定向...)

目录 1. MVC简介 2. SpringMVC简介 3. 路由映射注解 3.1 RequestMapping 3.2 GetMapping与PostMapping 4. 接收前端传递参数 4.1 接收单/多个参数 4.2 接收对象 4.3 接收JSON对象 4.4 后端参数重命名/映射 4.5 设置参数必传/非必传 4.6 获取URL中的参数 4.7 获取文…...

基于MAC地址的ACL配置

基于MAC地址的ACL配置 【实验目的】 掌握基于MAC地址的标准ACL的配置。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 S1 e0/0 N/A N/A N/A e0/1 N/A N/A N/A PC1 N/…...

软件设计师 计算机网络

名字带IP AP的都是网络层 所有带T的除了TFTP其他都是TCP,所有不带T的除了POP3其他都是UDP​ **物理层的互联设备有中继器和集线器,集线器是一种特殊的多路多端口中继器 网络层:路由器 物理层:中继器 数据链路层:网桥…...

Gradle ——Gradle安装与配置

目录 一、简介 二、功能和特点 三、安装 参考: Gradle_百度百科 Gradle 学习 ----Gradle 入门_你若不离不弃,我必生死相依的博客-CSDN博客 还有硬石科技的开源wifiAPP程序,没找到他们的码仓 一、简介 Gradle是一个基于Apache Ant和Apache Maven概念…...

网络安全这条路到底该怎么走?

我之前就写过一篇文章专门解答了这个问题。但是还是有很多小伙伴并不清楚这条路该怎么走下去! 不同于Java、C/C等后端开发岗位有非常明晰的学习路线,网路安全更多是靠自己摸索,要学的东西又杂又多,难成体系。 网络安全虽然是计算…...

【C++】位图(海量数据处理)

文章目录 抛出问题:引入位图位图解决 位图的概念位图的实现结构构造函数设置位清空位判断这个数是否存在反转位size与count打印函数 位图的应用 抛出问题:引入位图 问题:给40亿个不重复的无符号整数,没排序,给一个无符号整数,如何…...

外包干了五年,废了...

先说一下自己的情况。大专生,17年通过校招进入湖南某软件公司,干了接近5年的测试点点点,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了五年的点工…...

请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨)为什么很多人说崖山海战以后无中国

目录 请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨) 为什么很多人说崖山海战以后无中国 请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨) 以下是我对《unravel - TK from 凛冽时雨》这首歌词的理解&#xff1…...

从8连挂到面面offer,我只用了一个月,面试25K测试岗血泪经验分享给你

直到如今,我才敢把这段经历分享出来,毕竟一个多月前,我是经历了面试八连挂的人。作为一只骄傲的软件测试工程师,恨不得找一块豆腐撞死。但是在闭关修炼了一个多月之后,重新出来面试,面试了五家公司&#xf…...

计算机操作系统(慕课版)第二章课后题答案

一、简答题 (1)什么是前趋图?试画出下面四条语句的前趋图. S1:axy; S2:bz1; S3:ca-b; S4:wc1; 答:前趋图(Precedence Graph)是一个有向无循环图,…...

【离散数学】置换群和伯恩赛德定理编程题

1:置换的轮换表示 给出一个置换,写出该置换的轮换表示。比如 (1 2 3 4 5 6 7 8 9) (3 1 6 2 9 7 8 4 5) 表示为(1 3 6 7 8 4 2)(5 9) 输入: 置换后的序列 输出: 不相杂的轮换乘积,每行表示一个轮换(轮换的起…...

【自然语言处理】 - 作业2: seq2seq模型机器翻译

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…...

随身WIFI折腾日记(四)---拓展USB接口读取U盘内容

五、USB行为控制 随身WIFI对外交互的接口只有WIFI和USB接口。如果要想接入其他硬件设备,拓展USB接口至关重要,对于USB接口的控制,参考如下链接: openstick项目官方教程:控制usb行为 HandsomeMod/gc: A Simple Tool To Control Usb Gadget …...

【C++初阶】类与对象(中)之取地址及const取地址操作符重载(了解即可)

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…...

代驾公司如何管理司机

在这个几乎人人都能学车,人人都能开车的时代,代驾职业也越来越专业化和正规化。因此,想要成为一名优秀的代驾司机,一定得有过人之处,对于代驾公司来说,如何管理司机也是尤为的重要。 对于代驾公司来说&…...

面了一个5年经验的测试工程师,自动化都不会也敢喊了16k,我也是醉了····

在深圳这家金融公司也待了几年,被别人面试过也面试过别人,大大小小的事情也见识不少,今天又是团面的一天, 一百多个人都聚集在一起,因为公司最近在谈项目出来面试就2个人,无奈又被叫到面试房间。 整个过程…...

ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之网络安全新定义

ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时 网络安全新定义总结 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序,是人工智能技术驱动…...

LeetCode_DFS_困难_1377.T 秒后青蛙的位置

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一棵由 n 个顶点组成的无向树,顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下: 在一秒内,青蛙从它所在的当前顶点跳到另一个未访问过的顶点(如果它…...

第四十九天学习记录:C语言进阶:结构体

结构体 结构体的声明 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 struct tag {member-list; }variable-list;问:C的new和C语言的结构体有什么异同? ChatAI答: C中的new是一个运算符&#xff…...

LeeCode [N字形变换]算法解析

关键字:数学归纳法 一、题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P A H N A P L S I I G Y I R …...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...