Spring(1)——mvc概念,部分常用注解
1、什么是Spring Web MVC?
Spring MVC 是一种基于 Java 的实现了 MVC(Model-View-Controller,模型 - 视图 - 控制器)设计模式的 Web 应用框架,它是 Spring 框架的一个重要组成部分,用于构建 Web 应用程序。
1.1 MVC定义

MVC是Model,View,Controller的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分。
**View(视图):**指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
**Model(模型):**是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
**Controller(控制器):**可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型 。
1.2 什么是Spring MVC?
Sping MVC是对MVC架构的实现,是一个Web框架,不过Sping MVC中MVC的架构稍有改变

浏览器发来的请求将直接通过控制器简单处理后,传给对应的模型而不经过视图。
对于Spring MVC,当用户在浏览器中输入了URL之后是如何感知到用户的请求并给予相应的?
主要分以下三个方面:
-
建⽴连接:将用户(浏览器)和Java程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring程序。
-
请求:⽤⼾请求的时候会带⼀些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参数
的功能。 -
响应:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤⼾,也就是响应. 。
1.2.1 传递参数
下面四种分别体现了get和post的两种实现方式
@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping(value = "/v1",method = RequestMethod.GET)public String v1() {return "Hello method = RequestMethod.GET";}@GetMapping("/v2")public String v2() {return "Hello GetMapping";}@RequestMapping(value = "/v3", method = RequestMethod.POST)public String v3() {return "Hello method = RequestMethod.POST";}@PostMapping("/v4")public String v4() {return "Hello PostMapping";}
}
1.2.2 传递对象
- 如果参数⽐较多时,⽅法声明就需要有很多形参.并且后续每次新增⼀个参数,也需要修改⽅法声明.
- 我们不妨把这些参数封装为⼀个对象.
- SpringMVC也可以⾃动实现对象参数的赋值,⽐如Person对象:
- 需要注意的是对象类必须完成get和set方法Spring才能赋值和取值
public class Person {
private int id;
private String name;
private String password;public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
传递对象代码实现:
@RequestMapping("/m3")
public Object method3(Person p){
return p.toString();
}
1.2.3 给参数重命名
前后端对同一个参数名称命名习惯可能不同,比如对于用户名,前端有可能是userName,后端是name。这种情况就需要给参数重命名。
创建前端请求:

后端使用**@RequestParam**注解:

前端得到的相应:

如果此时前端名称改为name,即和后端参数列表中同一参数名一样是不能传递成功的:


就是说后端只认重命名注解中的名字。
还有一点需要注意的是,当对一个参数使用了**@RequestParam**注解时,这个参数就默认成为了必传参数,即前端如果没有传递该参数,会产生请求错误:


可以得出结论:
-
使⽤**@RequestParam** 进⾏参数重命名时,请求参数只能和**@RequestParam** 声明的名称⼀
致,才能进⾏参数绑定和赋值. -
使⽤ @RequestParam 进⾏参数重命名时,参数就变成了必传参数.
如果我们的实际业务前端的参数是⼀个⾮必传的参数,针对上述问题,如何解决呢?
先来了解下参数必传的原因,我们查看 @RequestParam 注解的实现细节就可以发现端倪,注解实现如下:
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {@AliasFor("name")String value() default "";@AliasFor("value")String name() default "";boolean required() default true;String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
可以看到 required 的默认值为true,表⽰含义就是:该注解修饰的参数默认为必传。既然如此,我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错,
具体实现如下 :
@RequestMapping("/v3")public String v3(@RequestParam(value = "userName",required = false) String name, Integer age){return name + " " + age;}
此时被**@RequestParam**注解的参数就不是必传参数了

1.2.4 传递数组
代码如下:
@RequestMapping("/v4")public String v4(String[] array){System.out.println(array.length);return Arrays.toString(array);}
前端可以这样传
-

后端也可以看到数组长度为4
-

同一个参数传多次,也会被认为同一个数组,后端也可以看到数组长度为3
1.2.5 传递List
@RequestMapping("/v5")public String v5(@RequestParam List<String> list){System.out.println(list.size());return Arrays.toString(list.toArray());}
需要用**@RequestParam**对参数进行标记
1.3 传递JSON数据
1.3.1 JSON的语法:
- 数据在键值对(Key/Value) 中
- 数据由逗号**,**分隔
- 对象⽤ {} 表示
- 数组⽤** []** 表示
- 值可以为对象,也可以为数组,数组中可以包含多个对象
1.3.2 JSON的两种结构
- 对象:⼤括号 {} 保存的对象是⼀个⽆序的键值对集合。⼀个对象以左括号 { 开始,右括号 }
结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔 - 数组:中括号 [] 保存的数组是值(value)的有序集合.⼀个数组以左中括号 [ 开始,右中括
号 ] 结束,值之间使⽤逗号 , 分隔。
如下:

1.3.3 Json字符串和Java对象的转换
JSON本质上是⼀个字符串,通过⽂本来存储和描述数据。
SpringMVC框架也集成了JSON的转换⼯具,我们可以直接使⽤,来完成JSON字符串和Java对象的互转。
//对象
public class User {String name;int age;String gender;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}
使⽤ObjectMapper对象提供的两个⽅法,可以完成对象和JSON字符串的互转
writeValueAsString:把对象转为JSON字符串
readValue:把字符串转为对象
public class JsonTest {public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();User user = new User();user.age = 17;user.name = "火车";//对象转jsonString s = objectMapper.writeValueAsString(user);System.out.println("json字符串:" + s);//json转对象User user1 = objectMapper.readValue(s, user.getClass());System.out.println(user1);}
}
运行结果:

Json字符串和Java对象的转换本质上是jackson-databind提供的功能,SpringMVC框架中已经把该⼯具包引⼊了进来,咱们直接使⽤即可,如果脱离SpringMVC使⽤,需要引⼊相关依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.5</version>
</dependency>
1.3.4 传递Json对象
接受JSON对象,需要使用**@RequsetBody**注解。
@RequestMapping("/v6")
public String v6(@RequestBody User user){return user.toString();
}

1.4 获取URL中的参数
使用**@PathVariable**注解
@RequestMapping("/user/{id}/{name}")public String getArticle(@PathVariable("id") String id,@PathVariable("name") String name){return "id:" + id + "\n" + "name:" +name;}

1.5上传文件
@RequestMapping("/v7")public String getFile(@RequestPart("file")MultipartFile file) throws IOException {String originalFilename = file.getOriginalFilename();file.transferTo(new File("f:\\重头来过\\" + file.getOriginalFilename()));return "接收到文件名称为: " + originalFilename;}

可以看到上传成功

二、总结
- @RequestMapping:路由映射
- @RequestParam:后端参数重命名
- @RequestBody:接收JSON类型的参数
- @PathVariable:接收路径参数
- @RequestPart:上传⽂件
相关文章:
Spring(1)——mvc概念,部分常用注解
1、什么是Spring Web MVC? Spring MVC 是一种基于 Java 的实现了 MVC(Model-View-Controller,模型 - 视图 - 控制器)设计模式的 Web 应用框架,它是 Spring 框架的一个重要组成部分,用于构建 Web 应用程序。…...
C语言(23)
字符串函数 11.strstr函数 1.1函数介绍: 头文件:string.h char *strstr ( const char * str1,const char *str2); 作用:在一个字符串(str1)中寻找另外一个字符串(str2)是否出现过 如果找到…...
Immich自托管服务的本地化部署与随时随地安全便捷在线访问数据
文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 小伙伴们,你们好呀!今天要给大家揭秘一个超炫的技能——如何把自家电脑变成私人云相册,并…...
基于SpringBoot的在线付费问答系统设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【Linux】信号处理以及补充知识
目录 一、信号被处理的时机: 1、理解: 2、内核态与用户态: 1、概念: 2、重谈地址空间: 3、处理时机: 补充知识: 1、sigaction: 2、函数重入: 3、volatile&…...
pandas——to_datatime用法
Pandas中pd.to_datetime的用法及示例 pd.to_datetime 是 Pandas 库中用于将字符串、整数或列表转换为日期时间(datetime)对象的核心函数。它在处理时间序列数据时至关重要,能够灵活解析多种日期格式并统一为标准时间类型。以下是其核心用法及…...
《DataWorks 深度洞察:量子机器学习重塑深度学习架构,决胜复杂数据战场》
在数字化浪潮汹涌澎湃的当下,大数据已然成为推动各行业发展的核心动力。身处这一时代洪流,企业对数据的处理与分析能力,直接关乎其竞争力的高低。阿里巴巴的DataWorks作为大数据领域的扛鼎之作,凭借强大的数据处理与分析能力&…...
Java 大视界 -- 基于 Java 的大数据实时数据处理框架性能评测与选型建议(121)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
多线程-JUC
简介 juc,java.util.concurrent包的简称,java1.5时引入。juc中提供了一系列的工具,可以更好地支持高并发任务 juc中提供的工具 可重入锁 ReentrantLock 可重入锁:ReentrantLock,可重入是指当一个线程获取到锁之后&…...
DeepSeek:中国AGI先锋,用技术重塑通用人工智能的未来
在ChatGPT掀起全球大模型热潮的背景下,中国AI领域涌现出一批极具创新力的技术公司,深度求索(DeepSeek)便是其中的典型代表。这家以“探索未知、拓展智能边界”为使命的AI企业,凭借长文本理解、逻辑推理与多模态技术的…...
Vue 框架深度解析:源码分析与实现原理详解
文章目录 一、Vue 核心架构设计1.1 整体架构流程图1.2 模块职责划分 二、响应式系统源码解析2.1 核心类关系图2.2 核心源码分析2.2.1 数据劫持实现2.2.2 依赖收集过程 三、虚拟DOM与Diff算法实现3.1 Diff算法流程图3.2 核心Diff源码 四、模板编译全流程剖析4.1 编译流程图4.2 编…...
Python爬虫获取淘宝快递费接口的详细指南
在电商运营中,快递费用的透明化和精准计算对于提升用户体验、优化物流成本以及增强市场竞争力至关重要。淘宝提供的 item_fee 接口能够帮助开发者快速获取商品的快递费用信息。本文将详细介绍如何使用 Python 爬虫技术结合 item_fee 接口,实现高效的数据…...
基于BMO磁性细菌优化的WSN网络最优节点部署算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 无线传感器网络(Wireless Sensor Network, WSN)由大量分布式传感器节点组成,用于监测物理或环境状况。节点部署是 WSN 的关键问…...
Android Activity的启动器ActivityStarter入口
Activity启动器入口 Android的Activity的启动入口是在ActivityStarter类的execute(),在该方法里面继续调用executeRequest(Request request) ,相应的参数都设置在方法参数request中。代码挺长,分段现在看下它的实现,分段一&#x…...
Python深度学习算法介绍
一、引言 深度学习是机器学习的一个重要分支,它通过构建多层神经网络结构,自动从数据中学习特征表示,从而实现对复杂模式的识别和预测。Python作为一门强大的编程语言,凭借其简洁易读的语法和丰富的库支持,成为深度学…...
关于sqlalchemy的使用
关于sqlalchemy的使用 说明一、sqlachemy总体使用思路二、安装与创建库、连结库三、创建表、增加数据四、查询记录五、更新或删除六、关联表定义七、一对多关联查询八、映射类定义与添加记录 说明 本教程所需软件及库python3.10、sqlalchemy安装与创建库、连结库创建表、增加数…...
利用LLMs准确预测旋转机械(如轴承)的剩余使用寿命(RUL)
研究背景 研究问题:如何准确预测旋转机械(如轴承)的剩余使用寿命(RUL),这对于设备可靠性和减少工业系统中的意外故障至关重要。研究难点:该问题的研究难点包括:训练和测试阶段数据分布不一致、长期RUL预测的泛化能力有限。相关工作:现有工作主要包括基于模型的方法、数…...
深度学习 PyTorch 中 18 种数据增强策略与实现
深度学习pytorch之简单方法自定义9类卷积即插即用 数据增强通过对训练数据进行多种变换,增加数据的多样性,它帮助我们提高模型的鲁棒性,并减少过拟合的风险。PyTorch 提供torchvision.transforms 模块丰富的数据增强操作,我们可以…...
视觉图像处理
在MATLAB中进行视觉图像处理仿真通常涉及图像增强、滤波、分割、特征提取等操作。以下是一个分步指南和示例代码,帮助您快速入门: 1. MATLAB图像处理基础步骤 1.1 读取和显示图像 % 读取图像(替换为实际文件路径) img = imread(lena.jpg); % 显示原图 figure; subplot(2…...
深度学习与普通神经网络有何区别?
深度学习与普通神经网络的主要区别体现在以下几个方面: 一、结构复杂度 普通神经网络:通常指浅层结构,层数较少,一般为2-3层,包括输入层、一个或多个隐藏层、输出层。深度学习:强调通过5层以上的深度架构…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
