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

Spring MVC参数绑定终极手册:单多参/对象/集合/JSON/文件上传精讲

        我们通过浏览器访问不同的路径,就是在发送不同的请求,在发送请求时,可能会带一些参数,本文将介绍了Spring MVC中处理不同请求参数的多种方式

一、传递单个参数

        接收单个参数,在Spring MVC中直接用方法中的参数就可以,如以下代码:

@RequestMapping("Param")
@RestController
public class ParamController {@RequestMapping("a1")public String tex1(String string){return "接收到参数:"+string;}
}

        我们使用Postman传参后,浏览器访问 127.0.0.1:8080/Param/a1?string=Spring

        Spring MVC会根据方法,找到对应的参数,赋值给方法,参数不一致,是获取不到参数,即为null(包装类型)

 注意

        使用基本类型来接收参数时,参数必须传(除boolean类型),否则报500错误;类型不匹配,会报400错误(此处400/500等都是状态码,其他篇章会涉及讲解)

1.1、正常传递参数

@RequestMapping("a2")public Object text2(int a){return "接收到参数a:"+a;}

        通过Fiddler观察请求和响应, HTTP响应状态码为200(正常)

1.2、不传a参数 

         通过Fiddler观察请求和响应, HTTP响应状态码为500(服务器异常)

        尝试观察程序的错误日志,并解决:

        可选的整型参数“a”存在,但由于被声明为基本类型,所以无法转换为 null 值。建议将其声明为对应基本类型的对象包装器。 

1.3、传递参数类型不匹配

 对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null。所以开发中,对于参数可能为空的数据,建议使用包装类型

二、传递多个参数

        和传输一个参数一样,直接使用方法的参数接收即可

@RestController
public class ParamController {@RequestMapping("Param")public String Demo1(String name,String age){return "接收到参数name: "+name+" ,age: "+age;}
}

        使用浏览器发送请求并传参:127.0.0.1:8080/Param?name=小奥奇&age=8

         可以发现,后端程序是正确拿到 name 和 age 参数的值

        当有多个参数时,前后端是以参数的名称进行参数匹配的,但是参数的位置是不影响后端获取参数的结果 

三、传递对象

        如果需要传递的参数较多时,使用方法传参就要有很多形参,并且后续每增加一个参数,也要修改方法的声明,比较麻烦~,在此情况下我们便可以把这些参数封装成一个对象

        Spring MVC 也可以自动实现对象参数的赋值,我们先创建一个 Cat 对象

public class Cat {private String name;private int age;private String hobby;public String getName() {return name;}public int getAge() {return age;}public String getHobby() {return hobby;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public void setHobby(String hobby) {this.hobby = hobby;}@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +", hobby='" + hobby + '\'' +'}';}
}

        实现传递对象的方法

  @RequestMapping("Cat")public Object Cat(Cat cat){return cat.toString();}

         使用浏览器发送请求并传参:127.0.0.1:8080/Cat?name=咪咪&age=1&hobby=喜欢吃小鱼干

        正好对应我们 Cat 类中的三个成员变量,此过程中 Spring 会根据参数名称自动绑定到对象的各个属性上,如果属性未传递,则会赋值位null(基本类型会被赋值为默认初始值,比如 int 赋值 0)

四、后端参数重命名(后端参数映射)

        在一些情况下,前端传递的参数 key 和我们后端接受的 key 可以不一致,比如前端想加密URL中的信息,会使用 p 传递给后端,后端是使用 password 字段来接收的(保证可读性,不然后续维护时,不知道 p 到底是什么),如果出现这种情况,我们可以使用 @RequestParam 来重命名前后端的参数值

 @RequestMapping("A1")public String A1(@RequestParam("p") String password){return "接收参数: password:"+password;}

         该注解表示从前端接收到 p 赋值给 password 

 

        那如果我们直接传递给后端的参数 password 呢?

2025-05-30T22:37:36.378+08:00  WARN 27268 --- [SpringDemo1] [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'p' for method parameter type String is not present]

