通俗易懂搞懂@RequestParam 和 @RequestBody
- 📌 博主简介: 💻 努力学习的 23 级科班生一枚 🚀
- 🏠 博主主页 : 📎 @灰阳阳
- 📚 往期回顾 :Session和Cookie我不允许你不懂
- 💬 每日一言: 「流水不争先,争的是滔滔不绝」 🌊
碎碎念
作为一名学习spring框架的小白来说,项目实战无疑是学习成长速度最快的阶段之一。但这也不免会遇到很多折磨人的知识点让人防不胜防。比如参数绑定相关注解的使用:
- @Param
- @RequestParam
- @RequestBody
用哪个?啥时候必须用?啥时候可以不用?把俺整的的一愣一愣的。
于是特意整理了这篇博客,目的是帮助大家快速理清这些注解的使用场景和区别,避开常见的坑点。
目录
- 前言
- 一、@RequestParam
- 什么时候必须用@RequestParam?
- 什么时候可以不用@RequestParam?
- 二、@ModelAttribute
- 作用
- 使用@ModelAttribute时的注意点:
- 三、@RequestBody
- 什么时候必须用@RequestBody?
- 什么时候可以不用@RequestBody?
- 四、表格整理
前言
本博客将会详细讲解以下参数绑定相关注解的使用场景,说明它们之间的关系和区别,以及在项目开发中使用的规范:
- @RequestParam
- @RequestBody
- @@ModelAttribute
一、@RequestParam
@RequestParam
专门用于获取请求URL中的参数,也就是问号?
后面的参数。(HTML的form表单也适用)
例如下面的请求:
GET /search?name=Tom&age=25
对应的Controller方法:
@GetMapping("/search")
public String search(@RequestParam String name, @RequestParam Integer age) {return "搜索名字:" + name + ",年龄:" + age;
}
什么时候必须用@RequestParam?
-
当方法参数名和请求参数名不一致时必须用:
@GetMapping("/search") public String search(@RequestParam("user_name") String name) {return name; }
-
参数非必传时(可选)必须明确标注:
@GetMapping("/search") public String search(@RequestParam(required = false) String name) {return name; }
RequestParam(required = false)的意思是如果前端没有传递参数name,不会直接报错,而是赋值null。
什么时候可以不用@RequestParam?
-
当方法参数名和请求URL参数名完全一致并且参数是必传时,可以省略:
// URL: /search?name=Tom @GetMapping("/search") public String search(String name) {return name; }
二、@ModelAttribute
作用
@ModelAttribute`注解专门用于将请求参数(URL参数或表单数据)绑定到一个Java对象中,尤其适合表单提交的场景或有多个参数需要绑定的情况。
例如请求:
GET /user?name=Tom&age=20
对应的Controller方法:
@GetMapping("/user")
public String getUser(@ModelAttribute User user) {return "姓名:" + user.getName() + ",年龄:" + user.getAge();
}
User
类定义:
public class User {private String name;private Integer age;// getter和setter方法必须提供
}
使用@ModelAttribute时的注意点:
- 对象的属性名称必须与请求中的参数名称保持一致,这样才能正确绑定。
- 如果有多个参数,并且这些参数是Java对象的,那么推荐使用这个注解(前端发送请求非JSON等格式的情况下)
三、@RequestBody
@RequestBody
用于接收HTTP请求体(Request Body)中的数据,常用于POST请求,通常是JSON格式的数据。
例如POST请求:
POST /user
Content-Type: application/json{"name": "Alice","age": 30
}
对应的Controller方法:
@PostMapping("/user")
public String createUser(@RequestBody User user) {return "用户姓名:" + user.getName() + ",年龄:" + user.getAge();
}
User
类定义:
public class User {private String name;private Integer age;// getter和setter方法
}
什么时候必须用@RequestBody?
- 前端发送JSON数据或XML数据等格式到后端时必须用。
- 当你需要整个请求体的数据绑定到一个Java对象时。
什么时候可以不用@RequestBody?
- 当数据从URL参数(如GET请求)或表单数据中获取时,不需要也不能使用@RequestBody。
- 对于表单提交,可以使用
@ModelAttribute
来代替:
@PostMapping("/submit")
public String submitForm(@ModelAttribute User user) {return user.getName();
}
四、表格整理
场景 | 传参方式 | 适用注解 | 是否必须 |
---|---|---|---|
单个或少量简单参数(如 ?name=Tom ) | URL参数或表单提交 | @RequestParam | 推荐✅ |
多个参数形成对象(如 ?name=Tom&age=20 ) | URL参数或表单提交 | @ModelAttribute | 推荐 ✅ |
JSON、XML数据 | 请求体(POST) | @RequestBody | 必须用 ✅ |
使用规范:
如果仍然觉得比较绕,最简单粗暴的方式就是全部都用上参数绑定。
因为不论参数是否一致,始终明确标注注解,可以提高代码可读性和可维护性。