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

Spring MVC 请求类型注解详解

Spring MVC 请求类型注解详解


1. 核心注解分类

Spring MVC 中的请求处理注解分为以下几类:

类别注解示例作用范围
方法级注解@RequestMapping, @GetMapping方法级别
参数级注解@RequestParam, @RequestBody方法参数
模型/会话注解@ModelAttribute, @SessionAttributes方法或类级别

2. 方法级注解详解
@RequestMapping

功能:定义请求映射规则,支持所有 HTTP 方法。

属性列表

属性说明示例
method指定支持的 HTTP 方法(如 RequestMethod.GET)。method = RequestMethod.POST
value请求路径(可省略,与 path 等效)。value = "/user"path = "/user"
params条件过滤:请求参数需满足指定条件(如 param1, !param2)。params = {"name", "!age"}
headers条件过滤:HTTP 头需满足指定条件(如 User-Agent:Chrome)。headers = "Content-Type=application/json"
consumes限制请求内容类型(如 MediaType.APPLICATION_JSON_VALUE)。consumes = MediaType.APPLICATION_JSON_VALUE
produces限制响应内容类型(如 text/html)。produces = "text/html"

@GetMapping / @PostMapping 等

功能@RequestMapping 的简化版,按 HTTP 方法分类:

  • @GetMapping:对应 method = RequestMethod.GET
  • @PostMapping:对应 method = RequestMethod.POST
  • @PutMapping:对应 method = RequestMethod.PUT
  • @DeleteMapping:对应 method = RequestMethod.DELETE
  • @PatchMapping:对应 method = RequestMethod.PATCH

3. 参数级注解详解
@RequestParam

功能:绑定 URL 查询参数或表单参数到方法参数。

属性列表

属性说明示例
value参数名称(可省略,与 name 等效)。value = "id"name = "id"
required是否必须(默认 true)。required = false
defaultValue参数缺失时的默认值。defaultValue = "0"

示例

@GetMapping("/user")
public String getUser(@RequestParam("id") int userId) { ... }

@PathVariable

功能:绑定 URL 路径中的变量到方法参数。

属性列表

属性说明示例
value路径变量名称。value = "id"
required是否必须(默认 true)。required = false

示例

@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") String userId) { ... }

@RequestBody

功能:将 HTTP 请求体(如 JSON/XML)反序列化为 Java 对象。

属性

  • 无显式属性,直接用于方法参数。
  • 依赖 MappingJackson2HttpMessageConverter(JSON)或自定义转换器。

示例

@PostMapping("/user")
public User createUser(@RequestBody User user) { ... }

@RequestHeader

功能:绑定 HTTP 请求头到方法参数。

属性列表

属性说明示例
value请求头名称。value = "User-Agent"
required是否必须(默认 true)。required = false
defaultValue缺省值。defaultValue = "unknown"

示例

@GetMapping("/headers")
public String getHeaders(@RequestHeader("User-Agent") String userAgent) { ... }

@CookieValue

功能:绑定 Cookie 值到方法参数。

属性列表

属性说明示例
valueCookie 名称。value = "JSESSIONID"
required是否必须(默认 true)。required = false
defaultValue缺省值。defaultValue = "not-set"

示例

@GetMapping("/cookie")
public String getCookie(@CookieValue("theme") String theme) { ... }

4. 模型/会话注解
@ModelAttribute

功能

  1. 方法级:在目标方法执行前预处理模型数据(如填充对象)。
  2. 参数级:将请求参数绑定到 Java 对象。

示例

// 方法级:预加载数据
@ModelAttribute("user")
public User getUser() {
    return new User();
}

// 参数级:绑定参数到对象
@PostMapping("/user")
public String saveUser(@ModelAttribute User user) { ... }
@SessionAttributes

功能:将模型属性存储到 HTTP Session。

属性

  • value:需存储的属性名列表(如 {"user"})。
  • types:需存储的属性类型列表。

示例

@Controller
@SessionAttributes({"user"})
public class UserController { ... }

5. 文件上传注解
@RequestPart

功能:处理多部分请求中的文件或参数(结合 @RequestParam)。

示例

@PostMapping("/upload")
public String uploadFile(@RequestPart("file") MultipartFile file) { ... }

6. 总结表格
注解类型注解名称作用参数示例
方法级@RequestMapping定义请求映射规则(路径、方法、条件等)。method = POST, consumes = "application/json"
HTTP 方法专用@GetMapping仅处理 GET 请求。/user/{id}
参数绑定@RequestParam绑定查询参数或表单参数。@RequestParam("id") int userId
路径变量@PathVariable绑定 URL 路径中的变量。@PathVariable("id") String userId
请求体@RequestBody反序列化请求体为对象。@RequestBody User user
HTTP 头@RequestHeader绑定请求头值。@RequestHeader("User-Agent") String agent
Cookie@CookieValue绑定 Cookie 值。@CookieValue("theme") String theme
模型/会话@ModelAttribute绑定对象或预加载模型数据。@ModelAttribute User user
文件上传@RequestPart处理多部分请求中的文件或参数。@RequestPart("file") MultipartFile file

关键总结

  1. 方法级注解:定义请求路径和条件,优先使用 @GetMapping 等 HTTP 方法专用注解。
  2. 参数级注解:根据数据来源(路径、请求体、请求头等)选择对应注解。
  3. 模型/会话@ModelAttribute 用于对象绑定和预处理,@SessionAttributes 管理会话数据。
  4. 最佳实践
    • 使用 @RequestBody 处理 JSON/XML 请求体。
    • 通过 @RequestParam@PathVariable 精确控制参数来源。
    • 结合 @Valid 注解实现参数校验(需 @ControllerAdvice 处理异常)。

相关文章:

  • Java-多级排序结合thenComparing()
  • 四六级听力考试播音系统:构建播放控制智能化、发射系统双备份、发射功率有冗余、安全稳定可靠的英语四六级听力播音系统使用环境
  • vue-element-plus-admin的安装
  • pytorch小记(十六):PyTorch中的`nn.Identity()`详解:灵活模型设计的秘密武器
  • Linux内核——X86分页机制
  • I/O进程4
  • 动态规划系列一>卡特兰数-不同的二叉搜索树
  • C# 串口通信
  • 全新二手罗德SMCV100B信号发生器SMBV100A
  • 视频融合平台EasyCVR搭建智慧粮仓系统:为粮仓管理赋能新优势
  • 对象的创建方式有哪些?在虚拟机中具体的创建过程是怎样的?
  • Conda使用方法详解
  • SAM: 一切皆可分割
  • NO.82十六届蓝桥杯备战|动态规划-从记忆化搜索到动态规划|下楼梯|数字三角形(C++)
  • 【在团队中有效表达想法的方法】
  • WPF 组件的宽高绑定另一个组件的宽高的指定比值
  • 【RK3588 嵌入式图形编程】-SDL2-扫雷游戏-添加地雷到网格
  • 【11408学习记录】英语语法精析:主从复合句之定语从句完全指南——从规则到实战例句一网打尽
  • 网络安全应急响应之文件痕迹排查:从犯罪现场到数字狩猎的进化论
  • TCP 和 UDP 可以使用同一个端口吗?
  • 网站广告赚钱/百度首页推荐关不掉吗
  • 饿了么网站开发/竞价推广营销
  • 手机客户端网站怎么做/软文代写是什么
  • 外贸b2b电子商务平台/长沙弧度seo
  • 麻城网站开发/如何去推广自己的产品
  • 做愛的网站動漫/怎么申请建立网站