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

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中的参数 文件上传 在浏览器与程序进行交互时&#xff0c;主要…...

[高等数学]换元积分法

一、知识点 (一) 第一类换元法 定理1 设 f ( u ) f(u) f(u) 具有原函数&#xff0c; u φ ( x ) u\varphi(x) uφ(x) 可导&#xff0c;则有换元公式: ∫ 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

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;特别是深度学习领域的进步&#xff0c;大模型的训练逐渐成为研究和工业界的热点。作为大模型训练中的核心硬件&#xff0c;GPU&#xff08;图形处理单元&#xff09;扮演了至关重要的角色。那么&#xff0c;为什么大模…...

帕金森病与三叉神经痛的基因关联分析

帕金森病&#xff08;Parkinsons Disease, PD&#xff09;和三叉神经痛&#xff08;Trigeminal Neuralgia, TN&#xff09;是两种不同的神经系统疾病&#xff0c;前者主要影响运动功能&#xff0c;而后者则表现为剧烈的面部疼痛。尽管这两种疾病在临床表现上有显著差异&#xf…...

【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决

问题描述 我们将Debug版本的安装包发送到手机上安装&#xff0c;会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码&#xff1a; android.injected.testOnlyfalse 最后点击“Sync now”&#xff0c;等待重新加载gradle资源即可 后面我们重新编译Debug安装…...

栈与队列(C语言版)

文章目录 栈与队列1. 栈基本操作实现(基于链表)代码运行结果 应用场景 2. 队列基本操作实现代码运行结果 应用场景 栈与队列 1. 栈 栈是一种操作受限的线性结构。操作受限体现在&#xff0c;栈只能在一端添加和删除元素&#xff0c;符合后进先出 ( LIFO ) 的特性&#xff0c;…...

stl里的deque 中控map 假如用完了,该如何处理

在 C 的标准模板库&#xff08;STL&#xff09;中&#xff0c;std::deque&#xff08;双端队列&#xff09;使用一种分段连续的存储结构&#xff0c;通过一个中控器&#xff08;通常称为中控 map&#xff09;来管理多个固定大小的存储块&#xff08;缓冲区&#xff09;。当这个…...

Git GUI设置中文的方法及使用

链接: Git Bash和Git GUI设置中文的方法 链接: Git 基本操作...

代码书写常用快捷建

唤出剪切板 Windows 系统 &#xff1a;Win V Mac 系统&#xff1a; 在 Mac 电脑上&#xff0c;可以点击桌面菜单栏中的 “编辑”&#xff0c;在下拉菜单中选择 “显示剪贴板” 来打开剪贴板。 跳转和撤回跳转 在vscode软件中可以通过ctrl&#xff0b;鼠标左键可以进行跳转…...

MySQL 索引失效处理:原因分析与优化实战

MySQL 索引失效处理&#xff1a;原因分析与优化实战 MySQL 索引失效处理&#xff1a;原因分析与优化实战引言一、什么是索引失效&#xff1f;二、索引失效的常见原因2.1 查询条件中使用函数或表达式示例&#xff1a;原因&#xff1a; 2.2 数据类型不匹配示例&#xff1a;原因&a…...

基于Python的AI代码审计工具实现方案,结合DeepSeek API和商业化设计

以下是一个基于Python的AI代码审计工具实现方案&#xff0c;结合DeepSeek API和商业化设计&#xff0c;分为基础功能版和进阶扩展方向&#xff1a; 基础版实现代码 (命令行工具) import os import requests from dotenv import load_dotenv import hashlib import json from t…...

用Python实现线性回归:从数学原理到代码实战

一、前言&#xff1a;为什么线性回归是AI必修课&#xff1f; 作为机器学习领域的"Hello World"&#xff0c;线性回归算法具有三大核心价值&#xff1a; 1️⃣ 理解监督学习的底层逻辑&#xff08;特征工程→模型训练→预测输出&#xff09; 2️⃣ 掌握梯度下降等优化…...

系统可观测性(1)基础概念

系统可观测性(1)基础概念(Log/Tracing/Metrics) Author: Once Day Date: 2025年2月8日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 十年代码训练…...

Redis未授权访问漏洞导致getshell

一、漏洞信息 redis默认情况下会绑定在本地6379端口&#xff0c;如果没有进行采用相关的策略&#xff0c;就会将redis服务暴露到公网上&#xff0c;如果再没有设置密码认证(一般为空)的情况下&#xff0c;会导致任意用户可以访问到目标服务器的情况下未授权访问redis以及读取r…...

Electron 全面解析:跨平台桌面应用开发指南

引言 在当今多平台并存的数字时代&#xff0c;如何高效开发跨平台桌面应用成为开发者面临的重要挑战。Electron作为GitHub开源的跨平台框架&#xff0c;凭借其独特的Web技术融合能力&#xff0c;已成为构建桌面应用的热门选择。本文将深入探讨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-数学基础 概率论 条件概率 全概率公式 贝叶斯定理

要深入浅出地理解条件概率与贝叶斯定理&#xff0c;可以从以下几个方面入手&#xff0c;结合理论知识和实例进行学习&#xff1a; 贝叶斯定理与智能世界的暗语 条件概率&#xff0c;全概率公式与贝叶斯公式的推导&#xff0c;理解和应用 拉普拉斯平滑 贝叶斯解决垃圾邮件分类 …...

C++ Primer 参数传递

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

Jupyter lab 无法导出格式 Save and Export Notebook As无法展开

本来尝试jypyter lab如何导出HTML带有侧边导航栏&#xff0c;一顿操作后发现还是没实现。 又突然发现导出其他格式地功能不能用了&#xff0c;浏览器里Save and Export Notebook As展开按钮为灰色打不开。 经典想实现的没实现还把原先的搞坏了。 看了jupyter lab的运行信息发…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...