一、控制器相关注解

@Controller

@Controller注解用于标记一个类为 Spring MVC 的控制器。在 Spring MVC 框架里,控制器扮演着关键角色,负责接收 HTTP 请求并返回响应。当一个类被@Controller注解标记后,Spring 容器会自动识别并将其纳入管理。例如:

@Controller
public class UserController {// 控制器方法将在这里定义
}

@RestController

@RestController是一个组合注解,它融合了@Controller@ResponseBody的功能。与传统的@Controller不同,@RestController专门用于构建 RESTful Web 服务。在使用@RestController注解的类中,所有方法的返回值会直接作为响应体返回给客户端,无需再进行视图解析。这使得开发 RESTful 接口变得异常简洁高效,例如:

@RestController
public class UserRestController {@GetMapping("/users/{id}")public User getUserById(@PathVariable Long id) {// 从数据库或其他数据源获取用户信息User user = userService.getUserById(id);return user;}
}

@RequestMapping

@RequestMapping是 Spring MVC 中用于映射 Web 请求到特定处理器方法的核心注解。它可以作用于类级别和方法级别。在类级别使用时,定义了该控制器的基础路径;在方法级别使用时,则定义了具体的 URL 模式映射。例如:

@Controller
@RequestMapping("/users")
public class UserController {@RequestMapping(value = "/{id}", method = RequestMethod.GET)public String getUserById(@PathVariable Long id, Model model) {User user = userService.getUserById(id);model.addAttribute("user", user);return "userDetails";}
}

在上述示例中,@RequestMapping("/users")定义了UserController的基础路径为/users,而@RequestMapping(value = "/{id}", method = RequestMethod.GET)则映射了一个 GET 请求到getUserById方法,路径为/users/{id}

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping

这些注解分别对应 HTTP 的 GET、POST、PUT、DELETE、PATCH 请求方法,是@RequestMapping的快捷方式。它们使得代码更加清晰易读,明确表示了方法所处理的请求类型。例如:

@RestController
@RequestMapping("/products")
public class ProductController {@GetMapping("/{id}")public Product getProductById(@PathVariable Long id) {return productService.getProductById(id);}@PostMappingpublic Product createProduct(@RequestBody Product product) {return productService.createProduct(product);}@PutMapping("/{id}")public Product updateProduct(@PathVariable Long id, @RequestBody Product product) {return productService.updateProduct(id, product);}@DeleteMapping("/{id}")public void deleteProduct(@PathVariable Long id) {productService.deleteProduct(id);}
}

二、请求参数绑定注解

@RequestParam

@RequestParam注解用于将 HTTP 请求中的参数绑定到控制器方法的参数上。它适用于 GET 和 POST 请求中的查询参数或表单字段。例如:

@Controller
@RequestMapping("/search")
public class SearchController {@GetMappingpublic String searchProducts(@RequestParam String keyword, Model model) {List<Product> products = productService.searchProducts(keyword);model.addAttribute("products", products);return "searchResults";}
}

在这个例子中,@RequestParam String keyword将请求中的keyword参数绑定到searchProducts方法的keyword参数上。

@PathVariable

@PathVariable注解用于从 URI 模板中提取变量,并将其绑定到方法参数上,常用于 RESTful 风格的 URL 设计。例如:

@RestController
@RequestMapping("/orders")
public class OrderController {@GetMapping("/{orderId}")public Order getOrderById(@PathVariable Long orderId) {return orderService.getOrderById(orderId);}
}

在上述代码中,@PathVariable Long orderId/orders/{orderId}这样的 URL 路径中提取orderId变量,并将其传递给getOrderById方法。

@RequestBody

@RequestBody注解用于将 HTTP 请求体的内容反序列化成 Java 对象,通常与 JSON 或 XML 格式的数据一起使用。在处理 POST 或 PUT 请求时,当请求体中包含复杂数据结构时,@RequestBody注解尤为重要。例如:

@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic User createUser(@RequestBody User user) {return userService.createUser(user);}
}

这里,客户端发送的 JSON 格式的用户信息会被自动反序列化为User对象,并传递给createUser方法。

@RequestHeader

@RequestHeader注解用于获取 HTTP 请求头信息并绑定到方法参数上。例如,要获取请求中的Authorization头信息:

