【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")
    @ResponseBody
    public 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:直接返回数据。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟着逻辑先生学习FPGA-实战篇第一课 6-1 LED灯闪烁实验

硬件平台:征战Pro开发板 软件平台:Vivado2018.3 仿真软件:Modelsim10.6d 文本编译器:Notepad 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1 知识背景 LED,又名…

2024国城杯 Web

这四道题目Jasper大佬都做了镜像可以直接拉取进行复现 https://jaspersec.top/2024/12/16/0x12%20%E5%9B%BD%E5%9F%8E%E6%9D%AF2024%20writeup%20with%20docker/ n0ob_un4er 这道题没有复现成功, 不知道为啥上传了文件, 也在 /tmp目录下生成了sess_PHPSESSID的文件, 但是就是…

【ArcGISPro/GeoScenePro】检查多光谱影像的属性并优化其外观

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 操作 其他数据 检查影像的属性 熟悉检查您正在使用的栅格属性非常重要。

基于Docker基础与操作实战

6.1 Docker容器简介 Docker是一个开源的应用容器引擎,它基于Go语言并遵从Apache2.0 协议开源。 Docker是一个用于开发,交付和运行应用程序的开放平台。Docker能将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,您可…

使用exe4j将jar转成exe、java打包exe

1、maven打包 需要配置以下插件&#xff0c;注意skip为false 插件配置中设置 <skip>true</skip> 时&#xff0c;实际上是告诉 Maven 在构建过程中跳过 spring-boot-maven-plugin 插件的执行。也就是说&#xff0c;Maven 在打包时不会将项目打包成可执行的 JAR 文…

MySQL 的事务与多版本并发控制(MVCC)的那些事

什么是事务原子性:一致性隔离性 问题1: 为什么MySQL要使用mvcc实现隔离性而不使用 锁 解决并发问题?持久性 问题2: MySQL 不是磁盘数据库吗,持久化为什么是 redo log 保证的?问题 3: redo log 储存了什么东西,持久化(崩溃恢复是怎么做的?)问题 4 : MySQL 的 bing log (二进制…

【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、通信基本知识1.1 MCU的参见外设1.2 通信的分类按基本的类型从传输方向上来分 二、UART&#xff08;串口通讯&#xff09;2.1 简介2.2 时序图分析2.3 UART的…

Ceph 手动部署(CentOS9)

#Ceph手动部署、CentOS9、squid版本、数字版本19.2.0 #部署服务:块、对象、文件 一、部署前规划 1、兼容性确认 2、资源规划 节点类型节点名称操作系统CPU/内存硬盘网络组件安装集群节点CephAdm01CentOS94U/8GOS:40G,OSD:2*100GIP1:192.169.0.9(管理&集群),IP2:…

CentOS7 解决ping:www.baidu.com 未知的名称或服务

CentOS7 解决ping&#xff1a;www.baidu.com“未知的名称或服务 在VM查看网络配置 查看虚拟网络编辑器 编辑网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33注意&#xff1a;不同机器的配置文件名可能不相同&#xff0c;通过 ip addr 命令查看 将 ONBOOT 从 no 改…

GPU 进阶笔记(二):华为昇腾 910B GPU

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 1 术语 1.1 与 NVIDIA 术语对应关系1.2 缩写2 产品与机器 2.1 GPU 产品2.2 训练机器 底座 CPU功耗操作系统2.3 性能3 实探&#xff1a;鲲鹏底座 8*910B GPU 主机 3.1 CPU3.2 网卡和网络3.3 GPU 信息 3.3…

[ICCD 2022]Towards Sparsification of Graph Neural Networks

论文网址&#xff1a;[2209.04766] Towards Sparsification of Graph Neural Networks 论文代码&#xff1a;github.com 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#…

人工智能与传统编程的主要区别是什么?

传统编程&#xff1a;开发者预先编写软件行为规则&#xff0c;代码基于程序员定义逻辑处理输入并产生确定输出&#xff0c;具有确定性、手动编写规则和结构化逻辑特点&#xff0c;如垃圾邮件分类程序基于预设关键词等规则。AI 编程&#xff1a;从数据中学习而非手动编写规则&am…

Mac电脑python多版本环境安装与切换

我当前是python3.9.6环境&#xff0c;需要使用3.9.8环境&#xff0c;通过brew安装3.9.8版本&#xff0c;然后通过pyenv切换环境 步骤 1: 安装 pyenv brew install pyenv brew install pyenv-virtualenv 步骤 2: 安装 Python 3.9.8&#xff08;使用 pyenv 安装指定版本的 Pyth…

UE5通过蓝图节点控制材质参数

通过蓝图节点控制材质的参数 蓝图节点 在材质上设置标量值 和 在材质上设置向量参数值 Set Scalar Parameter Value on Materials Set Vector Parameter Value on Materials 这两个蓝图节点都可以在蓝图中&#xff0c;控制材质的参数值和向量值

人工智能(AI)简史:推动新时代的科技力量

一、人工智能简介 人工智能&#xff08;AI&#xff0c;Artificial Intelligence&#xff09;是计算机科学的一个分支&#xff0c;旨在研究和开发可以模拟、扩展或增强人类智能的系统。它涉及多种技术和方法&#xff0c;包括机器学习、深度学习、自然语言处理&#xff08;NLP&a…

Github优质项目推荐(第十期)

文章目录 Github优质项目推荐&#xff08;第十期&#xff09;一、【postiz-app】&#xff0c;14.6k stars - 您的终极 AI 社交媒体调度工具二、【lobe-chat】&#xff0c;50.1k stars - AI 聊天框架三、【cobalt】&#xff0c;22.1k stars - 媒体下载器四、【build-your-own-x】…

DeepSeek V3“报错家门”:我是ChatGPT

搜 &#xff1a;海讯无双Ai 要说这两天大模型圈的顶流话题&#xff0c;那绝对是非DeepSeek V3莫属了。 不过在网友们纷纷测试之际&#xff0c;有个bug也成了热议的焦点—— 只是少了一个问号&#xff0c;DeepSeek V3竟然称自己是ChatGPT。 甚至让它讲个笑话&#xff0c;生成…

通过 4 种方法将数据从 OnePlus 传输到Android

概括 由于它们是不同的品牌&#xff0c;因此将数据从 OnePlus 传输到Android是否很困难&#xff1f;也许您可以从这篇介绍 OnePlus 到Coolmuster Android数据传输的 4 个实用解决方案的文章中获得帮助。学习完它们后&#xff0c;您将有一个顺利的转移过程&#xff0c;所以为什…

Spring Boot的开发工具(DevTools)模块中的热更新特性导致的问题

问题&#xff1a; java.lang.ClassCastException: class cn.best.scholarflow.framework.system.domain.entity.SysUser cannot be cast to class cn.best.scholarflow.framework.system.domain.entity.SysUser (cn.best.scholarflow.framework.system.domain.…

频域滤波为什么使用psf2otf函数?

MATLAB中circshift函数是psf2otf函数的核心&#xff0c;在MATLAB中circshift函数的原理分析——psf2otf函数的核心直观解释了为什么需要循环移位。 MATLAB提出了psf2otf函数&#xff0c;先做循环移位&#xff0c;再计算离散傅里叶变换。如果有空域的卷积核&#xff0c;通过这个…