SpringMVC(2)传入请求参数
文章目录
- SpringMVC(2)传入请求参数
-
- 前言:解释为什么要传递参数
- [注意(接收参数,使用 POST):](#注意(接收参数,使用 POST):)
- [1. 传递一个参数](#1. 传递一个参数)
-
- [传递参数名 与 变量名,要相同](#传递参数名 与 变量名,要相同)
- [2. 传递两个参数](#2. 传递两个参数)
- [3. 传递 Integer 类型](#3. 传递 Integer 类型)
-
- [传递 包装类型(Integer) 和 基本类型(int)的区别:](#传递 包装类型(Integer) 和 基本类型(int)的区别:)
- 疑问:同一个资源路径,方法能否是进行重载?
- [4. 传递一个对象(本质是传递多个参数)](#4. 传递一个对象(本质是传递多个参数))
-
- [将 Integer 改成 int(处于类的成员变量)](#将 Integer 改成 int(处于类的成员变量))
- [5. 后端参数重命名(后端参数映射)@RequestParam()注解](#5. 后端参数重命名(后端参数映射)@RequestParam()注解)
-
- @RequestParam()注解
- [使用 @RequestParam(),取消必填限制](#使用 @RequestParam(),取消必填限制)
- [6. 传递一维数组](#6. 传递一维数组)
- [7. 传递集合(List为例)](#7. 传递集合(List为例))
- [8. 完整代码](#8. 完整代码)
- [9. 总结](#9. 总结)
这里使用 postman 来作为前端的示例。
使用 postman 发送请求和 客户端发送请求,对于后端而言,都是一样的
就像 外卖和堂食,对于厨师而言,是一样的
所以,我们使用 postman 和使用浏览器,对于后端来说,都是一样的。
由于没有学响应,不知道返回的是什么,以下的讲述,返回值都统一为 String
前言:解释为什么要传递参数
一个后端程序,是为了客户端而服务的,客户端发送请求过来,也就是传递了一个参数过来。
我们服务器端,必须要根据请求,计算响应,并返回数据
就像我们在京东商城,我们搜索:"手机" ,这个关键词,我们就是向京东商城的服务器发送了一个请求,也就是传递了一个参数,数据
京东商城的服务器就会根据你传入的参数,到数据库里面,检索数据,计算响应,最后返回响应。
响应就是你看到的搜索结果,给你展示了一堆的手机信息。
下面,我们就看看,通过 客户端(postman为例)传递参数(数据),服务器端(也就是我们的代码)来接收参数
注意(接收参数,使用 POST):
特别注意:传递参数,Postman上使用的请求方式是 POST
使用 GET 的请求方式,接收不了参数。
1. 传递一个参数


传递参数名 与 变量名,要相同
注意:这里postman传递的参数,必须是和源代码相同的变量名字,否则会传递失败
源代码:keyword
postman:keyword

图中 postman 使用的是 key作为变量名,与源代码中的 keyword 变量名不同。
参数传递失败。
2. 传递两个参数
假如是一个登录注册功能,用书输入了两个参数:账号和密码
代码:

运行结果:

注意:传递的参数名,必须要和变量名相同,否则赋值不成功,会为 null
注意:String 会有默认值,而 基础数据类型不初始化,没有默认值(后面讲解)
postman的两种传参模式
第一种传参模式,你可以看到,路径会有敏感信息,我们想要屏蔽它,用另一种传参模式

第二种传参模式:

再次传入参数:

切换传参模式之前,需关闭另一个
切换传参模式之前,需要提前关闭之前的传参模式,不然会有干扰。
Params关闭:

Body关闭:

3. 传递 Integer 类型
传递一个 Integer 类型:


传递 包装类型(Integer) 和 基本类型(int)的区别:
一个传递 Integer 类型,一个传递 int类型:

这两个方法,传递正常的整数,都能够接收。
但是,如果不传入参数的话,
Integer这边不会报错:

传递 int 类型的那边会报错:

错误原因:int类型 ,不初始化之前,是没有默认值的。
Integer ,不初始化之前,默认值为:null。
这里就是因为默认值的问题出错的,当你不传入参数的时候,系统会尝试将传入的值,传递一个 null,但是 int 类型,是没有 null 这样的默认值的,所以就报错了。
总结
使用 int类型作为 传递参数的类型的时候,传递参数,必须要填写值,不能够不填。
使用 Integer 这种包装类型,作为 传递参数的类型的时候,可以不填写值,会使用默认值 null,进行传递。
疑问:同一个资源路径,方法能否是进行重载?
能否重载?如同这样:

运行程序:

答案
答案:不可以。
总结
资源路径 + 请求方式 要 唯一!!!
如:资源路径为 /request/r1
/request/r1 + @GetMapping(Get请求)是可以的。
/request/r1 + @PostMapping(Post请求)是可以的。
以上,虽然资源路径相同,但是请求方式不同 ,资源路径 + 请求方式 是唯一的!!!
可以根据请求方式调用不同的方法。
但是:
/request/r1 + @RequestMapping
/request/r1 + @RequestMapping
以上是不可以 的,因为 @RequestMapping 包含了所有的请求方式,导致了资源路径 + 请求方式 不唯一!!!
4. 传递一个对象(本质是传递多个参数)
首先,先创建一个对象 User:

传递对象:

传入的参数,必须要和对象有的属性相一致。

不传入任何参数的话,由于对象的属性都是使用 包装类型和引用类型修饰的,所有会有默认值 null。

将 Integer 改成 int(处于类的成员变量)

将 Integer 改成 int,修饰成员变量的类型,此时还要不要必须传值?
答:不需要传值了,因为 是 成员变量,会有默认值,为 0 。

传递的参数名字要和类中的成员变量是相同的:

5. 后端参数重命名(后端参数映射)@RequestParam()注解
这里涉及的注解:@RequestParam()
什么情况下会需要这个注解?
答:前端加密 url,后端需要对应前端的加密字符,但是,后端的代码是有规范的,不能随便定义变量名,所以,要用 @RequestParam 这个注解,对应前端的加密字符,同时,后端的参数不用变。
@RequestParam()注解
例如下面:从前端接收参数 q,赋值给 keyword

@RequestParam("q") : 前端的加密字符
String keyword:后端接收数据的变量
使用 postman 发送请求的时候,发送的参数名字,要和 @RequestParam("q") 这个注解中的 字符一样,也就是 q;
其实,使用 @RequestParam()这个注解,也叫做参数绑定
就是把 q 这个字符,绑定给 keyword 这个变量 。

如果是不相同的,会报错:

如果不传参数,也会报错:

所以,一旦加上 @RequestParam()这个注解,表示这个变量是一个必填项了。
那么,有没有什么方式,能取消这个 必填 的限制吗?
使用 @RequestParam(),取消必填限制


6. 传递一维数组
注意:这里数组的类型,必须是 String[ ]。
原因:请求参数都是字符串形式传递的(无论是 URL 中的查询参数,还是请求体中的表单参数)。
比如,你通过 URL 传递数组参数:http://localhost:8080/r7?arr=1&arr=2&arr=3,这里的 arr=1、arr=2、arr=3 本质上都是字符串
代码:

运行结果:
第一种:多次传递单个元素,自动组装成数组

第二种:一次传递多个元素,使用 ' , '进行分割

7. 传递集合(List为例)
代码:

发送请求:

解决报错问题:
上述请求操作,其实是传递数组的方式,
解决办法:
使用 @RequestParam()这个注解,绑定参数。
java
@RequestParam List<Integer> list
客户端传递多个相同类型数据(多个 String类型 的数据),客户端(前端)会将这些数据,整理成一个数组,返回给服务器(后端)的。
@RequestParam ,这个注解,就是把 数组,绑定给 集合list 了
代码:

这两个代码是一样的效果。
为什么需要加 @RequestParam 注解
@RequestParam 注解主要用于将请求参数绑定到方法的参数上。
原因:
@RequestParam注解明确告诉 Spring MVC,这个方法参数的值是来自 HTTP 请求的参数- 对于集合类型的参数,Spring MVC 需要知道如何将请求中的多个同名参数(比如
list=1&list=2&list=3)收集到一个集合中。@RequestParam注解可以触发 Spring MVC 的参数解析逻辑 ,将多个同名的请求参数值封装到对应的集合(如List)中。 - 对于简单类型的参数(如
String、int等),Spring MVC 有时可以通过参数名自动匹配请求参数(基于 Java 的反射机制,方法参数名和请求参数名一致时),但这种自动匹配对于集合类型并不稳定,尤其是在存在编译期参数名丢失(比如没有开启-parameters编译选项)的情况下,必须通过@RequestParam显式指定参数的来源和绑定规则。
也就是说:从前端输入多个同名参数,需要收集到一个集合当中,否则,Spring MVC 可能无法自动进行这种 "多值到集合" 的转换。
数组 :可以直接收集,因为从HTTP请求中的 Query String,本质上都是字符串。
集合 :集合是可以存放多种类型的数据 的,但是,Spring MVC无法自动匹配 Query String 中数据的类型 ,需要通过 @RequestParam 显式指定参数的来源和绑定规则
运行结果:

总结
学到目前为止,只要传递 集合 的时候,就需要在集合前加上一个 @RequestParam() 注解。
8. 完整代码
java
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* Description:
* Date: 2025-10-10
* Time: 下午6:50
*/
@RequestMapping("request")
@RestController
public class RequestController {
// 客户端传递一个参数,服务器接收一个参数(字符串)
@RequestMapping("/r1")
public String r1(String keyword) {
return "接收参数:" + keyword;
}
// 客户端传递两个参数,服务器接收两个参数
@RequestMapping("/r2")
public String r2(String username,String password) {
System.out.println("用户名" + username);
System.out.println("密码:" + password);
return "用户名:" + username + "密码:" + password;
}
// 客户端传递 Integer 参数
@PostMapping("/r3")
public String r3(Integer number) {
return "接收参数:" + number;
}
// 客户端传递 int类型 的变量
@PostMapping("/r4")
public String r4(int number) {
return "接收参数:" + number;
}
// 客户端传递一个 对象(多个变量)
@RequestMapping("/r5")
public String r5(User user) {
return "接收一个 user对象:" + user.toString();
}
// @RequestMapping("r6")
//// 前端传递 q 给后端,后端使用不同名字的参数接收(@RequestParam)
//// 使用 @RequestParam 之后,这个参数,是必传参数(一定要传参数),不然会报错
// public String r6(@RequestParam("q") String keyword) {
// return "接收参数:" + keyword;
// // q 是前端的参数,后端不用(输入的时候,参数是 q)
// // 后端使用 keyword 来接收前端的参数 q 的值,后续使用 keyword 作为变量,进行操作
// }
@RequestMapping("r6")
// 手动设置,取消必传限制
public String r6(@RequestParam(value = "q",required = false) String keyword) {
return "接收参数:" + keyword;
// q 是前端的参数,后端不用(输入的时候,参数是 q)
// 后端使用 keyword 来接收前端的参数 q 的值,后续使用 keyword 作为变量,进行操作
}
// 客户端传递一个 数组
@RequestMapping("/r7")
public String r7(String[] arr) {
return "接收参数的数组 arr:" + Arrays.toString(arr);
}
@RequestMapping("/r8")
public String r8(@RequestParam List<Integer> list) {
return "接收一个集合数据:" + list;
}
}
9. 总结
学习了一个注解:
@RequestParam()
参数重命名,也叫做参数绑定 ,把前端的参数,绑定给后端的某一个参数,并赋值了。
后面不补充 fasle,那么,这个参数是一个必填参数。
如果某一个参数,是要求必须传递的,可以使用 @RequestParam() 注解来达到这个效果。
使用情景:
- 前端加密 url,后端需要对应前端的加密字符,但是,后端的代码是有规范的,不能随便定义变量名,所以,要用
@RequestParam这个注解,对应前端的加密字符,同时,后端的参数不用变。 - 传递 集合 的时候,就需要在集合前加上一个
@RequestParam()注解。
最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!
下一篇博客:SpringMVC(3)传递 json