揭开Spring MVC的真面目
官方对于Spring MVC的描述为:
Spring Web MVC是基于Servlet API框架构建的原始Web框架,从一开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring-MVC”。
目录
Spring MVC 介绍
学习Spring MVC
连接
@RequestMapping
指定类型
获取参数
获取对象
参数重命名(参数映射)
接收Json对象
从URL中获取参数
上传文件
获取Cookie
获取Session
获取Header
编辑
请求定向和请求转发
Spring MVC 介绍
MVC 是Model View Controller的缩写,是软件工程中的一种软件架构模式,它把软件系统分成模型、视图和控制器三个部分。
MVC是一种思想,而Spring MVC是对MVC思想的具体实现:
Spring MVC是一个实现了MVC模式,并继承了Servlet API的Web框架。既然是Web框架,那么当用户在浏览器中输入了url之后,我们的Spring MVC项目就可以感知到用户的请求。
现在绝大多数的Java项目都是基于Spring 或Spring Boot,而Spring的核心就是Spring MVC。
在创建Spring Boot项目时,我们勾选的Spring Web框架其实就是Spring MVC框架:

学习Spring MVC
学习Spring MVC需要掌握三个功能:
连接、获取参数、输入数据。
连接
在项目创建好之后,创建一个UserController类,实现用户到Spring程序的互联互通:

我们用到了三个注释:@Controller @ResponseBody @RequestMapping
@Controller:五大类注解,表示把这个类添加到IoC容器中,供Spring拿到。
@ResponseBody:表示把这个Java对象转换成json格式相关的内容,表示返回非页面数据
通过@RestController = @Controller + @ResponseBody 可以完成两个注释的内容合二为一。
@RequestMapping
@RequestMapping既可以修饰类也可以修饰方法,当修饰类和方法时,访问的地址是类 + 方法。
并且也可以直接修饰方法。

指定类型
@RequestMapping可以为GET方法也可以为POST方法,如果不规定则两个方法都可以用。但如果要求只能是POST或者只能是GET方法呢?
想只要GET方法,有两种写法:
- @RequestMapping(value = "/user",method = RequestMethod.GET)
- @GetMapping("/index")
想只要POST方法,有两种写法:
- @RequestMapping(value = "/user",method = RequestMethod.POST)
- @PostMapping("/user")
获取参数
在Spring MVC中可以直接用方法中的参数来实现传参,相比于Servlet中大费周折的getParameter等方式简单了很多。

在Spring MVC中,只需要方法的形参和前端传入的变量名相同,就能够直接获取到相关的参数。
获取对象
Spring MVC可以自动实现参数对象的赋值:


并且当有多个参数的时候,前后端匹配数据的时候以名称进行匹配的,因此参数的位置不影响后端获取的参数的结果。
参数重命名(参数映射)
和前面提到的一样,如果前后端名称不一样但是想要获取到匹配的数据,此时可以使用@RequestParam 来重命名前后端的参数值。
例如,前端传来的参数为username,但是后端为name,此时给后端参数重命名:

并且如果某个参数是非必传参数的话,可以设置@RequestParam中的requird=false来避免不传递时报错:
接收Json对象
这次我们不用表单的形式来传对象,而是使用Json的格式来传递对象。只有使用了@RequestBody后才能正确的把对象解析出来。


从URL中获取参数
对于前面的通过表单的形式拿数据,主要是通过URL中?后面的值来传递。现在还有一种方式可以传递,就是通过@PathVariable直接拿到URL中的参数。
例如: localhost:8080/user/123/zhangsan/123456
这种方式和问号后面加上数据相对比有两个优点:
1.对于搜索引擎来说,抓取关键字权重更高
2.URL更简洁
@RequestMapping时需要加上相应的属性,在传递形参的时候使用@PathVarable来获取,如果传递的参数和属性名不同时,也可以使用重命名。

