【Spring MVC 常用注解】注解驱动开发的魔法

在 Spring MVC 中,注解可以说是开发者的“魔法棒”,通过简单的注解配置,开发者能够实现请求处理、参数绑定、响应返回等复杂功能,真正做到“少写代码多干活”


我们接下来就来一起看看 Spring MVC 中常用的注解,它们的功能是什么,又该如何使用。如果你对这些注解已经有所了解,那不妨通过本文再来巩固一下,说不定还能学到一些新玩法!


1. @Controller:声明控制器的身份

@Controller 是 Spring MVC 中的核心注解,用于标识一个类为控制器组件。控制器是 MVC 中的“C”,负责接收请求、调用业务逻辑并返回视图(可以是一个页面,可以是JSON数据)

示例

@Controller
public class UserController {@RequestMapping("/hello")public String sayHello() {return "helloView"; // 返回视图名}
}

工作原理

  • @Controller 标注的类会被 Spring 容器扫描并注册为一个 Bean。

  • 配合其他注解处理请求映射和参数绑定。

小提示@Controller@Component 的派生注解,因此它也会被自动扫描到 Spring 容器中。


2. @RequestMapping:请求路径的导航标志

@RequestMapping 用于定义请求路径与控制器方法的映射关系,是 Spring MVC 中最常见的注解之一。

功能特点

  • 可以作用在类上,指定控制器的基础路径

  • 可以作用在方法上,进一步指定具体路径

示例

@Controller
@RequestMapping("/user")
public class UserController {
​@RequestMapping("/profile")public String getUserProfile() {return "profileView"; // 返回视图名}
}

请求路径 /user/profile 会被映射到 getUserProfile 方法。

扩展功能

  • 可以指定请求方法(如 GET、POST):

    @RequestMapping(value = "/update", method = RequestMethod.POST)
    public String updateUser() {return "updateSuccess";
    }
  • 还可以用简化注解,如 @GetMapping@PostMapping 等。


3. @RequestParam:请求参数绑定到方法参数

@RequestParam 用于将请求中的参数映射到方法参数。适用于 URL 查询参数(如 ?name=John)或表单提交的数据。

示例

@Controller
@RequestMapping("/user")
public class UserController {
​@RequestMapping("/greet")public String greetUser(@RequestParam("name") String userName, Model model) {model.addAttribute("greeting", "Hello, " + userName + "!");return "greetView";}
}

请求路径 /user/greet?name=John 会将参数 name 的值映射到 userName

可选参数

  • 设置默认值:

    @RequestParam(value = "age", defaultValue = "18") int userAge
  • 标记为可选:

    @RequestParam(value = "nickname", required = false) String nickname

4. @PathVariable:URL 中的路径变量映射

@PathVariable 用于将 URL 中的动态路径部分绑定到方法参数。它非常适合 REST 风格的接口

示例

@Controller
@RequestMapping("/user")
public class UserController {
​@RequestMapping("/{id}")public String getUserById(@PathVariable("id") int userId, Model model) {model.addAttribute("userId", userId);return "userDetailView";}
}

请求路径 /user/123 会将 123 绑定到 userId 参数。

注意:路径变量名称和方法参数名称一致时,@PathVariablevalue 属性可以省略。


5. @ModelAttribute:对象绑定与预处理神器

@ModelAttribute 用于将请求参数自动绑定到 Java 对象,同时也可以用于在请求处理之前预填充数据

自动绑定

@Controller
@RequestMapping("/user")
public class UserController {
​@RequestMapping("/register")public String registerUser(@ModelAttribute User user) {// User 对象会自动绑定请求参数return "registerSuccess";}
}

假设请求参数为 name=John&age=25,Spring MVC 会将这些参数填充到 User 对象中。

预填充数据: 当作用在方法上时,可以在 Controller 方法执行前为模型添加数据:

@ModelAttribute
public void addDefaultAttributes(Model model) {model.addAttribute("appName", "Spring MVC Demo");
}

6. @RequestBody:绑定请求体数据到方法参数

@RequestBody 用于将 HTTP 请求体的数据直接绑定到方法参数上,特别适用于处理 JSON 格式的请求体

功能:

  • 将请求体数据反序列化为 Java 对象。

  • 适用于 JSON、XML 等多种数据格式。

