Spring MVC 四种核心传参形式详解

目录

[一、路径参数:参数直接来自 URL 路径](#一、路径参数:参数直接来自 URL 路径)

[1. 什么是路径参数](#1. 什么是路径参数)

[2. 使用方式](#2. 使用方式)

[3. 特点与适用场景](#3. 特点与适用场景)

[二、请求参数:来自 URL 或表单的 key-value 参数](#二、请求参数:来自 URL 或表单的 key-value 参数)

[1. 什么是请求参数](#1. 什么是请求参数)

[2. 使用方式](#2. 使用方式)

[3. 特点与适用场景](#3. 特点与适用场景)

[三、请求体参数:来自 HTTP Request Body 的结构化数据](#三、请求体参数:来自 HTTP Request Body 的结构化数据)

[1. 什么是请求体参数](#1. 什么是请求体参数)

[2. 使用方式](#2. 使用方式)

[3. 特点与适用场景](#3. 特点与适用场景)

四、对象参数:请求参数的自动封装

[1. 什么是对象参数](#1. 什么是对象参数)

[2. 使用方式](#2. 使用方式)

[3. 底层原理说明](#3. 底层原理说明)

五、一个非常容易混淆的点

六、四种传参形式对比总结

七、总结


在使用 Spring MVC 编写接口时,我们几乎每天都在和"参数"打交道。

路径参数、请求参数、JSON、对象接收......看起来方式很多,但如果只停留在"记注解",很容易越学越乱。

事实上,从参数来源 的角度来看,Spring MVC 中绝大多数的传参方式都可以归纳为 四种核心形式路径参数、请求参数、请求体参数、对象参数

理解这四类参数的来源和适用场景,基本就掌握了 Spring MVC 80% 的参数接收机制。

一、路径参数:参数直接来自 URL 路径

1. 什么是路径参数

路径参数是 URL 路径本身的一部分,通常用于表示某个具体资源。

GET /users/1

其中的 1,就是一个典型的路径参数。

2. 使用方式

java 复制代码
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
    return userService.getById(id);
}

3. 特点与适用场景

  • 参数嵌入在 URL 中,语义清晰
  • 符合 RESTful 设计风格
  • 通常用于资源的定位

常见场景:

  • 根据 id 查询详情
  • 根据 id 删除资源

二、请求参数:来自 URL 或表单的 key-value 参数

1. 什么是请求参数

请求参数通常以 key=value 的形式出现,存在于 URL 查询串或表单数据中。

GET /users?name=zhangsan&age=18

2. 使用方式

java 复制代码
@GetMapping("/users")
public List<User> list(
        @RequestParam String name,
        @RequestParam Integer age) {
    return userService.list(name, age);
}

3. 特点与适用场景

  • 参数形式简单、直观
  • 适合可选参数较多的场景
  • 不具备强结构性

常见场景:

  • 条件查询
  • 分页、排序参数

三、请求体参数:来自 HTTP Request Body 的结构化数据

1. 什么是请求体参数

请求体参数来源于 HTTP 请求体,通常是 JSON 格式,前后端分离项目中非常常见。

{

"name": "zhangsan",

"age": 18

}

2. 使用方式

java 复制代码
@PostMapping("/users")
public void save(@RequestBody User user) {
    userService.save(user);
}

3. 特点与适用场景

  • 数据结构清晰、层次分明
  • 通常用于 POST、PUT 请求
  • 依赖 HttpMessageConverter 进行解析

常见场景:

  • 新增数据
  • 更新数据
  • 前后端分离接口

四、对象参数:请求参数的自动封装

1. 什么是对象参数

对象参数并不是单独的一种数据来源,而是 Spring MVC 将请求参数自动绑定为 Java 对象的结果

POST /users

name=zhangsan&age=18

2. 使用方式

java 复制代码
@PostMapping("/users")
public void save(User user) {
    userService.save(user);
}

3. 底层原理说明

Spring 会根据以下规则进行自动绑定:

  • 请求参数名
  • 对象属性名
  • 对应的 setter 方法

只要三者匹配,就可以完成自动封装。

这是 Spring MVC 非常"无感但强大"的能力。

五、一个非常容易混淆的点

对象参数 ≠ 请求体参数

很多人容易把下面两种写法混为一谈:

java 复制代码
public void save(User user)              // 对象参数(来自请求参数)
public void save(@RequestBody User user) // 请求体参数(来自 JSON)

关键区别在于:

  • 是否使用 @RequestBody
  • 参数来自请求参数,还是请求体

这一点在实际开发中非常重要。

六、四种传参形式对比总结

类型 参数来源 典型注解 常见场景
路径参数 URL 路径 @PathVariable 资源定位
请求参数 URL / 表单 @RequestParam 条件查询
请求体参数 Request Body @RequestBody JSON 提交
对象参数 请求参数封装 无 / @ModelAttribute 表单提交

七、总结

Spring MVC 的传参,本质是根据"参数来源不同",选择不同的解析与绑定方式。

相关推荐
Raas1003 分钟前
大模型网关和API网关区别是什么?MAI Gateway统一AI流量治理
java·大数据·运维·人工智能·gateway·企业级·ai网关
BioRunYiXue12 分钟前
RACE技术全攻略:从全长克隆到靶基因验证
java·javascript·网络·人工智能·科技·算法·eclipse
AC赳赳老秦21 分钟前
个保法下数据处理:OpenClaw 自动过滤公开数据中的个人信息,保障采集分析合规性
java·python·sqlite·json·php·deepseek·openclaw
rannn_11128 分钟前
Java 后端面试题总结:点赞功能怎么实现?
java·后端·面试
CodeStats39 分钟前
【Java进程通信】Java进程通信系统完全指南:从ProcessBuilder底层原理到多语言实战
java·前端·python·进程·ai编程·processbuilder
绿智校园41 分钟前
物联网平台选型指南:为什么底层协议自研比云端SDK接入更可靠?
java·物联网·struts
T011561841 分钟前
艺培场馆课时预约小程序用户端 & 后台联动踩坑上篇(预约、课时、缓存、消息、学员端自身问题)
java·缓存·小程序·bug·全栈项目实战手记·艺培课时系统‘’
长谷深风11144 分钟前
AI Agent 踩坑:盲目重试会把小故障炸成系统灾难
java·大数据·ai·agent·ai agent·工具调用·agent设计
evans在进步1 小时前
Spring Boot 核心机制详解:自动装配、事件监听、异步任务与请求映射
java·spring boot·后端
Zane19941 小时前
HashSet、TreeSet、LinkedHashSet:底层都是"套壳"
java·后端