@Controller
@RequestMapping("/protected")
public class ProtectedController {@GetMappingpublic String getProtectedResource(@RequestHeader String Authorization) {// 根据授权信息进行业务处理return "protectedResource";}
}

@CookieValue

@CookieValue注解用于获取 Cookie 值并绑定到方法参数上。例如:

@Controller
@RequestMapping("/user")
public class UserProfileController {@GetMappingpublic String getUserProfile(@CookieValue("JSESSIONID") String sessionId) {// 根据会话ID获取用户信息return "userProfile";}
}

三、返回值处理注解

@ResponseBody

@ResponseBody注解表示该方法的返回结果应直接写入 HTTP 响应体中,而不是解析为视图名。在构建 RESTful 服务时,它常与@RestController一起使用。例如:

@Controller
public class JsonController {@ResponseBody@GetMapping("/data")public List<DataObject> getData() {return dataService.getData();}
}

@ModelAttribute

@ModelAttribute注解有两个主要用途:一是将数据添加到模型中,供视图使用;二是用于方法参数,接收来自表单提交的数据并绑定到对象上。例如:

@Controller
@RequestMapping("/form")
public class FormController {@GetMappingpublic String showForm(Model model) {model.addAttribute("user", new User());return "form";}@PostMappingpublic String submitForm(@ModelAttribute User user) {userService.saveUser(user);return "redirect:/success";}
}

在上述代码中,@ModelAttribute User usersubmitForm方法中接收表单提交的数据,并自动绑定到User对象上。

四、数据验证注解

@Valid 和 @Validated

@Valid@Validated注解用于触发 JSR - 303/JSR - 380(Bean Validation API)的验证机制,确保传入的数据符合预定义的规则。@Valid通常直接用于方法参数上,而@Validated可以用于类、方法和参数上,并且支持分组验证。例如:

@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic User createUser(@Valid @RequestBody User user) {return userService.createUser(user);}
}

@Size、@Min、@Max、@NotNull、@Email 等

这些是具体的验证注解,用于对字段进行约束检查。例如,使用@Size注解限制字符串长度:

public class User {@NotNullprivate String username;@Size(min = 6, max = 20)private String password;@Emailprivate String email;// 省略getter和setter方法
}

在这个User类中,username字段不能为空,password字段长度必须在 6 到 20 之间,email字段必须符合邮箱格式。

五、拦截器和异常处理注解

@ExceptionHandler

@ExceptionHandler注解用于定义全局异常处理方法,可以捕获并处理特定类型的异常。例如:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(NotFoundException.class)public ResponseEntity<String> handleNotFoundException(NotFoundException ex) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Resource not found: " + ex.getMessage());}
}

@ControllerAdvice

@ControllerAdvice注解用于定义全局的异常处理逻辑或数据绑定逻辑,可以应用于所有控制器。它使得代码中的异常处理更加集中和统一,提高了代码的可维护性。

六、其他常用注解

@SessionAttributes

@SessionAttributes注解用于指定哪些模型属性应该存储在 HTTP 会话中,以便跨多个请求保持状态。

@Controller
@SessionAttributes("user")
public class UserSessionController {@GetMapping("/login")public String login(Model model) {model.addAttribute("user", new User());return "login";}@PostMapping("/login")public String doLogin(@ModelAttribute User user, SessionStatus sessionStatus) {if (userService.validateUser(user)) {sessionStatus.setComplete();return "redirect:/home";} else {return "login";}}
}

@CrossOrigin

@CrossOrigin注解用于启用跨域资源共享(CORS),允许前端应用从不同源访问后端 API。在前后端分离的项目中,该注解非常有用。例如:

@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:3000")
public class ApiController {// API方法定义
}

在上述代码中,@CrossOrigin(origins = "http://localhost:3000")允许来自http://localhost:3000的前端应用访问该控制器的 API。

       Spring MVC 中的这些常用注解为开发者提供了强大而灵活的工具,极大地简化了 Web 应用程序的开发过程。通过合理使用这些注解,我们能够更加高效地构建功能丰富、易于维护的 Web 应用。

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

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

相关文章

Oracle APEX 利用卡片实现翻转(方法一)