  • 常用于 RESTful API,简化请求体数据的处理。

示例:

假设用户通过 POST 请求提交以下 JSON 数据:

{"name": "Alice","age": 25
}

控制器代码:

@RestController
@RequestMapping("/user")
public class UserController {
​@PostMapping("/register")public String registerUser(@RequestBody User user) {return "User registered: " + user.getName();}
}

说明

  • JSON 数据中的 nameage 会自动绑定到 User 对象的对应字段。

  • 返回结果将是字符串:User registered: Alice


注意事项

  • 请求头必须包含 Content-Type: application/json

  • 如果请求体为空或格式不正确,会抛出异常(如 HttpMessageNotReadableException),建议配合全局异常处理器使用。


7. @ResponseBody:直接返回数据

@ResponseBody 是一个强大的注解,用于将方法的返回值直接作为 HTTP 响应体,而不是视图名。它非常适合用来返回 JSON 或纯文本数据

示例

@Controller
@RequestMapping("/api")
public class ApiController {
​@RequestMapping("/hello")@ResponseBodypublic String sayHello() {return "Hello, JSON!";}
}

请求 /api/hello 会直接返回字符串 Hello, JSON!

扩展:在现代项目中,@ResponseBody 更常与 @RestController 一起使用。


8. @RestController:简化你的 REST API

@RestController@Controller@ResponseBody 的组合注解,专门用于构建 REST API。标记为 @RestController 的类中的所有方法默认返回 JSON,而不是视图。

示例

@RestController
@RequestMapping("/api")
public class ApiController {
​@GetMapping("/user/{id}")public User getUser(@PathVariable int id) {return new User(id, "John");}
}

请求 /api/user/123 会返回一个 JSON 对象

{"id": 123,"name": "John"
}

总结:注解让开发更简单

Spring MVC 提供了丰富的注解,极大简化了 Web 开发的复杂度:

  1. @Controller@RestController:定义控制器。

  2. @RequestMapping:映射请求路径。

  3. @RequestParam@PathVariable:处理请求参数和路径变量。

  4. @ModelAttribute:对象绑定和数据预填充。

  5. @RequestBody:请求体为JSON对象的获取

