【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 参数。
注意:路径变量名称和方法参数名称一致时,
@PathVariable的value属性可以省略。
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 数据中的
name和age会自动绑定到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 开发的复杂度:
-
@Controller和@RestController:定义控制器。 -
@RequestMapping:映射请求路径。 -
@RequestParam和@PathVariable:处理请求参数和路径变量。 -
@ModelAttribute:对象绑定和数据预填充。 -
@RequestBody:请求体为JSON对象的获取 -
@ResponseBody:直接返回数据。
这些注解让开发者能够专注于业务逻辑,而不用担心底层的实现细节。如果你在项目中用到这些注解,有什么有趣的用法或者疑问,欢迎留言讨论! 😊
相关文章:
【Spring MVC 常用注解】注解驱动开发的魔法
在 Spring MVC 中,注解可以说是开发者的“魔法棒”,通过简单的注解配置,开发者能够实现请求处理、参数绑定、响应返回等复杂功能,真正做到“少写代码多干活”。 我们接下来就来一起看看 Spring MVC 中常用的注解,它们的…...
jmeter分布式启动
https://www.cnblogs.com/qtclm/p/11082081.html 1、代理机:输入“ipconfig”,找到IP地址,在Jmeter/bin/jmeter.properties设置remote host 启动jmeter server 1、控制机:输入“ipconfig”,找到IP地址,在J…...
数据仓库中的指标体系模型介绍
数据仓库中的指标体系介绍 文章目录 数据仓库中的指标体系介绍前言什么是指标体系指标体系设计有哪些模型?1. 指标分层模型2. 维度模型3. 指标树模型4. KPI(关键绩效指标)模型5. 主题域模型6.平衡计分卡(BSC)模型7.数据指标框架模…...
混合合并两个pdf文件
混合两个pdf 1、在线免费交替和混合奇数和偶数PDF页面2、有什么软件把两个 PDF 交叉合并?3、pdfsam本地合并 如何Google翻译的原文和译文合并,(沉浸式翻译效果相对较好) 1、在线免费交替和混合奇数和偶数PDF页面 https://deftpd…...
aws(学习笔记第二十一课) 开发lambda应用程序
aws(学习笔记第二十一课) 开发lambda应用程序 学习内容: lambda的整体概念开发lambda应用程序 1. lambda的整体概念 借助AWS Lambda,无需预置或管理服务器即可运行代码。只需为使用的计算时间付费。借助 Lambda,可以为几乎任何类型的应用进…...
JavaWeb Servlet的getInitParameter、业务层、控制反转IOC和依赖注入DI
目录 1. Servlet的getInitParameter2. 业务层3. 控制反转IOC和依赖注入DI3.1 背景3.2 实现如下3.3 原理 1. Servlet的getInitParameter Servlet有两个getInitParameter 一个是servletContext.getInitParameter,获取context-param的全局参数一个是servletConfig.ge…...
免费开源跨平台SSH工具 WindTerm:媲美 xshell 的最佳平替(含详细使用教程)
免费开源跨平台SSH工具 WindTerm WindTerm概述免费开源、免费开源、免费开源下载、安装WindTerm 屏幕截图WindTerm 主窗口 (zsh):WindTerm 拆分视图:WindTerm DigeWhite 主题: WindTerm 基本设置使用WindTerm连接到服务…...
洛谷 P1075 [NOIP2012 普及组] 质因数分解 C语言
题目: P1075 [NOIP2012 普及组] 质因数分解 - 洛谷 | 计算机科学教育新生态 题目描述 已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。 输入格式 输入一个正整数 n。 输出格式 输出一个正整数 p,即较大的那个质数。…...
Apache Hive常见问题
入门问题 什么是Apache Hive? 解释Hive的用途。Hive作为基于Hadoop的数据仓库工具是如何工作的?与传统关系型数据库相比,使用Hive有什么优势? Hive和关系型数据库管理系统(RDBMS)之间的区别是什么&#…...
活动报名系统源码:JAVA同城服务系统活动报名同城圈子商家商城城市代理躲猫猫
JAVA同城服务系统:打造多元化社交与娱乐新体验 在数字化时代,同城服务系统已成为连接城市生活的重要桥梁。我们精心打造的JAVA同城服务系统,不仅融合了活动报名、同城圈子、商家商城、城市代理等多重功能,还特别加入了创新的“躲…...
迈向Z级计算:Cloud4Science范式加速科学发现进程
传统超级计算机作为科学计算的核心支柱,在推动技术进步方面发挥了不可替代的作用,但随着科学智能时代下需求的多样化和复杂化,其扩展性和能效的局限逐渐显现。 针对这一挑战, 微软亚洲研究院 的研究员提出了 Cloud4Science 的新范…...
ES IK分词字典热更新
前言 在使用IK分词器的时候,发现官方默认的分词不满足我们的需求,那么有没有方法可以自定义字典呢? 官方提供了三种方式 一、ik本地文件读取方式 k插件本来已为用户提供自定义词典扩展功能,只要修改配给文件即可: …...
Mac连接云服务器工具推荐
文章目录 前言步骤1. 下载2. 安装3. 常用插件安装4. 连接ssh测试5. 连接sftp测试注意:ssh和sftp的区别注意:不同文件传输的区别解决SSL自动退出 前言 Royal TSX是什么: Royal TSX 是一款跨平台的远程桌面和连接管理工具,专为 mac…...
从零开始:如何在 .NET Core 中优雅地读取和管理配置文件
在.net中的配置文件系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、Azure Key Vault等,还可以配置自定义配置源并跟踪配置的改变,然后按照优先级进行覆盖,总之对文件的配置有很多方法,这…...
JVM学习:CMS和G1收集器浅析
总框架 一、Java自动内存管理基础 1、运行时数据区 运行时数据区可分为线程隔离和线程共享两个维度,垃圾回收主要是针对堆内存进行回收 (1)线程隔离 程序计数器 虚拟机多线程是通过线程轮流切换、分配处理器执行时间来实现的。为了线程切换…...
Science Robotics让软机器人“活”得更久的3D打印!
软机器人硬件在医疗、探索无结构环境等领域有广泛应用,但其生命周期有限,导致资源浪费和可持续性差。软机器人结合软硬组件,复杂组装和拆卸流程使其难以维修和升级。因此,如何延长软机器人的生命周期并提高其可持续性成为亟待解决…...
模电面试——设计题及综合分析题0x01(含答案)
1、已知某温控系统的部分电路如下图(EDP070252),晶体管VT导通时,继电器J吸合,压缩机M运转制冷,VT截止时,J释放,M停止运转。 (1)电源刚接通时,晶体…...
二层交换机和三层交换机
一、交换机简述 交换机的主要功能包括物理编址、网络拓扑结构、错误校验、帧序列以及流控。交换机还具备了一些新的功能,如对VLAN(虚拟局域网)的支持、对链路汇聚的支持,甚至有的还具有防火墙的功能。 交换机除了能够连接同种类型…...
每天五分钟机器学习:凸集
本文重点 在SVM中,目标函数是一个凸函数,约束集合是一个凸集。因此,SVM问题可以转化为一个凸规划问题来求解。这使得SVM在实际应用中具有较高的计算效率和准确性。 凸集的定义 凸集是指一个集合中的任意两点之间的线段都完全包含在这个集合中。换句话说,给定集合C中的两…...
Mongodb日志报错too many open files,导致mongod进程down
【解决方案】 (1)进入到服务器,执行: ulimit -a 查看:open files这一行的数量,如果查询到的结果是1000左右,那多半是服务器限制。 (2)在当前session窗口执行如下&…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