目录 0. 以 Oracle 的标准示例表 EMP 为例&#xff0c;实现卡片翻转 1. 创建PL/SQL动态内容区域 2. 添加 CSS 实现翻转效果 3. 添加动态操作 (Dynamic Action) 4. 看效果 0. 以 Oracle 的标准示例表 EMP 为例&#xff0c;实现卡片翻转 正面&#xff1a; 显示员工姓名 (EN…

Gradio全解11——Streaming:流式传输的视频应用(1)——FastRTC:Python实时通信库

Gradio全解11——Streaming&#xff1a;流式传输的视频应用&#xff08;1&#xff09;——FastRTC&#xff1a;Python实时通信库前言第11章 Streaming&#xff1a;流式传输的视频应用11.1 FastRTC&#xff1a;Python实时通信库11.1.1 WebRTC协议与FastRTC介绍1. WebRTC协议的概…

一文学会二叉搜索树,AVL树,红黑树

文章目录二叉搜索树查找插入删除AVL树概念插入旋转AVL验证红黑树概念插入检测二叉搜索树 也称二叉排序树或二叉查找树 二叉搜索树&#xff1a;可以为空&#xff0c;若不为空满足以下性质 ⭐1&#xff0c;非空左子树小于根节点的值 ⭐2&#xff0c;非空右子大于根节点的值 ⭐3…

Android实战进阶 - 启动页

场景&#xff1a;当启动页处于倒计时阶段&#xff0c;用户将其切换为后台的多任务卡片状态&#xff0c;倒计时会继续执行&#xff0c;直到最后执行相关逻辑&#xff08;一般会跳转引导页、进入主页等&#xff09; 期望&#xff1a;而综合市场来看&#xff0c;一般我们期望的是当…

无标记点动捕技术:重塑展厅展馆的沉浸式数字交互新时代

在元宇宙浪潮的持续推进下&#xff0c;虚拟数字人正逐渐成为连接虚实世界的重要媒介。在展厅展馆中&#xff0c;数字人不仅能够扮演导览员、讲解员角色&#xff0c;更可通过情感化交互提升参观体验&#xff0c;使文化传播更具感染力和沉浸感。虚拟人的引入&#xff0c;为传统展…

轻松Linux-7.Ext系列文件系统

天朗气清&#xff0c;惠风和煦&#xff0c;今日无事&#xff0c;遂来更新。 1.概述 总所周知&#xff0c;我们存的数据都是在一个叫硬盘的东西里面&#xff0c;这个硬盘又像个黑盒&#xff0c;这章就来简单解析一下Linux中文件系统。 现在我们用的大都是固态硬盘&#xff0c;…

Matlab机器人工具箱使用4 蒙特卡洛法绘制工作区间

原理&#xff1a;利用rand随机数&#xff0c;给各个关节设置随机关节变量&#xff0c;通过正运动学得到末端位姿变换矩阵&#xff0c;然后利用变换矩阵2三维坐标标记出末端坐标&#xff0c;迭代多次就可以构成点云。教程视频&#xff1a;【MATLAB机器人工具箱10.4 机械臂仿真教…

【项目】在AUTODL上使用langchain实现《红楼梦》知识图谱和RAG混合检索(三)知识图谱和路由部分

首先在数据集 - 开放知识图谱下载红楼梦的知识图谱&#xff0c;这个网站上有各种各样的知识图谱&#xff0c;可以挑你感兴趣的做( • ̀ω•́ ) 这个知识图谱的作者们已经将三元组抽取出来了&#xff0c;我们可以直接用&#xff0c;如果你对三元组是如何生成的感兴趣&#xf…

pycharm 最新版上一次编辑位置

2025nipycharm方法一&#xff1a;用快捷键&#xff08;最方便&#xff09;跳回上一次编辑位置&#xff1a;Windows/Linux: Ctrl Alt ←macOS: ⌘ Option ←跳到前一次位置&#xff1a;Windows/Linux: Ctrl Alt →macOS: ⌘ Option →方法二&#xff1a;显示工具栏按钮在…

前端性能监控与优化:从 Lighthouse 到 APM

