【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.rhkb.cn/news/498907.html

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

相关文章

如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程

简介 本教程将教你如何优化 Nginx,使其能够高效地处理高流量网站。 Nginx 是一个强大且高性能的 Web 服务器,以其高效处理大量并发连接的能力而闻名,这使得它成为高流量网站的流行选择。 正确优化 Nginx 可以显著提高服务器的性能&#xff0…

【持续更新中】transformer详解和embedding大模型

这里记录一下自己学习embedding大模型的记录,涉及到transformer和bert这些。 一切都可以编码,比如说图片是三原色 背景介绍 训练集和测试集的分,无监督学习,现在基本都是使用无监督学习,有监督学习的话参考计算机视觉…

csrf跨站请求伪造(portswigger)无防御措施

前言:基础csrf学习(没有任何防御措施) 内容来自portswigger,一个靶场练习,国外的网站,可能需要翻墙 要使 CSRF 攻击成为可能,必须满足三个关键条件: 相关操作。应用程序中存在攻击…

cocos creator 3.x版本如何添加打开游戏时首屏加载进度条

前言 项目有一个打开游戏时添加载入进度条的需求。这个功能2.X版本是自带的,不知为何在3.X版本中移除了。 实现 先说一下解决思路,就是在引擎源码加载场景的位置插入一个方法,然后在游戏入口HTML处监听即可。 1.找到对应源码脚本 在coco…

Zookeeper在中间件的应用和在Spring Boot业务系统中实现分布式锁和注册中心的解决方案

前言 Zookeeper是什么? ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应…

idea报错:There is not enough memory to perform the requested operation.

文章目录 一、问题描述二、先解决三、后原因(了解) 一、问题描述 就是在使用 IDEA 写代码时,IDEA 可能会弹一个窗,大概提示你目前使用的 IDEA 内存不足,其实就是提醒你 JVM 的内存不够了,需要重新分配。弹…

Anaconda+PyTorch(CPU版)安装

1.Anaconda下载 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 如果已安装python,下载之前要彻底删除之前下载的python 2.Anaconda安装 3.添加环境变量 //根据实际安装路径进行更改 D:\Anaconda D:\Anaconda\Scripts D:\…

使用apisix+oidc+casdoor配置微服务网关

一、服务架构图 二、安装配置 1. 安装配置apisix (1). 快速启动及验证: curl -sL https://run.api7.ai/apisix/quickstart | sh该命令启动 apisix-quickstart 和 etcd 两个容器,APISIX 使用 etcd 保存和同步配置。APISIX 和 etcd 容器使用 Docker 的 …

【数据仓库】hadoop3.3.6 安装配置

文章目录 概述下载解压安装伪分布式模式配置hdfs配置hadoop-env.shssh免密登录模式设置初始化HDFS启动hdfs配置yarn启动yarn 概述 该文档是基于hadoop3.2.2版本升级到hadoop3.3.6版本,所以有些配置,是可以不用做的,下面仅记录新增操作&#…

STM32中断详解

STM32中断详解 NVIC 中断系统中断向量表相关寄存器中断优先级中断配置 外部中断实验EXTI框图外部中断/事件线映射中断步骤初始化代码实现 定时器中断通用定时器相关功能标号1:时钟源标号 2:控制器标号 3:时基单元 代码实现 NVIC 中断系统 STM…

常见的中间件漏洞

1.tomcat 1.1 CVE-2017-12615(put上传) 当在Tomcat的conf(配置目录下)/web.xml配置文件中添加readonly设置为false时,将导致该漏洞产 ⽣,(需要允许put请求) , 攻击者可以利⽤PUT方法通过精心构造的数据包…

【JAVA】神经网络的基本结构和前向传播算法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…

Qt 12.28 day3

作业: 1】 思维导图 2】 在登录界面的登录取消按钮进行以下设置: 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&a…

Ubuntu 20.04.1 LTS搭建nginx + php7.4运行环境

本文基于https://www.rosehosting.com/blog/how-to-install-php-7-4-with-nginx-on-ubuntu-20-04/的翻译和实践记录。 安装 Nginx 默认情况下,最新版本的 Nginx 位于 Ubuntu 20.04 默认存储库中。您可以使用以下命令安装它: apt-get install nginx -y…

【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下,跨境电商行业正以前所未有的态势重塑国际贸易格局,成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》,…

UE5材质节点Camera Vector/Reflection Vector

Camera Vector相机向量,输出像素到相机的方向,结果归一化 会随着相机移动而改变 Reflection Vector 反射向量,物体表面法线反射到相机的方向,x和y和camera vector相反 配合hdr使用

【数据仓库】spark大数据处理框架

文章目录 概述架构spark 架构角色下载安装启动pyspark启动spark-sehll启动spark-sqlspark-submit经验 概述 Spark是一个性能优异的集群计算框架,广泛应用于大数据领域。类似Hadoop,但对Hadoop做了优化,计算任务的中间结果可以存储在内存中&a…

【Elasticsearch】集群配置深度解析与实践

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

Three.js教程004:坐标辅助器与轨道控制器

文章目录 坐标辅助器与轨道控制器实现效果添加坐标辅助器添加轨道控制器完整代码完整代码下载坐标辅助器与轨道控制器 实现效果 添加坐标辅助器 创建坐标辅助器: const axesHelper = new Three.AxesHelper(5);添加到场景中: scene.

紫光展锐推出高性能四核4G 智能穿戴平台W377E,应用场景更丰富

近日,紫光展锐正式推出高性能4G 智能穿戴平台W377E。该产品面向不同的应用场景,拥有丰富特性和超低功耗,进一步壮大紫光展锐的智能穿戴产品组合。紫光展锐面向中高端和海量的智能穿戴市场,持续提供技术先进、高效安全、高质可靠的…