🏆本文收录于《Spring Boot从入门到精通》,专门攻坚指数提升,2023 年国内最系统+最强(更新中)。
本专栏致力打造最硬核Spring Boot 系列教程,从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。
环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
前言
在现代 Web 应用程序中,接收和处理请求是必须实现的基本功能,而请求参数的获取和处理也是非常重要的一环。Spring Boot 是目前最流行的 Java 框架之一,而在 Spring Boot 中,有三种常用的参数注解,分别是 @PathVariable
、@RequestParam
和 @RequestBody
。本文将重点介绍这三种注解的使用方法,并结合实际场景进行案例分析、优缺点分析和总结。
摘要
@PathVariable
注解可以用于将 URL 中的参数绑定到方法参数上。@RequestParam
注解可以用于将请求参数绑定到方法参数上。@RequestBody
注解可以用于将请求体绑定到方法参数上。- 在使用
@PathVariable
和@RequestParam
注解时,可以指定参数名,也可以使用默认值。 - 在使用
@RequestBody
注解时,需要将请求体包装成实体类或 Map 对象。
简介
@PathVariable
注解
@PathVariable
注解用于获取 URL 中的参数。对于如下的 URL:
http://localhost:8080/user/123
其中 "user" 是路径,"123" 是路径变量。我们可以使用 @PathVariable
注解来获取 "123":
@GetMapping("/user/{id}")
public User getUserById(@PathVariable("id") Long id) {
return userService.getUserById(id);
}
@RequestParam
注解
@RequestParam
注解用于获取请求参数,其可以指定参数名和默认值。例如,对于如下的 URL:
http://localhost:8080/user?id=123
我们可以使用 @RequestParam
注解来获取请求参数 "id":
@GetMapping("/user")
public User getUserById(@RequestParam("id") Long id) {
return userService.getUserById(id);
}
如果请求参数的名称与方法参数名称一致,也可以省略 @RequestParam
注解:
@GetMapping("/user")
public User getUserById(Long id) {
return userService.getUserById(id);
}
@RequestBody
注解
@RequestBody
注解用于获取请求体中的数据。例如,对于如下的请求体:
{
"username": "admin",
"password": "123456"
}
我们可以使用 @RequestBody
注解将请求体映射为实体类:
@PostMapping("/login")
public String login(@RequestBody LoginForm form) {
if (userService.authenticate(form.getUsername(), form.getPassword())) {
return "登录成功";
} else {
return "用户名或密码错误";
}
}
源代码解析
@PathVariable
注解
@PathVariable
注解是 Spring MVC 中的一个注解,其作用是将 URL 中的参数绑定到方法参数上。
@GetMapping("/user/{id}")
public User getUserById(@PathVariable("id") Long id) {
return userService.getUserById(id);
}
在上面的代码中,@PathVariable
注解用于将 URL 中的 "id" 参数绑定到方法参数 "id" 上。其中,括号中的 "id" 表示 URL 中的参数名,而方法参数 "id" 则表示绑定后的参数名。
@RequestParam
注解
@RequestParam
注解用于获取请求参数,其可以指定参数名和默认值。
@GetMapping("/user")
public User getUserById(@RequestParam(value="id", required=true, defaultValue="1") Long id) {
return userService.getUserById(id);
}
在上面的代码中,@RequestParam
注解用于获取 URL 中的 "id" 参数,如果没有传入参数,则使用默认值 "1"。value
参数表示参数名,required
参数表示是否必须,defaultValue
参数表示默认值。
@RequestBody
注解
@RequestBody
注解用于获取请求体中的数据。
@PostMapping("/login")
public String login(@RequestBody LoginForm form) {
if (userService.authenticate(form.getUsername(), form.getPassword())) {
return "登录成功";
} else {
return "用户名或密码错误";
}
}
在上面的代码中,@RequestBody
注解用于获取请求体中的数据,并将其映射为 LoginForm 类型的对象。
应用场景案例
@PathVariable
注解
下面我们以一个电商网站为例,展示 @PathVariable
注解的使用。
我们假设电商网站有如下的 URL:
http://localhost:8080/product/123
其中, "product" 是路径, "123" 是商品 ID。我们可以使用 @PathVariable
注解来获取商品 ID,并查询对应的商品信息:
@GetMapping("/product/{id}")
public Product getProductById(@PathVariable("id") Integer id) {
return productService.getProductById(id);
}
在上面的代码中,我们使用 @PathVariable
注解来将 URL 中的 "id" 参数绑定到方法参数 "id" 上,并调用 ProductService 的 getProductById 方法来查询商品信息。
@RequestParam
注解
下面我们以一个博客网站为例,展示 @RequestParam
注解的使用。
我们假设博客网站有如下的 URL:
http://localhost:8080/posts?category=java&page=1
其中, "posts" 是路径, "category" 和 "page" 是请求参数。我们可以使用 @RequestParam
注解来获取请求参数,并查询对应的文章列表:
@GetMapping("/posts")
public List<Post> getPostList(
@RequestParam(value="category", required=false) String category,
@RequestParam(value="page", required=false, defaultValue="1") Integer page) {
return postService.getPostList(category, page);
}
在上面的代码中,我们使用 @RequestParam
注解来获取请求参数 "category" 和 "page",并调用 PostService 的 getPostList 方法来查询文章列表。其中,required
参数表示 "category" 是否是必须参数,defaultValue
参数表示 "page" 参数的默认值。
@RequestBody
注解
下面我们以一个留言板为例,展示 @RequestBody
注解的使用。
我们假设留言板有如下的请求体:
{
"author": "Tom",
"content": "Hello, World!"
}
我们可以使用 @RequestBody
注解来将请求体映射为 Message 类型的对象,并保存到数据库中:
@PostMapping("/message")
public void saveMessage(@RequestBody Message message) {
messageService.saveMessage(message);
}
在上面的代码中,我们使用 @RequestBody
注解来将请求体映射为 Message 类型的对象,并调用 MessageService 的 saveMessage 方法来保存留言信息。
优缺点分析
优点
@PathVariable
注解可以将 URL 中的参数直接绑定到方法参数上,更加简洁方便。@RequestParam
注解可以获取请求参数,并提供了参数名和默认值的配置选项。@RequestBody
注解可以获取请求体中的数据,并将其映射为实体对象,方便后续处理。
缺点
- 使用
@PathVariable
和@RequestParam
注解时,参数名称可能会因为修改路由而发生变化,需要手动修改或设置默认值。 @RequestBody
注解无法处理文件上传等复杂请求体。
类代码方法介绍
@PathVariable
注解
1. getRequestById
@GetMapping("/request/{id}")
public Request getRequestById(@PathVariable("id") Long id) {
return requestService.getRequestById(id);
}
- 功能:获取请求信息。
- 参数:
id
- 请求 ID。 - 返回值:请求信息实体对象。
@RequestParam
注解
1. getPostList
@GetMapping("/posts")
public List<Post> getPostList(
@RequestParam(value="category", required=false) String category,
@RequestParam(value="page", required=false, defaultValue="1") Integer page) {
return postService.getPostList(category, page);
}
- 功能:获取文章列表。
- 参数:
category
- 文章分类,page
- 当前页码。 - 返回值:文章列表数据。
@RequestBody
注解
1. saveMessage
@PostMapping("/message")
public void saveMessage(@RequestBody Message message) {
messageService.saveMessage(message);
}
- 功能:保存留言信息。
- 参数:
message
- 留言信息实体对象。 - 返回值:无。
总结
Spring Boot 中的 @PathVariable
、@RequestParam
和 @RequestBody
注解都是用于接收请求参数的常见注解。其中,@PathVariable
注解用于获取 URL 中的参数,@RequestParam
注解用于获取请求参数,@RequestBody
注解用于获取请求体中的数据。通过本文介绍的使用方法和应用场景案例,我们可以更加清晰地了解这三种注解的使用方法和优缺点。在实际开发中,根据业务需求选择合适的注解,可以提高代码的可读性和开发效率。
附录源码
如上涉及所有源码均已上传同步在「GitHub」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Spring Boot」,从入门到精通,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
📣关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。