控制台打印日志显示:请求参数 p 不存在

        那既然是 String 引用类型,我们尝试不传参数试试,会不会得到 null ~~

         我们发现,当不传参数时,直接报客户端错误了,因为当我们使用该注解时,这个参数就变成必传参数了,我们点进该注解的源码中:

         表示:若请求缺失此参数,会抛出 MissingServletRequestParameterException,返回 ​​HTTP 400(Bad Request)​​ 错误,我们可以通过设置该 required 使该参数为非必传参数

@RequestMapping("A1")public String A1(@RequestParam(value = "p",required = false) String password){return "接收参数: password:"+password;}

        将 required 设置为 false ,再次空传参数得到:

结论

        使用 @RequestParam 进行参数重命名时,请求参数只能和 @RequestParam 声明的名称一致,才能进行参数绑定和赋值

        使用 @RequestParam 进行参数重命名时, 参数就变成了必传参数

五、传递数组 

@RequestMapping("A2")public String A2(String[] arr){return "接收参数:arr:"+ Arrays.toString(arr);}

        和传递引用类型一样,直接把数组当成参数,那数组包含多个元素,我们该如何传递呢?

         此外,我们还可以直接使用方式二在一行中传递多个元素:

        可以看到,方式二每个元素是以逗号分隔的,但是如果我们本来就要传递一个逗号呢?

         那么逗号就会转义为%2c

六、传递集合

        集合参数:和数组类似,同一个请求中出现多个同名参数,需要使用@RequestParam绑定参数关系,Spring自动将其值收集到一个集合中

@RequestMapping("A1")public String A1(@RequestParam List<Integer> list){return "接收参数:"+list;}

七、传递JSON数据

7.1、概念

        JSON概念:JSON 全称为 ​​JavaScript Object Notation​​(JavaScript 对象表示法),是一种​​轻量级的数据交互格式​​。

        简单来说JSON就是客户端和服务端进行交互的一种数据格式有自己的格式和语法使用文本表示对一个对象或数组的信息,因此本质上是字符串,主要负责在不同的语言中数据传递和交换