如果RequestMapping和形参名称不一样就可以使用@PathVarable的重命名来表示。
- @PathVariable ->基础URL里面的参数(?之前的参数)
- @RequestParm->URL参数部分的参数(?之后的参数)
上传文件
使用@RequestPart来上传文件。

之后使用Postman来模拟前端发来的图片:
在新文件的地址中,可以看到新的文件已经生成。但是有几个问题,比如这样重复一次,新文件会覆盖旧文件。并且不能重命名文件。
最靠谱的保证文件名唯一的命名方法,是使用UUID。简单说这个UUID是不会重复的。
UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。
首先我们要解决文件格式的问题。之前我们使用的是png,如果原文件是jpg还好说,如果是gif等就会出错。所以我们需要获取原生的文件名,把文件名的前部分使用UUID替换,文件名的后缀截取到再重命名。
这样即使是上传同样的文件,也不会覆盖之前的文件。
@RestController
public class UserController {@RequestMapping("/upload")public Object upload(@RequestPart("myimg") MultipartFile file){String fileName = UUID.randomUUID()+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));File saveFile = new File("C:\\MyCode\\" + fileName);try {file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;}
}
获取Cookie
在之前的Servlet中,我们已经使用过HttpServletResponse和HttpServletRequest来获取cookie,我们现在使用更简单的方法获取:
通过@CookieValue注解来把获取到的cookie得到,代码中重命名的是java,所以当我们自己伪造一个名字为java的cookie后就可以获取到。


获取Session
通过@SessionAttribute来方便的获取到Session。