  6. @ResponseBody:直接返回数据。

这些注解让开发者能够专注于业务逻辑,而不用担心底层的实现细节。如果你在项目中用到这些注解,有什么有趣的用法或者疑问,欢迎留言讨论! 😊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【最新】西陆房产系统源码+uniapp全开源+环境教程

一.介绍 西陆房产管理系统,支持小程序、H5、APP;包含房客、房东(高级授权)、经纪人(高级授权)三种身份。核心功能有:新盘销售、房屋租赁、地图找房、房源代理(高级授权)、在线签约(高级授权)、电子合同(高级授权)、客户CRM跟进(高级授权)、经…

Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一:使用fromsize实现分页 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang) 1、search_after检索 在前面的文章介绍了fromsize的普通分页…

小程序基础 —— 10 如何调试小程序代码

如何调试小程序代码 在进行项目开发的时候,不可避免需要进行调试,那么如何调试小程序呢? 打开微信开发者工具后,有一个模拟器,通过模拟器能够实时预览自己写的页面,如下: 在上部工具栏中有一个…

Oracle中listagg与wm_concat函数的区别

Oracle中listagg与wm_concat都可以用于将多行数据合并成一个字符串的两个函数,区别如下: 1、分隔符:listagg支持指定分隔符,wm_concat默认为","不支持指定; 2、排序:listagg支持排序后…

VLM和VLAM(VLA)相关介绍和发展历程

目录 一、个人感想二、相关介绍2.1 视觉语言模型 (VLM) 的发展历程2.2 视觉语言动作模型 (VLA) 的发展历程2.3 一些关键的研究工作:一些架构图 三、发展历程3.1 视觉语言模型 (VLM) 的发展时间线3.2 视觉语言动作模型 (VLA) 的发展时间线 四、参考资料 一、个人感想…

算法题(18):删除有序数组中的重复项2

审题: 需要原地删除数据让数组中一个数据只能出现最多2次,并返回修改后的数组的数据个数 (不会有空数组情况) 思路: 双指针:我们用left指向下一个需要插入数据的位置,right去遍历数组 left数据的…

什么是变分法(Calculus of Variations)?以及 欧拉-拉格朗日方程(Euler-Lagrange Equation)具体推导:中英双语

中文版 什么是变分法(Calculus of Variations)? 变分法(Calculus of Variations)是一种数学方法,用于求解在某种条件下,使某个函数达到极值(最大值或最小值)的变量。变…

IPv6 基础协议-NDP

IPv6 基础协议报文 何为基础协议?像v4中的icmp、arp、hdcp之类的 在v6中只需要NDP协议,他是通过ICMPv6报文完成的,她能够实现邻居发现、无状态地址检测、重复地址检测、PMTU等功能 RS(133)RA(134&#x…

MySQL外键类型与应用场景总结:优缺点一目了然

前言: MySQL的外键简介:在 MySQL 中,外键 (Foreign Key) 用于建立和强制表之间的关联,确保数据的一致性和完整性。外键的作用主要是限制和维护引用完整性 (Referential Integrity)。 主要体现在引用操作发生变化时的处理方式&…

MONI后台管理系统-敏感信息脱敏传输

本文章纯转载,如有侵权联系删除 SpringBoot如何优雅地实现返回数据脱敏 前言:数据脱敏是一种常见的数据安全保护技术,可以在保护数据隐私的同时,保持数据的有效性和可用性。在 Spring Boot 中,我们可以使用注解的方式实…

分布式事务入门 一

分布式事务入门 一 您好,我是今夜写代码,今天学习下分布式事务相关理论,以及常见的解决方案,为后续掌握Seata分布式事务框奠定基础。 为什么需要分布式事务? 分布式事务主要由于存储资源的分布性,通常涉及多个数据库。 分布式…

Goland:专为Go语言设计的高效IDE

本文还有配套的精品资源,点击获取 简介:Goland是JetBrains公司开发的集成开发环境(IDE),专为Go语言设计,提供了高效的代码编辑、强大的调试工具和丰富的项目管理功能。其智能代码补全、强大的调试与测试支…

uniapp 前端解决精度丢失的问题 (后端返回分布式id)

原因: 后端使用分布式id, id为19位数,导致精度丢失 ,前端解决方法 这个是通过浏览器请求回来的数据,这个时候id 数据已经丢失了,在数据库查询不到,在调获详情接口的时候会有问题 实际的: 解决…

Pandas07

Pandas01 Pandas02 Pandas03 Pandas04 Pandas05 Pandas06 文章目录 1 用户偏好分析 TGI1.1 TGI介绍1.2 TGI案例代码 2 用户评论文本分析2.1 用户评论文本分析简介 1 用户偏好分析 TGI 1.1 TGI介绍 TGI(Target Group Index,目标群体指数)用于…

spring cloud微服务-OpenFeign的使用

OpenFeign的使用 openFeign的作用是服务间的远程调用 ,比如通过OpenFeign可以实现调用远程服务。 已经有了LoadBalancer为什么还要用openFeign? 在微服务架构中,LoadBalancer和OpenFeign虽然都提供了服务间调用的能力,但它们的设计目的和…

使用PHP函数 “setcookie“ 设置cookie

在网站开发中,cookie是一种非常常用的技术,它用于在用户的浏览器中存储少量的数据,以便在不同页面之间传递信息。PHP提供了一个名为 "setcookie" 的函数,用于设置cookie的值和属性。在本文中,我们将学习如何…

读书笔记-《乡下人的悲歌》

前段时间看了一些 J.D. Vance 的采访视频,几乎都是记者带着刁难的问题先手进攻,而 Vance 面带微笑,提及对方的名字,条理清晰地从对方的攻击中切回主题形成后手反制,实在让人看得过瘾。 更不可思议的是,Van…

Datawhale-AI冬令营二期

目录 一、番茄时钟(1)输入Prompt(2)创建 HTML 文件解析1:HTML结构解析2:计时器内容解析3:按钮区域解析4:脚本引用 (3)使用JavaScript实现时钟功能解析1&#…

【Sentinel】流控效果与热点参数限流

目录 1.流控效果 1.1.warm up 2.2.排队等待 1.3.总结 2.热点参数限流 2.1.全局参数限流 2.2.热点参数限流 2.3.案例 1.流控效果 在流控的高级选项中,还有一个流控效果选项: 流控效果是指请求达到流控阈值时应该采取的措施,包括三种&…

我的Qt作品(20)使用Qt+OpenCV写一个旋转/抠图/mask生成工具

使用QtOpenCV写一个旋转/抠图/mask生成工具 1、旋转功能 void FormRotate::rotateImage(const cv::Mat &src, cv::Mat &dst, double degree) //旋转 {if (fabs(degree) < 0.001){dst src;return;}//center旋转的中心点坐标//degree旋转的角度,不是弧度,>0逆时针…