7.2、JSON语法

        还可以压缩为

 {"name":"Json.CN","url":"http://www.json.cn","page":88,"isNonProfit":true,"address":{"street":"科技园路.","city":"江苏苏州","country":"中国"},"links":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"},{"name":"SoSo","url":"http://www.SoSo.com"}]}

        我们可以使用在线JSON格式化工具来进行校验和书写:https://www.bejson.com/

7.3、JSON的优点:

  1. ​简单易用​​:语法简单,易于理解和编写,可以快速进行数据交换。
  2. ​跨平台支持​​:JSON可以被多种编程语言解析和生成,可以在不同的平台和语言之间进行数据交换和传输。
  3. ​轻量级​​:相较于XML格式,JSON数据格式更加轻量级,传输数据时占用带宽较小,可以提高数据传输速度。
  4. ​易于扩展​​:JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用。
  5. ​安全性​​:JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性。

7.4、JSON字符串和Java对象互转

        Spring MVC框架集成了JSON的转换工具,我们可以直接使用来完成两者的互转

        本质上是 jackson-databind 提供的功能,SpringMVC框架中已经把该工具包引入了进来,咱们直接使用即可,如果脱离SpringMVC使用,需要引入相关依赖

        使用 ObjectMapper 对象提供的两个方法,可以完成对象和JSON字符串的互转         writeValueAsString: 把对象转为JSON字符串 readValue: 把字符串转为对象

public class JSONText {@Testpublic void JsontoJava() throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();//定义一个JSON字符串String s="{\"name\":\"咪咪\",\"age\":1,\"color\":\"blue\"}";//转对象Animals cat=mapper.readValue(s,Animals.class);System.out.println(cat.toString());}@Testpublic void JavatoJson() throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();//创建Java对象Animals cat = new Animals();cat.setName("cat");cat.setAge(1);cat.setColor("blue");//转换为JSONString str = mapper.writeValueAsString(cat);System.out.println(str);}
}

7.5、传递JSON对象 

        接收JSON对象,需要使用@RequestBody注解

RequestBody​​:请求正文,意思是这个注解作用在请求正文的数据绑定,​​请求参数必须写在请求正文中​​。

@RequestMapping("A3")public String A3(@RequestBody Animals animals){return animals.toString();}

        我们再postman中传入的是JSON格式的字符串,但在后端代码中,Spring会把我们传入的JSON字符串转化成一个对象,我们就不用自己转化为Java对象了,还可以对此对象进行操作:

@RequestMapping("A3")public String A3(@RequestBody Animals animals){System.out.println(animals.getColor());animals.color="彩虹色";return animals.toString();}

八、获取URL中参数@PathVariable

        这个注解主要作用在请求URL路径上的数据绑定(默认传递参数写在URL上,Spring MVC 就可以获取到)

@RequestMapping("A4/{id}")public String A4(@PathVariable Integer id){return "获取id: "+id;}

         我们还可以传递两个参数:

@RequestMapping("A4/{id}/{age}")public String A4(@PathVariable Integer id,@PathVariable Integer age) {return "获取id: "+id+",age: "+age;}

        这两个也默认为必传参数,如果我们只传递一个参数,会发生客户端错误,那么我们是否可以设置为非必传参数

        答案是:理论上可以,但是我们若对改路径传一个参数,那么这个参数是id还是age???Spring也不知道,所以参数是必传的,另外我们可以重命名(此处不再演示)

九、上传文件@RequestPart

 @RequestMapping("A5")public String A5(MultipartFile file) {System.out.println(file.getOriginalFilename());return "文件获取成功";}

相关文章:

Spring MVC参数绑定终极手册:单多参/对象/集合/JSON/文件上传精讲

我们通过浏览器访问不同的路径&#xff0c;就是在发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带一些参数&#xff0c;本文将介绍了Spring MVC中处理不同请求参数的多种方式 一、传递单个参数 接收单个参数&#xff0c;在Spring MVC中直接用方法中的参数就可以&…...

Fluence推出“Pointless计划”:五种方式参与RWA算力资产新时代

2025年6月1日&#xff0c;去中心化算力平台 Fluence 正式宣布启动“Pointless 计划”——这是其《Fluence Vision 2026》战略中四项核心举措之一&#xff0c;旨在通过贡献驱动的积分体系&#xff0c;激励更广泛的社区参与&#xff0c;为用户带来现实世界资产&#xff08;RWA&am…...

innovus: ecoAddRepeater改变hier层级解决办法

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 来自星球提问: 星主&#xff0c;我在A/B/C/D/E/U0这个cell后面插入一个BUFF&#xff0c;生成的名字为A/B/C/BUFF1&#xff0c;少了D/E两个层级&#xff0c;不应该是生成A/B/C/…...

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品销售方案》: 目录…...

突破数据孤岛:StarRocks联邦查询实战指南

随着企业数据生态的复杂化&#xff0c;跨多个数据存储系统进行联合查询的需求日益增长。本文将深入解析如何利用StarRocks构建高效的数据联邦查询体系&#xff0c;实现与Apache Doris和Hive数据仓库的无缝对接。 ### 一、StarRocks联邦查询架构解析 StarRocks采用分布式架构设…...

传统业务对接AI-AI编程框架-Rasa的业务应用实战(1)--项目背景即学习初衷

我的初衷&#xff1a;我想学习AI。具体的方向是这样的&#xff1a;原本传统的平台业务去对接智能体。比如发票业务&#xff0c;发票的开具、审核、计税、回款等。根据用户在业务系统前台界面输入若干提示词 或者 语音输入简短语音信息&#xff0c;可以通过智能体给出需要处理的…...

低功耗架构突破:STM32H750 与 SD NAND (存储芯片)如何延长手环续航至 14 天

低功耗架构突破&#xff1a;STM32H750 与 SD NAND &#xff08;存储芯片&#xff09;如何延长手环续航至 14 天 卓越性能强化安全高效能效图形处理优势丰富集成特性 模拟模块实时监控保障数据完整性提升安全性与可靠性测量原理采样率相关结束语 在智能皮电手环及数据存储技术不…...

CSS选择子元素

通过选择器 为所有子元素应用样式。以下是几种常见方法&#xff1a; 1. 选择所有直接子元素&#xff08;不包括孙级&#xff09; css 复制 下载 .parent > * {/* 样式规则 */color: red; } > 选择器&#xff1a;只匹配直接子元素 * 通配符&#xff1a;匹配任意类型…...

git cherry-pick (28)

1.1 目的 本文档用于说明如何git上,通过cherry-pick命令合并某个功能。 将分支bg_device的 AHB New feature support libalgo arm64 lib 提交内容合并至 分支spfl_device 分支当中 1.2适配步骤 1.2.1 实操过程 > 分支sfpl_device的状态 rootxrootx-ThinkPad:~/workdir…...

android与Qt类比

一、概念对应关系 Android RecyclerView 组件类比描述Qt 模型 - 视图组件Qt 类比描述RecyclerView画板&#xff08;容器&#xff09;QAbstractItemView视图&#xff08;展示数据的容器&#xff0c;如列表、表格&#xff09;RecyclerView.Adapter画布&#xff08;数据桥梁&…...

AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片 支持高清CMOS Sensor输入 国产品牌

AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片 支持高清CMOS Sensor输入 国产品牌 产品概述&#xff1a; AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片&#xff0c;支持高清CMOS Sensor输入&#xff0c;经ISP处理、视频前处理以及音视频编…...

Linux(11)——基础IO(上)

目录 一、理解文件 二、回顾C文件的接口 &#x1f4c4; C语言文件操作函数表 ​编辑&#x1f4c4; 三个文件流 三、系统文件I/O 1️⃣open 2️⃣close 3️⃣write 4️⃣read 四、文件描述符 &#x1f4a1;用户操作文件的底层逻辑是什么&#xff1f; &#x1f4…...

ABP-Book Store Application中文讲解 - Part 9: Authors: User Interface

ABP-Book Store Application中文讲解 - Part 9: Authors: User Interface TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 8: Authors: Application Layer-CSDN博客 项目之间的引用关系。 ​​ 目…...

鸿蒙开发修改版本几个步骤

鸿蒙开发修改版本几个步骤 比如&#xff1a;5.0.4&#xff08;16&#xff09;版本改为5.0.2&#xff08;14&#xff09;版本 一、项目下的build-profile.json5 "products": [{"name": "default","signingConfig": "default&qu…...

Hive自定义函数案例(UDF、UDAF、UDTF)

目录 前提条件 背景 概念及适用场景 UDF&#xff08;User-Defined Function&#xff09; 概念 适用场景 UDAF&#xff08;User-Defined Aggregate Function&#xff09; 概念 适用场景 UDTF&#xff08;User-Defined Table-Generating Function&#xff09; 概念 适…...

【学习笔记】Circuit Tracing: Revealing Computational Graphs in Language Models

Circuit Tracing: Revealing Computational Graphs in Language Models 替代模型(Replacement Model)&#xff1a;用更多的可解释的特征来替代transformer模型的神经元。 归因图(Attribution Graph)&#xff1a;展示特征之间的相互影响&#xff0c;能够追踪模型生成输出时所采用…...

3D视觉重构工业智造:解码迁移科技如何用“硬核之眼“重塑生产节拍

一、工业视觉的进化论&#xff1a;从CCD到3D相机的范式革命 在汽车冲压车间里&#xff0c;传统CCD相机正面临四大检测困局&#xff1a; 平面感知局限&#xff1a;二维视觉无法捕捉曲面工件形变环境适应性差&#xff1a;反光板件导致误检率超12%动态捕捉延迟&#xff1a;传送带…...

Elasticsearch中的刷新(Refresh)和刷新间隔介绍

在 Elasticsearch 中,刷新(Refresh) 是控制索引数据何时对搜索可见的机制,而 刷新间隔(Refresh Interval) 则是配置该机制执行频率的参数。理解这两个概念对于平衡搜索实时性与写入性能至关重要。 一、刷新(Refresh)的本质 Lucene 索引结构与搜索可见性Elasticsearch …...

STM32标准库-TIM定时器

文章目录 一、TIM定时器1.1定时器1.2定时器类型1.1.1 高级定时器1.1.2通用定时器1.1.3基本定时器 二、定时中断基本结构预分频器时器计时器时序计数器无预装时序计数器有预装时序RCC时钟树 三、定时器定时中断3.1 接线图3.2代码3.3效果&#xff1a; 四、定时器外部中断4.1接线图…...

【算法训练营Day05】哈希表part1

文章目录 哈希表理论基础有效的字母异位词两个数组的交集快乐数两数之和 哈希表理论基础 几个值得关注的知识点&#xff1a; hash表用于快速的判断元素是否存在&#xff08;空间换时间&#xff09;其原理就是将数据通过散列函数映射到bucket中&#xff0c;如果发生hash碰撞&a…...

CMap应用场景和例子

CMap 详解 CMap 是 MFC (Microsoft Foundation Classes) 库中的一个模板类&#xff0c;用于实现键值对的映射关系&#xff08;类似哈希表或字典&#xff09;。它提供了高效的数据存储和检索功能&#xff0c;适用于需要通过键快速查找值的场景。 基本模板参数 cpp 运行 tem…...

Kafka 如何保证顺序消费

在消息队列的应用场景中&#xff0c;保证消息的顺序消费对于一些业务至关重要&#xff0c;例如金融交易中的订单处理、电商系统的库存变更等。Kafka 作为高性能的分布式消息队列系统&#xff0c;通过巧妙的设计和配置&#xff0c;能够实现消息的顺序消费。接下来&#xff0c;我…...

【算法题】算法一本通

每周更新至完结&#xff0c;建议关注收藏点赞。 目录 待整理文章已整理的文章方法论思想总结模版工具总结排序 数组与哈希表栈双指针&#xff08;滑动窗口、二分查找、链表&#xff09;树前缀树堆 优先队列&#xff08;区间/间隔问题、贪心 &#xff09;回溯图一维DP位操作数学…...

Modbus转Ethernet IP赋能挤出吹塑机智能监控

在现代工业自动化领域&#xff0c;小疆智控Modbus转Ethernet IP网关GW-EIP-001与挤出吹塑机的应用越来越广泛。这篇文章将为您详细解读这两者的结合是如何提高生产效率&#xff0c;降低维护成本的。首先了解什么是Modbus和Ethernet IP。Modbus是一种串行通信协议&#xff0c;它…...

C++中如何遍历map?

文章目录 1. 使用范围for循环&#xff08;C11及以上&#xff09;2. 使用迭代器3. 使用反向迭代器注意事项 在C中&#xff0c; std::map 是一种关联容器&#xff0c;它存储的是键值对&#xff08;key-value pairs&#xff09;&#xff0c;并且按键的顺序进行排序。遍历 std::m…...

什么是终端安全管理系统(终端安全管理软件2024科普)

在当今数字化迅速发展的时代&#xff0c;企业面临着越来越多的信息安全威胁。为了应对这些挑战&#xff0c;保障公司数据的安全性和完整性&#xff0c;终端安全管理系统&#xff08;Endpoint Security Management System&#xff09;应运而生。 本文将为您深入浅出地科普2024年…...

书籍转圈打印矩阵(8)0604

题目 给定一个整型矩阵matrix&#xff0c;请按照转圈的方式打印它。 例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为&#xff1a;1&#xff0c;2&#xff0c;3&#xff…...

【JVM】Java类加载机制

【JVM】Java类加载机制 什么是类加载&#xff1f; 在 Java 的世界里&#xff0c;每一个类或接口在经过编译后&#xff0c;都会生成对应的 .class 字节码文件。 所谓类加载机制&#xff0c;就是 JVM 将这些 .class 文件中的二进制数据加载到内存中&#xff0c;并对其进行校验…...

Elasticsearch中的自定义分析器(Custom Analyzer)介绍

在 Elasticsearch 中,自定义分析器(Custom Analyzer) 是一种可配置的文本处理组件,允许用户通过组合分词器(Tokenizer)、过滤器(Token Filter)和字符过滤器(Character Filter)来定义特定的文本分析逻辑。这使得 Elasticsearch 能够针对不同语言、业务场景或特殊需求,…...

《C++初阶之入门基础》【C++的前世今生】

【C的前世今生】目录 前言&#xff1a;---------------起源---------------一、历史背景二、横空出世---------------发展---------------三、标准立世C98&#xff1a;首个国际标准版本C03&#xff1a;小修订版本 四、现代进化C11&#xff1a;现代C的开端C14&#xff1a;对C11的…...