SpringMVC 请求参数接收
目录
请求
传递单个参数
基本类型参数传递
未传递参数
?传递参数类型不匹配
传递多个参数
传递对象
后端参数重命名
传递数组
传递集合
传递JSON数据
JSON是什么
JSON的优点
传递JSON对象
获取URL中的参数
文件上传
在浏览器与程序进行交互时,主要分为三个阶段:
**1. 建立连接:**将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到Spring程序
2. 请求:用户请求时会携带一些参数,在程序中要想办法获取到参数,因此请求这部分主要是获取参数的功能
**3. 响应:**在执行了业务逻辑之后,要将程序执行的结果返回给客户,也就是响应
在本篇文章中,我们来学习请求(获取参数)这部分内容
请求
访问不同的路径,就是发送不同的请求,在发送请求时,可能会带一些参数,因此学习 Spring 的请求,主要就是学习 如何传递参数到后端 以及 后端如何接收参数
在本篇文章中,为了更方便学习,则不采用前端传递参数,而是使用 浏览器 和 postman 来模拟
传递单个参数
接收单个参数时,直接用方法中的参数即可:
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping(value = "/login")public String login(String name) {return "接收到用户名: " + name;}
}
使用 浏览器发送请求:127.0.0.1:8080/user/login?name=zhangsan

后端程序正确拿到 name 参数的值
Spring MVC 会根据方法的参数名,找到对应的参数,赋值给方法

当参数名称不一致时,获取不到参数:

当未传递参数时:

基本类型参数传递
我们测试使用基本类型来接收参数时:
@RequestMapping("/test")
@RestController
public class TestController {@RequestMapping("/getInt")public String getInt(int age) {return "接收到参数age: " + age;}
}

未传递参数

报了 500 错误
500 错误码是指**“Internal Server Error**”(服务器内部错误),是表示服务器在处理请求时遇到了未知的错误或异常情况。这种错误通常是由服务器端代码出现问题引起的,而不是客户端请求的问题。
我们查看日志信息:

int 类型的参数 age 虽然是可选的,但是由于被声明为基本类型而不能转换为空值。考虑将其声明为对应基本类型的包装类型
我们使用包装类型 Integer 来接收参数:
@RequestMapping("/getInteger")public String getInt(Integer age) {return "接收到参数age: " + age;}

当未传递对应参数时,接收到的数据为 null
在使用基本类型来接收参数时,参数必须传(除了 boolean 类型)
当使用 boolean 类型接收时:
@RequestMapping("/getBoolean")public String getBoolean(boolean b) {return "接收到参数b: " + b;}
未传递参数时,默认值为 false:

因此,对于参数可能为空的数据,建议使用包装类型接收
传递参数类型不匹配

此时报了 400 错误
400 错误码是指"Bad Request"(错误请求),表示服务器无法理解客户端发送的请求,因为请求语法有误、请求参数无效或者请求消息体格式错误等。
我们观察后端日志:

类型转换失败
传递多个参数
与接收单个参数一样,直接使用方法的参数接收即可:
@RequestMapping(value = "/login")public String login(String name, String password) {return "接收到用户名: " + name + " 接收到密码: " + password;}

后端程序正确拿到了 name 和 password 参数的值
当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置不影响后端数据获取参数的结果

传递对象
当参数比较多时,就需要很多形参,并且每增加一个参数,就需要修改方法的声明,此时,我们可以将这些参数封装为一个对象
public class Student {private int id;private String name;private int age;private String sex;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 int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + ''' +", age=" + age +", sex='" + sex + ''' +'}';}
}
传递对象:
@RequestMapping("/getStudent")public String getStudent(Student student) {return "接收到参数student: " + student;}
后端程序正确接收到各个属性的值

Spring 会根据参数名称自动绑定到对象的各个属性

当某个属性未传递时,则赋值为null,基本类型则赋值为默认初始值

后端参数重命名
前端传递的参数 key 和 后端接收到的 key 可以不一致,例如前端传递参数 name 给后端,而后端使用 userName 来接收,这种请求下,我们可以使用注解 @RequestParam 来重命名前后端的参数值
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")public String login(@RequestParam("name") String userName) {return "接收到用户名: " + userName;}
}

传递的参数 name 正确绑定到后端参数 userName 上

而此时,若使用 userName 进行传参:
观察打印的错误日志:

请求参数 name 不存在
我们可以发现:
1. 在使用 @RequestParam 进行重命名时,请求参数只能与 @RequestParam 声明的名称一致,才能进行参数绑定和赋值
2. 在使用 @RequestParam 进行重命名时,参数就变成了必传参数
在使用 @RequestParam 时,若前端参数是一个非必传参数,此时该如何解决呢?
我们查看 @RequestParam 注解的实现细节:

我们可以看到, required 的默认值为 true,表示:该注解修饰的参数默认为必传
因此,我们可以设置 @RequestParam 中的 required = false,来避免不传递参数时报错:
@RequestMapping("/login")public String login(@RequestParam(value = "name", required = false) String userName) {return "接收到用户名: " + userName;}
在添加 required = false后,name 前面也加上了 key,value = “name”
注解属性赋值时,若未指明 key,则默认为 value 属性
若需要有多个属性进行赋值,则需要写上 key
传递数组
Spring MVC 可以自动绑定数组参数的赋值:
@RequestMapping("/test")
@RestController
public class TestController {@RequestMapping("getArray")public String getArray(String[] array) {return Arrays.toString(array);}
}
发送请求并传参:

中间分割的 , 必须为英文的逗号
也可使用:

请求参数名与形参数组名称相同且请求参数多个,后端定义数组类型形参即可接收参数
传递集合
集合参数与数组类似,同一个请求参数名有多个,且需要使用 @RequestParam 绑定参数关系
默认情况下,请求中参数名相同的多个值,是封装到数组中的,若需要封装到集合中,需要使用 @RequestParam 绑定参数关系
@RequestMapping("/getList")public String getList(@RequestParam List<String> list) {return "接收到参数list" + list;}
同样的,有两种方式进行传参:


传递JSON数据
JSON是什么
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,也易于机器解析和生成。其就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此 JSON本质是字符串,主要负责在不同的语言中数据传递和交互
我们来看一段JSON数据:
{"name": "zhangsan","age": 18,"isStudent": true,"courses": ["Math", "English", "History"]
}
也可以压缩表示:
{"name":"zhangsan","age":18,"isStudent":true,"courses":["Math","English","History"]}
与上面描述的数据是一样的,只是上面的进行了格式化,更易读
JSON的语法:
数据在 键值对(key/value)中
数据由逗号, 分割
对象用{}表示
数组用[]表示
值可以为对象,也可以为数组,数组中可以包含多个对象
JSON中的两种结构:
对象:{} 保存的对象是一个 无序的键值对集合,一个对象以 { 开始,} 结束,每个键(key)后面跟一个 : ,键值对使用 , 分割
数组:[]保存的数组是值(value)的有序集合,一个数组以 [ 开始,] 结束,值之间使用 , 分割
在使用JSON时,我们可以使用在线JSON格式化工具进行校验和书写
JSON 字符串和Java对象互转
JSON 本质上是一个字符串,通过文本来存储和描述数据
Spring MVC 框架也集成了 JSON 的转换工具,我们可以直接使用,来完成 JSON 字符串和 Java对象的互转
本质是是 jackson-databind 提供的功能,Spring MVC 框架中已经将该工具包引进了,直接使用即可,若脱离 Spring MVC 使用,需要引入相关依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.5</version>
</dependency>
JSON的转换工具包有很多,也可以使用其他的
@SpringBootTest
class JSONUtilsTest {@Autowiredprivate ObjectMapper objectMapper;@Testpublic void jsonTest() throws JsonProcessingException {Student student = new Student();student.setId(1);student.setName("zhangsan");student.setAge(13);student.setSex("男");// 将对象转换为 JSON 字符串String jsonStr = objectMapper.writeValueAsString(student);System.out.println("JSON字符串为:" + jsonStr);// 将JSON字符串转换为对象Student student1 = objectMapper.readValue(jsonStr, Student.class);System.out.println("转换的对象:" + student1);}
}
使用 ObjectMapper 对象提供的两个方法,可以完成 对象 和 JSON 字符串的互换
**writeValueAsString:**将对象转换为JSON字符串
**readValue:**将字符串转换为对象
运行结果:

JSON的优点
1. 易于理解和阅读: JSON采用了人类可读的文本格式,基本上可以直接阅读和理解,这使得开发人员和数据工程师可以轻松地查看数据内容。
2. 轻量和高效: JSON数据以文本形式存储,相比于其他二进制格式如XML,它的数据量通常更小,传输和解析速度更快,特别是在网络传输和移动设备上更为高效。
3. 跨平台和语言无关: JSON在多种编程语言中都有支持和解析库,因此可以在不同的平台和系统中使用和传输数据,无需担心兼容性问题。
4. 易于解析和生成: JSON数据格式简单明了,解析起来也比较容易。几乎所有现代编程语言都有JSON解析器和生成器,可以方便地将JSON数据转换成各种数据结构或者将数据结构转换成JSON格式
**5. 安全性较高:**JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性
因此,JSON在web应用程序中被广泛使用(前后端数据交互、API接口数据传输等等)
传递JSON对象
接收JSON对象,需要使用 @RequestBody 注解
@RequestBody:RequestBody,即请求正文,表示这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中,@RequestBody 注解的作用是将HTTP请求体中的数据转换为Java对象,并作为方法的参数传入
@RequestMapping("/getStudent")public String getStudent(@RequestBody Student student) {return "接收到参数student: " + student;}
使用postman发送JSON请求参数:

后端成功接收
获取URL中的参数
在获取URL中的参数时,我们需要使用 @PathVariable 注解
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login/{id}/{name}")public String login(@PathVariable Integer id, @PathVariable String name) {return "接收到id: " + id + " 接收到name: " + name;}
}
使用postman测试:

后端正确获取到URL中的参数
当方法的参数名称和需要绑定的URL中的变量名称一致时,可以不用给 @PathVariable 的属性赋值
而当方法的参数名称和需要绑定的URL中的变量名称不一致时,需要对 @PathVariable的属性value赋值
@RequestMapping("/login/{id}/{name}")public String login(@PathVariable Integer id, @PathVariable("name") String userName) {return "接收到id: " + id + " 接收到name: " + userName;}

文件上传
在传输文件时,我们需要使用 @RequestPart
@RequestMapping("/test")
@RestController
public class TestController {@RequestMapping("getFile")public String getFile(@RequestPart("file")MultipartFile multipartFile) throws IOException {// 获取文件名String fileName = multipartFile.getOriginalFilename();// 将文件上传到指定路径multipartFile.transferTo(new File("D:/" + multipartFile.getOriginalFilename()));return "接收到文件:" + fileName;}
}
使用postman发送请求:

同时查看文件是否上传成功:

相关文章:
SpringMVC 请求参数接收
目录 请求 传递单个参数 基本类型参数传递 未传递参数 ?传递参数类型不匹配 传递多个参数 传递对象 后端参数重命名 传递数组 传递集合 传递JSON数据 JSON是什么 JSON的优点 传递JSON对象 获取URL中的参数 文件上传 在浏览器与程序进行交互时,主要…...
[高等数学]换元积分法
一、知识点 (一) 第一类换元法 定理1 设 f ( u ) f(u) f(u) 具有原函数, u φ ( x ) u\varphi(x) uφ(x) 可导,则有换元公式: ∫ f [ φ ( x ) ] φ ′ ( x ) d x [ ∫ f ( u ) d u ] u φ ( x ) . \int f[\varphi(x)]\varphi (x)dx[\int f(u)du]…...
Redis简介、常用命令及优化
文章目录 一、关系数据库??与非关系型数据库概述 1. 关系型数据库2. 非关系型数据库3.关系数据库与非关系型数据库区别 二、Redis简介 1.Redis的单线程模式2.Redis 优点3.Redis 缺点 三、安装redis四、Redis 命令工具五、Redis 数据库常用命令六、Redis 多数据库常用命令七、…...
大模型训练为什么依赖GPU
近年来,随着人工智能技术的飞速发展,特别是深度学习领域的进步,大模型的训练逐渐成为研究和工业界的热点。作为大模型训练中的核心硬件,GPU(图形处理单元)扮演了至关重要的角色。那么,为什么大模…...
帕金森病与三叉神经痛的基因关联分析
帕金森病(Parkinsons Disease, PD)和三叉神经痛(Trigeminal Neuralgia, TN)是两种不同的神经系统疾病,前者主要影响运动功能,而后者则表现为剧烈的面部疼痛。尽管这两种疾病在临床表现上有显著差异…...
【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决
问题描述 我们将Debug版本的安装包发送到手机上安装,会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码: android.injected.testOnlyfalse 最后点击“Sync now”,等待重新加载gradle资源即可 后面我们重新编译Debug安装…...
栈与队列(C语言版)
文章目录 栈与队列1. 栈基本操作实现(基于链表)代码运行结果 应用场景 2. 队列基本操作实现代码运行结果 应用场景 栈与队列 1. 栈 栈是一种操作受限的线性结构。操作受限体现在,栈只能在一端添加和删除元素,符合后进先出 ( LIFO ) 的特性,…...
stl里的deque 中控map 假如用完了,该如何处理
在 C 的标准模板库(STL)中,std::deque(双端队列)使用一种分段连续的存储结构,通过一个中控器(通常称为中控 map)来管理多个固定大小的存储块(缓冲区)。当这个…...
Git GUI设置中文的方法及使用
链接: Git Bash和Git GUI设置中文的方法 链接: Git 基本操作...
代码书写常用快捷建
唤出剪切板 Windows 系统 :Win V Mac 系统: 在 Mac 电脑上,可以点击桌面菜单栏中的 “编辑”,在下拉菜单中选择 “显示剪贴板” 来打开剪贴板。 跳转和撤回跳转 在vscode软件中可以通过ctrl+鼠标左键可以进行跳转…...
MySQL 索引失效处理:原因分析与优化实战
MySQL 索引失效处理:原因分析与优化实战 MySQL 索引失效处理:原因分析与优化实战引言一、什么是索引失效?二、索引失效的常见原因2.1 查询条件中使用函数或表达式示例:原因: 2.2 数据类型不匹配示例:原因&a…...
基于Python的AI代码审计工具实现方案,结合DeepSeek API和商业化设计
以下是一个基于Python的AI代码审计工具实现方案,结合DeepSeek API和商业化设计,分为基础功能版和进阶扩展方向: 基础版实现代码 (命令行工具) import os import requests from dotenv import load_dotenv import hashlib import json from t…...
用Python实现线性回归:从数学原理到代码实战
一、前言:为什么线性回归是AI必修课? 作为机器学习领域的"Hello World",线性回归算法具有三大核心价值: 1️⃣ 理解监督学习的底层逻辑(特征工程→模型训练→预测输出) 2️⃣ 掌握梯度下降等优化…...
系统可观测性(1)基础概念
系统可观测性(1)基础概念(Log/Tracing/Metrics) Author: Once Day Date: 2025年2月8日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 十年代码训练…...
Redis未授权访问漏洞导致getshell
一、漏洞信息 redis默认情况下会绑定在本地6379端口,如果没有进行采用相关的策略,就会将redis服务暴露到公网上,如果再没有设置密码认证(一般为空)的情况下,会导致任意用户可以访问到目标服务器的情况下未授权访问redis以及读取r…...
Electron 全面解析:跨平台桌面应用开发指南
引言 在当今多平台并存的数字时代,如何高效开发跨平台桌面应用成为开发者面临的重要挑战。Electron作为GitHub开源的跨平台框架,凭借其独特的Web技术融合能力,已成为构建桌面应用的热门选择。本文将深入探讨Electron的核心原理、开发实践及未…...
React进阶之React核心源码解析(一)
React核心源码解析 react 特点CPU卡顿IO 卡顿 新老 react 架构对比v15v16.8Scheduler 调度器Reconciler 协调器 React fiber原理更新dommount 构建过程 render阶段 — scheduler reconcilerreact源码解析react-domreact-dom/src/client/ReactDOMRoot.js react-reconcilerreact-…...
用大模型学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理
要深入浅出地理解条件概率与贝叶斯定理,可以从以下几个方面入手,结合理论知识和实例进行学习: 贝叶斯定理与智能世界的暗语 条件概率,全概率公式与贝叶斯公式的推导,理解和应用 拉普拉斯平滑 贝叶斯解决垃圾邮件分类 …...
C++ Primer 参数传递
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
Jupyter lab 无法导出格式 Save and Export Notebook As无法展开
本来尝试jypyter lab如何导出HTML带有侧边导航栏,一顿操作后发现还是没实现。 又突然发现导出其他格式地功能不能用了,浏览器里Save and Export Notebook As展开按钮为灰色打不开。 经典想实现的没实现还把原先的搞坏了。 看了jupyter lab的运行信息发…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...
