Spring Boot之如何正确使用@PathVariable,@RequestParam、@RequestBody等注解?
  HptQjPcX5vAL 2023年12月15日 30 0

在这里插入图片描述


🏆本文收录于《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电子书籍、简历模板等海量资料。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月15日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   53   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   107   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java