当前位置: 首页 > ds >正文

Web层注解

注解名称所属模块功能描述引入年份版本是否推荐使用分类
@RequestParamspring-webmvcHTTP请求参数绑定到方法参数2004Spring 1.0推荐参数绑定
@PathVariablespring-webmvc提取 URI 中的路径变量2009Spring 3.0推荐参数绑定
@RequestBodyspring-webmvc将请求体反序列化为对象(如 JSON/XML)2009Spring 3.0推荐参数绑定
@CookieValuespring-webmvc获取 Cookie 值2009Spring 3.0推荐参数绑定
@RequestHeaderspring-webmvc获取请求头信息2009Spring 3.0推荐参数绑定
@MatrixVariablespring-webmvc支持 URL 矩阵变量解析2013Spring 3.2推荐(RESTful API 可选)参数绑定
@RequestMappingspring-webmvc映射 HTTP 请求到控制器方法(支持所有 HTTP 方法)2004Spring 1.0推荐(但建议优先使用更具体的注解)请求映射
@GetMappingspring-webmvc映射 HTTP GET 请求2015Spring 4.3推荐(语义清晰)请求映射
@PostMappingspring-webmvc映射 HTTP POST 请求2015Spring 4.3推荐请求映射
@PutMappingspring-webmvc映射 HTTP PUT 请求2015Spring 4.3推荐请求映射
@PatchMappingspring-webmvc映射 HTTP PATCH 请求2015Spring 4.3推荐请求映射
@DeleteMappingspring-webmvc映射 HTTP DELETE 请求2015Spring 4.3推荐请求映射
@ResponseStatusspring-webmvc设置 HTTP 响应状态码2009Spring 3.0推荐返回处理
@ResponseBodyspring-webmvc将返回值序列化为响应体(如 JSON/XML)2009Spring 3.0推荐(常用于 REST 控制器)返回处理
@InitBinderspring-webmvc初始化 WebDataBinder,用于自定义数据绑定2004Spring 1.0推荐(用于参数格式化)全局处理与异常
@ExceptionHandlerspring-webmvc处理控制器内的异常2009Spring 3.0推荐(配合 @ControllerAdvice 使用)全局处理与异常
@ControllerAdvicespring-webmvc全局异常处理和数据绑定2013Spring 3.2推荐全局处理与异常
@SessionAttributesspring-webmvc在会话中存储模型属性2004Spring 1.0不推荐(Spring Boot 中不推荐使用)其他功能
@CrossOriginspring-webmvc启用跨域请求支持2015Spring 4.2推荐(开发环境可用,生产建议配置 CORS Filter)其他功能

参数绑定

[Q&A] @RequestParam 引入背景
在早期的 Java Web 开发中(如使用 Servlet API),开发者需要通过 HttpServletRequest 手动获取请求参数:

String name = request.getParameter("name");

为了提升开发效率和代码可读性,Spring 在其 Web 模块中引入了 @RequestParam 注解,使得控制器方法可以直接声明参数并自动绑定请求值。

[Q&A] @PathVariable 引入背景
在 RESTful 风格的 Web API 设计中,URL 通常包含具有语义的路径变量(Path Variable),例如:

/products/456/details → 代表资源 ID 或其他关键信息

在 Spring 3.0 之前,开发者需要通过 HttpServletRequest 手动解析路径变量,为了解决这些问题,Spring 在 3.0 版本 中引入了 @PathVariable 注解,使得控制器方法可以直接声明路径变量作为方法参数,并由框架自动完成绑定。

[Q&A] @RequestBody 引入背景
在 Spring 3.0 之前,开发者如果想从请求体中读取数据(例如处理 POST 请求中的 JSON 数据),需要手动操作 HttpServletRequest 的输入流,并使用第三方库(如 Jackson、Gson)进行反序列化:

BufferedReader reader = request.getReader();
String json = reader.readLine();
User user = new ObjectMapper().readValue(json, User.class);

为了简化这一过程,提高开发效率和可维护性,Spring 在 3.0 版本 中引入了 @RequestBody 注解,配合 HttpMessageConverter 接口,实现了自动将请求体内容转换为 Java 对象的能力。

[Q&A] @CookieValue 引入背景
在 Web 开发中,Cookie 是客户端与服务端之间维持状态的一种常见机制,在早期的 Servlet 开发中,开发者需要手动从 HttpServletRequest 获取 Cookie,并遍历查找目标 Cookie 值:

Cookie[] cookies = request.getCookies();
if (cookies != null) {for (Cookie cookie : cookies) {if ("auth_token".equals(cookie.getName())) {String token = cookie.getValue();// 使用 token...}}
}

为了解决这些问题,Spring 在 3.0 版本中引入了 @CookieValue 注解,使得控制器方法可以直接声明要获取的 Cookie 名称,并由框架自动注入对应的值。

[Q&A] @RequestHeader引入背景
在传统的 Web 开发中,HTTP 请求头(Request Headers)是客户端与服务端通信的重要组成部分,常用于传递元信息,在 Spring 3.0 之前,开发者需要手动从 HttpServletRequest 中获取请求头信息:

String contentType = request.getHeader("Content-Type");

为了解决这些问题,Spring 在 3.0 版本中引入了 @RequestHeader 注解,使得控制器方法可以直接声明要获取的请求头名称,并由框架自动注入对应的值。

[Q&A] @MatrixVariable 引入背景
HTTP URI 中的 Matrix 参数是什么?
Matrix参数是一种在 URI 路径段中嵌入键值对的方式。它不是查询参数(Query Parameters),而是直接出现在路径段中,格式如下:

/bookstore;color=red;price=100

color=red 和 price=100 是两个 Matrix 参数。它们属于路径段 /bookstore,而不是整个 URL 的查询字符串。
在没有 @MatrixVariable 之前,开发者需要手动解析 URI 或使用 HttpServletRequest 获取原始 URI 并拆分路径段,代码复杂且容易出错。

String uri = request.getRequestURI();
// 手动解析 matrix 参数...

请求映射

[Q&A] @RequestMapping 引入背景
在 Spring 2.5 之前,开发者通常通过以下方式处理 HTTP 请求:
1、实现 Controller 接口(如 AbstractController、SimpleFormController 等)

public class HelloController implements Controller {public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {// 处理逻辑}
}

2、在 XML 配置文件中定义 URL 映射关系

<bean name="/hello.htm" class="com.example.HelloController"/>

为了解决上述问题,Spring Framework 2.5 引入了基于注解的控制器编程模型,其中 @RequestMapping 是最核心的注解之一。

[Q&A] @GetMapping @PostMapping @PutMapping @DeleteMapping @PatchMapping 引入背景
在 Spring 4.3 之前,开发者需要使用 @RequestMapping 并指定 method = RequestMethod.XXX 来限制请求方法:

@RequestMapping(value = "/users", method = RequestMethod.GET)
public String listUsers() {return "user-list";
}

为了解决这些问题,Spring Framework 4.3 引入了这些专门的注解,使代码更加语义化和简洁。

注解适用场景是否常用所属模块功能引入年份版本是否推荐使用返回状态码(常规)返回值介绍(默认行为)
@GetMapping查询资源✔️ 高频使用spring-webmvc映射 HTTP GET 请求2015Spring 4.3✔️ 推荐(语义清晰)200 OK(成功查询)通常返回 JSON/XML 或视图渲染结果(视配置而定)
@PostMapping创建资源✔️ 高频使用spring-webmvc映射 HTTP POST 请求2015Spring 4.3✔️ 推荐201 Created(成功创建)可返回新增资源详情(如 ID、完整数据)
@PutMapping全量更新✔️ 中高频spring-webmvc映射 HTTP PUT 请求2015Spring 4.3✔️ 推荐200 OK(更新成功)/ 204 No Content(无内容返回)返回更新后完整资源或空(按需设计)
@PatchMapping部分更新⚠️ 视需求而定spring-webmvc映射 HTTP PATCH 请求2015Spring 4.3✔️ 推荐(需 REST 规范场景)200 OK(更新成功)通常返回部分更新后的资源片段或状态确认
@DeleteMapping删除资源✔️ 高频使用spring-webmvc映射 HTTP DELETE 请求2015Spring 4.3✔️ 推荐204 No Content(删除成功,无内容返回)一般无返回体(或返回删除确认消息)

返回处理

[Q&A] @ResponseStatus 引入背景
在传统的 MVC 应用中,通常只关注页面跳转或简单的成功/失败响应,HTTP 状态码的作用并不突出。但随着 RESTful API 的普及,客户端(如前端、移动端)越来越依赖于明确的 HTTP 状态码来判断请求结果,例如:
200 OK:成功获取资源
201 Created:资源创建成功
404 Not Found:资源不存在
500 Internal Server Error:服务端异常
因此,Spring 需要一种更清晰的方式来为每个控制器方法指定返回的状态码。
在没有 @ResponseStatus 之前,开发者需要通过 HttpServletResponse 或 ResponseEntity 手动设置状态码,这会增加代码复杂度,降低可读性。

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {return new ResponseEntity<>(userService.save(user), HttpStatus.CREATED);
}

而使用 @ResponseStatus 可以将状态码语义直接绑定到方法上,提升代码简洁性和可维护性。

[Q&A] @ResponseBody 引入背景
在传统的 Spring MVC 应用中,控制器方法通常返回的是视图名称(如 JSP 页面),例如:

@GetMapping("/users")
public String listUsers(Model model) {model.addAttribute("users", userService.findAll());return "userList"; // 返回视图名
}

但随着前端框架(如 Vue、React、Angular)的发展,前端和后端逐渐分离,后端只需提供数据接口(JSON 格式),不再负责页面渲染。在没有 @ResponseBody 之前,开发者需要手动将对象转为 JSON 字符串并写入 HttpServletResponse:

@GetMapping("/users")
public void getAllUsers(HttpServletResponse response) throws IOException {List<User> users = userService.findAll();String json = new ObjectMapper().writeValueAsString(users);response.getWriter().write(json);
}

这种方式繁琐且容易出错,所以引入了 @ResponseBody。
@ResponseBody 告诉 Spring:“这个方法返回的数据不是视图名,而是直接写入 HTTP 响应体的内容。”
Spring 会根据客户端请求头中的 Accept 内容选择合适的 HttpMessageConverter(如 Jackson 来处理数据格式,比如:
application/json → Jackson
application/xml → JAXB 或 Jackson XML 扩展

全局处理与异常

[Q&A] @InitBinder 引入背景
@InitBinder 是为了解决:Spring 自动绑定参数时,有些数据你希望它“按你的规则”来处理,而不是 Spring 默认的方式。比如:
1、把 “2024-03-15” 转成 Date 类型
2、不允许绑定 isAdmin 字段
3、给这个对象加一个验证器(比如检查 name 是否为空)

[Q&A] @ExceptionHandler 引入背景
在没有 @ExceptionHandler 之前,开发者通常会在每个控制器方法中使用 try-catch 来处理异常:

@GetMapping("/user/{id}")
public String getUser(@PathVariable Long id, Model model) {try {User user = userService.findById(id);model.addAttribute("user", user);return "user-detail";} catch (UserNotFoundException ex) {model.addAttribute("error", "用户不存在");return "error-page";}
}

典型用法

spring-webmvc @RequestParam 典型用法
spring-webmvc @PathVariable 典型用法
spring-webmvc @RequestBody 典型用法
spring-webmvc @CookieValue 典型用法
spring-webmvc @RequestHeader 典型用法
spring-webmvc @MatrixVariable 典型用法
spring-webmvc @RequestMapping @GetMapping @PostMapping @PutMapping @DeleteMapping @PatchMapping 典型用法
spring-webmvc @ResponseStatus 典型用法
spring-webmvc @ResponseBody 典型用法
spring-webmvc @InitBinder 典型用法

http://www.xdnf.cn/news/14808.html

相关文章:

  • 南北差异之——理解业务和理解产品
  • spring中的@Cacheable缓存
  • Python零基础入门到高手8.5节: 实现选择排序算法
  • 个人博客网站(halo)在云服务器的快速部署
  • 深入学习入门--(一)前备知识
  • 创客匠人联盟生态:重构家庭教育知识变现的底层逻辑
  • spring boot项目整合百度翻译
  • MySQL之SQL性能优化策略
  • Serverless架构下的OSS应用:函数计算FC自动处理图片/视频转码(演示水印添加+缩略图生成流水线)
  • 15.OCR训练
  • 宝塔服务器调优工具 1.1(Opcache优化)
  • day041-web集群架构搭建
  • 轨迹降噪API及算法
  • SQL Server 查询数据库及数据文件大小
  • 利用folium实现全国高校分布地图显示
  • 【深度学习】-学习篇(一)
  • MySQL深分页性能瓶颈:问题分析与解决方案
  • 第十节 新特性与趋势-CSS层叠规则升级
  • 第九节 CSS工程化-预处理技术对比
  • 【TCL 脚本学习 4 -- tcl 脚本 数组定义和使用】
  • 基于 SpringBoot+JSP 的医疗预约与诊断系统设计与实现
  • 【第二章:机器学习与神经网络概述】03.类算法理论与实践-(1)逻辑回归(Logistic Regression)
  • 【软考高级系统架构论文】论边缘计算及其应用
  • 秋招Day14 - MySQL - 事务
  • [HTML]iframe显示pdf,隐藏左侧分页
  • 亚矩云手机赋能Vinted矩阵运营:破解二手电商多账号与本地化困局
  • 前端面试记录
  • 代码随想录|单调栈|04接雨水
  • SpringBoot中使用表单数据有效性检验
  • UE5 闪烁的光斑