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。
- 其中Model模型层用于处理应用程序中数据逻辑,作为实体类与数据库进行交互同时也是数据的载体;
- View视图层主要负责数据向用户的展示;
- 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有以下区别:
- 使用@GetMapping配置的路由信息对应的方法只支持Get请求
- 同理,使用@PstMapping配置的路由对应的方法只支持Post请求
4. 接收前端传递参数
4.1 接收单/多个参数
在SpringMVC中,我们可以直接通过在方法的参数上添加参数来接收前端传递过来的参数,不过,在方法上添加参数时有以下注意事项:
- 添加的参数名称要和前端发送请求时指定的参数名称一致
- 添加参数的类型使用引用数据类型
- 当有多个参数时,后端方法参数的顺序不影响参数值的接收
我们来看看这些注意事项如没有被重视会导致什么后果:
4.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中携带的参数的获取:
![]()
要实现上面的参数的获取方式,我们需要
- 修改我们后端程序中的映射URL的格式
- 使用注解@PathVariable
如下图所示:
4.7 获取文件
在Spring中,我们又该怎样获取前端上传的文件信息呢?获取步骤共分为以下两步:
- 使用@RequestPart注解标注参数代表这是一个文件变量
- 指定@RequestPart中的name属性
- 文件变量使用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默认情况下返回的就是静态页面,我们只需要:
- 不标注@ResponseBody注解,方法的返回值类型为Object/String都可以
- 将返回的信息修改为静态页面路径信息即可
如下:
5.2 返回text/html
默认情况下,标注了返回类型为数据的@ResponseBody注解后返回的字符串即为text/html格式:
5.3 返回JSON对象
我们只需要返回一个对象或者一个字典类型的对象如HashMap,并使用注解@ResponseBody指定返回类型为数据格式即可。
- 如果返回的是普通对象:SpringMVC会将对象转换为JSON格式的字符串并以JSON的格式返回给前端。其中JSON对象的key值为对象的属性名称,value值为对象的属性的值。
- 如果返回的是字典类型的对象,SpringMVC也会将其转换为JSON格式的字符串并以JSON格式返回给前端。其中JSON对象的key值为字典类型的key值,JSON对象的value值为字典类型的value值。
如下:
6. 请求转发和请求重定向
再SpringMVC中,方法返回的不仅可以是一个页面或数据,还可以返回一个字符串来实现跳转。实现跳转的方式有以下两种:
- 转发 ——在方法的返回值中返回字符串: "forward:/资源名"
- 重定向 ——在方法的返回值中返回字符串: "redirect:/资源名"
我们来练习下请求转发和请求重定向以及发现一个细节:
请求转发和请求重定向的具体区别:
- 请求重定向将重新定位到资源,相当于一次全新的访问。请求转发由服务器转发。
- 请求转发请求的地址不发生变化,请求重定向请求的地址发生变化。
- 请求重定向与直接访问新地址效果一致;请求转发由服务器端完成,可能存在原外部资源不能访问。
请求转发如果资源和转发的页面不在同一目录下,将会导致转发的页面的外部资源不可访问。
相关文章:
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 凛冽时雨》这首歌词的理解࿱…...
从8连挂到面面offer,我只用了一个月,面试25K测试岗血泪经验分享给你
直到如今,我才敢把这段经历分享出来,毕竟一个多月前,我是经历了面试八连挂的人。作为一只骄傲的软件测试工程师,恨不得找一块豆腐撞死。但是在闭关修炼了一个多月之后,重新出来面试,面试了五家公司…...
计算机操作系统(慕课版)第二章课后题答案
一、简答题 (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航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞…...
代驾公司如何管理司机
在这个几乎人人都能学车,人人都能开车的时代,代驾职业也越来越专业化和正规化。因此,想要成为一名优秀的代驾司机,一定得有过人之处,对于代驾公司来说,如何管理司机也是尤为的重要。 对于代驾公司来说&…...
面了一个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是一个运算符ÿ…...
LeeCode [N字形变换]算法解析
关键字:数学归纳法 一、题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P A H N A P L S I I G Y I R …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...





















