@PathVariable与@RequestParam

@PathVariable@RequestParam 这两个非常重要的 Spring MVC 注解。

这两个注解都是用于从 HTTP 请求中获取参数 ,并将其绑定到控制器方法的参数上,但它们获取参数的位置方式截然不同。


1. @PathVariable("id") Long id

@PathVariable 用于从 URL 的路径中获取参数。

工作原理

当你在 @PutMapping 注解中定义了一个 URL 模板,如 /region-service/{id},其中 {id} 就是一个路径变量。它是 URL 的一部分。

当一个请求发送到 /region-service/100 时:

  1. Spring MVC 会匹配这个 URL 到 @PutMapping("/region-service/{id}")
  2. 它会识别出 URL 中的 100{id} 变量的值。
  3. @PathVariable("id") 注解会告诉 Spring MVC:"请把 URL 路径中名为 id 的那部分的值取出来,转换为 Long 类型,并赋给我这个也叫 id 的方法参数。"
代码中的具体场景

在你的代码中:

  • @PutMapping("/{id}") 定义了一个 RESTful 风格的 URL,例如 http://your-domain.com/api/services/123
  • @PathVariable("id") Long id 会从这个 URL (/123) 中提取出 123 这个值,将其转换为 Long 类型,并传递给 update 方法的 id 参数。这个 id 通常用来唯一标识你要操作的资源(例如,ID 为 123 的服务)。
核心特点
  • 位置:参数位于 URL 路径中。
  • URL 模板 :通过 {变量名}@RequestMapping (或其变体) 中定义。
  • 必需性 :默认情况下是必需的。如果 URL 中缺少这个路径变量,请求会失败(返回 404 Not Found)。如果想让它非必需,可以设置 @PathVariable(required = false)
  • 常见场景:用于 RESTful API 中,标识资源的唯一ID,如查询、更新、删除某个特定资源。

2. @RequestParam("price") BigDecimal price

@RequestParam 用于从 HTTP 请求的查询参数(Query String)中获取参数。

工作原理

查询参数是 URL 中 ? 后面的部分,例如 http://your-domain.com/api/services/123?price=99.99。这里的 price=99.99 就是一个查询参数。

当一个请求发送到上述 URL 时:

  1. @RequestParam("price") 注解会告诉 Spring MVC:"请从请求的查询参数中找到名为 price 的参数。"
  2. 它会获取其值 "99.99"
  3. 然后 Spring MVC 会尝试将这个字符串值转换为 BigDecimal 类型,并赋给方法的 price 参数。
代码中的具体场景

在你的代码中:

  • @RequestParam("price") BigDecimal price 会从请求的 URL 查询参数中获取 price 的值。
  • 对于一个完整的请求 URL http://.../123?price=158.00price 参数的值 "158.00" 会被提取出来,并转换为 BigDecimal 类型,传递给 update 方法。这个 price 就是你想要更新的新价格。
核心特点
  • 位置 :参数位于 URL 的查询字符串中(? 之后)。
  • 键值对 :格式为 ?key1=value1&key2=value2
  • 必需性 :默认情况下是必需的。如果请求中缺少这个参数,Spring MVC 会抛出 MissingServletRequestParameterException 异常(通常导致 400 Bad Request 错误)。你可以通过设置 @RequestParam(required = false) 来使其成为可选参数。
  • 默认值 :可以通过 @RequestParam(defaultValue = "0") 为参数提供一个默认值。
  • 常见场景:用于接收用户通过表单提交、或在 URL 中附加的过滤条件、分页信息、排序方式等非资源标识类的参数。

总结与对比

特性 @PathVariable @RequestParam
参数来源 URL 的路径 URL 的查询字符串 中 (? 之后)
URL 示例 /services/**123** /services?**price=99.99**
用途 通常用于标识一个具体的资源 (如 ID) 通常用于过滤、排序、分页或传递操作的具体数据
必需性 默认必需 默认必需
获取方式 request.getPathInfo() (概念上) request.getParameter("price")

在你的代码中的协同作用

你的 update 方法完美地展示了它们的协同工作:

  • @PathVariable("id") 定位到要修改的具体服务(例如,ID 为 123 的服务)。
  • @RequestParam("price") 传递要修改的新价格(例如,99.99)。

这个设计非常符合 RESTful API 的风格,清晰地分离了"操作的资源"和"操作的内容"。

相关推荐
惊讶的猫4 小时前
探究StringBuilder和StringBuffer的线程安全问题
java·开发语言
jmxwzy4 小时前
Spring全家桶
java·spring·rpc
Halo_tjn4 小时前
基于封装的专项 知识点
java·前端·python·算法
Fleshy数模5 小时前
从数据获取到突破限制:Python爬虫进阶实战全攻略
java·开发语言
像少年啦飞驰点、5 小时前
零基础入门 Spring Boot:从“Hello World”到可上线的 Web 应用全闭环指南
java·spring boot·web开发·编程入门·后端开发
苍煜5 小时前
万字详解Maven打包策略:从基础插件到多模块实战
java·maven
有来技术5 小时前
Spring Boot 4 + Vue3 企业级多租户 SaaS:从共享 Schema 架构到商业化套餐设计
java·vue.js·spring boot·后端
东东5166 小时前
xxx医患档案管理系统
java·spring boot·vue·毕业设计·智慧城市
一个响当当的名号6 小时前
lectrue9 索引并发控制
java·开发语言·数据库
进阶小白猿7 小时前
Java技术八股学习Day30
java·开发语言·学习