在当今竞争激烈的数字环境中&#xff0c;用户对Web应用性能的要求日益提高。一个缓慢或响应迟钝的应用不仅会流失用户&#xff0c;更可能损害品牌形象和商业价值。因此&#xff0c;前端性能的监控与优化已成为前端开发不可或缺的关键环节。本文将深入探讨从基础的性能评估工具L…

TC_Motion多轴运动-电子齿轮

目录 电子齿轮 【基本概念】 【应用示例】 【开发总结】 END 电子齿轮 【基本概念】 定义:通过软件方法实现机械齿轮的速比调节功能(两个轴成线性比例旋转) 优点 免维护,告别机械损耗 易调节,任意修改齿轮比 精度高,无机械背隙 应用场景 多台电机拖动同一负载,要求多台…

CentOS 7 下载教程

访问阿里云镜像站 阿里巴巴开源镜像站 选择centos 点这个 选择7版本 进入isos目录 点这个 选择这个版本 因为这个镜像的日期更新 推荐下载 DVD 版&#xff1a;包含完整系统和常用软件&#xff0c;无需额外联网安装组件Minimal 版&#xff1a;精简版&#xff0c;仅包含基础系…

MAC在home下新建文件夹报错“mkdir: test: Operation not supported”

在Mac电脑中&#xff0c;home文件夹下不能直接mkdir&#xff0c;sudo 也还是不行&#xff0c;提示“mkdir: test: Operation not supported”。网上找的解决方案不好使&#xff0c;因为没有关闭系统完整性保护关闭系统完整性保护查看SIP当前的状态csrutil status如果是开启状态…

交叉导轨从测试仪到工作台的精密运动控制

在精密仪器领域微米级的运动精度与纳米级的稳定性往往是决定设备性能上限的核心指标。而支撑这一技术鸿沟跨越的&#xff0c;往往隐匿于机械结构的“毫厘之间”——交叉导轨。以下是其在不同精密仪器中的具体应用&#xff1a;光学测试仪&#xff1a;光学测试仪主要用于各种高精…

内网穿透的应用-Navidrome与cpolar本地搭建跨网络访问的云音乐服务器

文章目录前言1. 安装Docker2. 创建并启动Navidrome容器3. 公网远程访问本地Navidrome3.1 内网穿透工具安装3.2 创建远程连接公网地址3.3 使用固定公网地址远程访问前言 音乐收藏存在平台版权限制、音质压缩和访问不便等问题。Navidrome 开源音乐服务器与 cpolar 内网穿透服务的…

FastAPI 访问不了API文档或配置不生效的解决方法

FastAPI中文教程 本文背景 FastAPI框架自带交互式api文档,通过路由/docs或者/redoc 访问&#xff0c;但是FastAPI 的文档界面&#xff08;如 /docs 和 /redoc&#xff09;依赖于外部的 JavaScript 和 CSS 库&#xff0c;如果项目部署环境网络不佳或者无法访问外网的时候&…

IAR 集成开发环境入门指南:字体设置与调试实战

一、IAR 的基本使用教程1. IAR 颜色字体大小设置打开设置路径&#xff1a;点击顶部菜单栏 Tools → 选择 Options&#xff0c;打开 IDE 配置窗口。进入字体颜色设置界面&#xff1a;在弹出的 “IDE Options” 窗口中&#xff0c;双击展开 Editor 选项&#xff0c;然后点击 Colo…

10:00开始面试,10:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,这…

Flink 状态管理的核心能力

我们来看一个复杂的实际案例&#xff1a;阿里巴巴菜鸟的实时物流追踪系统。 该系统处理来自多个电商平台&#xff08;天猫、淘宝、速卖通&#xff09;的订单包裹&#xff0c;通过一个复杂的处理流程&#xff1a; 合并与去重&#xff1a;通过聚合操作将不同来源的订单合并并去重…

基于go语言的云原生TodoList Demo 项目,验证云原生核心特性

以下是一个基于 Go 语言 的云原生 TodoList Demo 项目&#xff0c;涵盖 容器化、Kubernetes 编排、CI/CD、可观测性、弹性扩缩容 等核心云原生特性&#xff0c;代码简洁且附详细操作指南&#xff0c;适合入门学习。项目概览 目标&#xff1a;实现一个支持增删改查&#xff08;C…