获取Header
使用@RequestHeader获取到Header。
请求定向和请求转发
请求转发和请求重定向有什么区别? | Javaᶜⁿ 面试突击 (javacn.site)
相关文章:
揭开Spring MVC的真面目
官方对于Spring MVC的描述为: Spring Web MVC是基于Servlet API框架构建的原始Web框架,从一开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring-MVC…...
AI大模型开发架构设计(3)——如何打造自己的大模型
文章目录 如何打造自己的大模型1 新时代职场人应用AIGC的5重境界2 人人需要掌握的大模型原理职场人都能听懂的大语音模型的训练过程职场人都能听得懂的大语言模型的Transformer推理过程 3 如何构建自己的大模型需要具备三个方面的能力LangChain是什么?LangChain主要…...
Linux C语言开发(三)运算符和表达式
目录 一.什么是运算符 二.什么是表达式 一.什么是运算符 在C语言中,运算符是用于执行特定操作的符号。这些操作可以涉及一个或多个值(称为操作数),并产生一个新的值或效果。C语言提供了多种类型的运算符,用于执行算术、比较、逻辑和其他类型的操作。 以下是C语言中常见的…...
Spring-AOP入门案例
文章目录 Spring-AOP入门案例概念:通知(Advice)切入点(Pointcut )切面(Aspect) 目标对象(target)代理对象(Proxy)顾问(Advisor)连接点(JoinPoint) 简单需求:在接口执行前输出当前系统时间Demo原始未添加aop前1 项目包结构2 创建相…...
中仕教育:国考调剂和补录的区别是什么?
国考笔试成绩和进面名单公布之后,考生们就需要关注调剂和补录了,针对二者之间的区别很多考生不太了解,本文为大家解答一下关于国考调剂和补录的区别。 1.补录 补录是在公式环节之后进行的,主要原因是经过面试、体检和考察&#…...
ESP32-TCP服务端(Arduino)
将ESP32设置为TCP服务器 介绍 TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的(一个客户端对应一个服务端)、可靠的传输层协议。在TCP的工作原理中,它会将消息或文件分解为更小的片段&a…...
HCIA-HarmonyOS设备开发认证-序
序 最近涉及到HarmonyOS鸿蒙系统设备开发,在网络上已经有很多相关资料,视频教程,我也移植了公司的一个stm32G474板卡,运行LiteOS-m L0系统。 一面看资料一面移植,遇到不少坑,当看到运行的LOGO时࿰…...
Med-YOLO:3D + 医学影像 + 检测框架
Med-YOLO:3D 医学影像 检测框架 提出背景设计思路网络设计训练设计讨论分析 魔改代码:加强小目标检测总结 提出背景 论文链接:https://arxiv.org/abs/2312.07729 代码链接:https://github.com/JDSobek/MedYOLO 提出背景&…...
Docker部署Golang服务
不管是开发还是生产环境,通过 docker 方式部署服务都是一种不错的选择,能够解决不同开发环境一致性的问题。 本文以项目:https://github.com/johncxf/go-api 为例。 Dockerfile 构建 Go 运用环境 在项目根目录下添加 Dockerfile 文件&…...
C#,字符串匹配(模式搜索)Sunday算法的源代码
Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法。 核心思想:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配&…...
makefile 编译动态链接库使用(.so库文件)
makefile 编译动态链接库使用(.so库文件) 动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载, 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享 动态链接库 动态&#…...
Hive 数仓及数仓设计方案
数仓(Data Warehouse) 数据仓库存在的意义在于对企业的所有数据进行汇总,为企业各个部门提供一个统一、规范的出口。做数仓就是做方案,是用数据治理企业的方案。 数据仓库的特点 面向主题集成 公司中不同的部门都会去数据仓库中拿数据,把独…...
Ubuntu使用docker-compose安装redis
ubuntu环境搭建专栏🔗点击跳转 Ubuntu系统环境搭建(十三)——使用docker-compose安装redis 文章目录 Ubuntu系统环境搭建(十三)——使用docker-compose安装redis1.搭建文件夹2.docker-compose.yaml配置文件3.redis.co…...
大数据安全 | 期末复习(上)| 补档
文章目录 📚概述⭐️🐇大数据的定义、来源、特点🐇大数据安全的含义🐇大数据安全威胁🐇保障大数据安全🐇采集、存储、挖掘环节的安全技术🐇大数据用于安全🐇隐私的定义、属性、分类、…...
Kylin 安装novnc 远程访问
noVNC可以使用浏览器直接访问服务器,而不需要使用VNC客户端。 1.初始环境 关闭防火墙或允许IP访问本机 2.安装依赖 dnf install -y tigervnc-server git 3.git下载novnc git clone https://github.com/novnc/noVNC.git git clone https://gitee.com/yangyizhao…...
神经网络算法与逻辑回归:优势与差异
神经网络算法和逻辑回归都是预测模型中的重要工具,但它们在处理复杂和非线性问题时表现出不同的性能。本文将深入探讨神经网络算法相对于逻辑回归的优势,以及它们在不同场景下的适用性。 一、引言 神经网络算法和逻辑回归都是预测模型中的重要工具&…...
【蓝桥杯冲冲冲】动态规划初步[USACO2006 OPEN] 县集市
蓝桥杯备赛 | 洛谷做题打卡day13 文章目录 蓝桥杯备赛 | 洛谷做题打卡day13题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例说明数据规模与约定 思路:方程: 题解代码我的一些话 [USACO2006 OPEN] 县集市 The County Fair 题目描述 每年…...
C#,入门教程(30)——扎好程序的笼子,错误处理 try catch
上一篇: C#,入门教程(29)——修饰词静态(static)的用法详解https://blog.csdn.net/beijinghorn/article/details/124683349 程序员语录:凡程序必有错,凡有错未必改! 程序出错的原因千千万&…...
操作教程|JumpServer堡垒机结合Ansible进行批量系统初始化
运维人员常常需要对资产进行系统初始化的操作,而初始化服务器又是一项繁琐的工作,需要花费运维人员大量的时间和精力。为了提高效率,许多组织会使用自动化工具和脚本来简化这些任务。自动化工具的运用可以大幅降低运维人员的工作量࿰…...
序列化VS反序列化
序列化、反序列化定义 如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。 序列化(Serialization)是指将对象转换为字节序列的过程,也可以称之为对象的持…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
