@RequestParam和@PathVariable的解释与区别

在 Spring 框架中,@RequestParam@PathVariable都是用于从 HTTP 请求中获取参数的注解,但它们的使用场景和获取参数的方式有所不同。

1. @RequestParam

  • 解释@RequestParam主要用于从 HTTP 请求的查询参数(也就是 URL 中?后面的键值对)中获取参数值。可以把它想象成是在一堆放在 “明面上” 的参数里,按名字找到你需要的那个参数。
  • 举例:假设我们有一个需求,要根据用户输入的用户名来查询用户信息。前端发送的请求 URL 可能是这样的:http://localhost:8080/user?username=tom

后端对应的控制器代码可以这样写:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@GetMapping("/user")public String getUserByUsername(@RequestParam String username) {// 这里根据用户名查询用户信息,简单返回一段提示信息return "查询到用户:" + username;}
}

在这个例子中,@RequestParam注解告诉 Spring 框架,从请求的查询参数中找到名为username的参数,并将其值传递给getUserByUsername方法的username参数。

@RequestParam还有一些其他的用法,比如可以指定参数是否为必填项,以及设置默认值:

@GetMapping("/user")
public String getUserByUsername(@RequestParam(required = false, defaultValue = "anonymous") String username) {return "查询到用户:" + username;
}

这里required = false表示username参数不是必填的,defaultValue = "anonymous"表示如果请求中没有提供username参数,那么username的值将被设置为anonymous

-如果请求参数是用 ? 拼接在 URL 后面,并且在控制器(Controller)中使用实体类来接收这些参数,通常不需要添加 @RequestParam 注解

例如,假设你有一个如下的请求:

http://localhost:8080/user?name=John&age=25

并且你有一个实体类 User 如下:

public class User {private String name;private int age;// getters and setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

你可以在控制器中这样接收:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@GetMappingpublic String getUser(User user) {// 这里可以使用 user 对象进行操作return "User name: " + user.getName() + ", Age: " + user.getAge();}
}

在这个例子中,Spring 会自动将 name 和 age 参数的值分别绑定到 User 类的 name 和 age 属性上,因为它们的名称是匹配的。

-不需要 @RequestParam 的原因

  • 基于约定的自动映射:Spring 框架使用 JavaBean 的属性名称约定,将请求参数名称与实体类的属性名称进行匹配,并自动将请求参数的值设置到相应的属性中。只要请求参数名称和实体类的属性名称完全一致,Spring 就能自动完成映射,无需额外的注解。

-注意事项

  • 参数名称匹配:确保请求参数的名称和实体类的属性名称完全一致,包括大小写。例如,如果请求参数是 firstName,实体类中应该有 private String firstName; 及其相应的 getter 和 setter 方法。
  • 复杂对象:对于嵌套的实体类,Spring 也可以自动进行嵌套绑定。例如,如果 User 类中有一个 Address 类作为属性,请求中可以使用 address.city 这样的参数名称来设置 Address 对象的 city 属性。
  • 日期和特殊类型:对于日期和一些特殊类型,可能需要额外的配置,例如添加日期格式化注解或使用自定义的属性编辑器,以确保 Spring 能正确地将字符串形式的请求参数转换为相应的对象类型。

-如果请求参数的名称和实体类的属性名称不一致怎么办

①. 使用 @RequestParam 注解

  • 解决思路

    • 对于简单的参数,可以直接使用 @RequestParam 注解,将请求参数的名称指定为注解的 value 属性,然后将其赋值给实体类的属性。
  • 示例代码

   @RestControllerpublic class UserController {@GetMapping("/user")public ResponseEntity<?> getUser(@RequestParam("user_name") String userName,@RequestParam("user_age") int age) {User user = new User();user.setUserName(userName);user.setAge(age);return ResponseEntity.ok(user);}}
②使用@ModelAttribute和@RequestParam结合:
   @RestControllerpublic class UserController {@GetMapping("/user")public ResponseEntity<?> getUser(@ModelAttribute UserRequest userRequest) {User user = new User();user.setUserName(userRequest.getUserName());user.setAge(userRequest.getAge());return ResponseEntity.ok(user);}}public class UserRequest {@RequestParam("user_name")private String userName;@RequestParam("user_age")private int age;// getters and setters}

2. @PathVariable

  • 解释@PathVariable用于从 URL 的路径变量中获取参数值。可以把它理解为参数是 URL 路径的一部分,就像是在一条有特定标识的路径上,按标识的位置去提取你想要的参数。
  • 举例:假设我们要根据用户的 ID 来获取用户的详细信息,请求 URL 可能是这样的:http://localhost:8080/user/123,其中123就是用户的 ID。

后端对应的控制器代码可以这样写:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@GetMapping("/user/{id}")public String getUserById(@PathVariable Long id) {// 这里根据用户ID查询用户信息,简单返回一段提示信息return "查询到ID为:" + id + " 的用户信息";}
}

在这个例子中,@PathVariable注解告诉 Spring 框架,从 URL 路径中提取名为id的路径变量,并将其值传递给getUserById方法的id参数。这里{id}就是在 URL 路径中定义的路径变量,它的名字可以自定义,只要和@PathVariable注解引用的名字一致就行。

3. 两者的区别总结

  • 参数位置@RequestParam获取的参数在 URL 的查询字符串中,以key=value的形式存在;@PathVariable获取的参数是 URL 路径的一部分。
  • 使用场景:如果参数是可选的、用于过滤或搜索等操作,通常使用@RequestParam;如果参数是用于定位特定资源,作为资源标识的一部分,通常使用@PathVariable。例如,获取某个用户的详细信息,用户 ID 是唯一标识这个用户资源的,适合用@PathVariable;而如果是要筛选出某个年龄段的用户,年龄参数可以作为查询参数,适合用@RequestParam

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

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

相关文章

K8s 不同层次的进程间通信实现

在 Kubernetes (K8s) 中&#xff0c;不同层次的进程间通信实现方式如下&#xff1a; 1. Pod 内进程间通信 Pod 是 Kubernetes 中的最小部署单元&#xff0c;通常包含一个或多个共享相同网络命名空间的容器。 方式&#xff1a; 使用 localhost 和容器暴露的端口进行通信。共享文…

PH热榜 | 2024-12-26

1. Tutor LMS 3.0 标语&#xff1a;一体化WordPress学习管理系统 介绍&#xff1a;Tutor LMS 3.0焕然一新&#xff0c;内置电商功能和AI工具&#xff0c;让用户可以轻松创建引人入胜的在线课程&#xff0c;管理订阅&#xff0c;并直接在平台上创收。 产品网站&#xff1a; 立…

有没有免费提取音频的软件?音频编辑软件介绍!

出于工作和生活娱乐等原因&#xff0c;有时候我们需要把音频单独提取出来&#xff08;比如歌曲伴奏、人声清唱等、乐器独奏等&#xff09;。要提取音频必须借助音频处理软件&#xff0c;那么有没有免费提取音频的软件呢&#xff1f;下面我们将为大家介绍几款免费软件&#xff0…

C++--------------树

探索 C 中的树结构&#xff1a;从基础到应用 在 C 编程的世界里&#xff0c;树结构是一种非常重要且强大的数据结构&#xff0c;它在许多领域都有着广泛的应用&#xff0c;从简单的数据存储到复杂的算法实现&#xff0c;树结构都展现出了独特的优势。今天&#xff0c;就让我们一…

Python PyMupdf 去除PDF文档中Watermark标识水印

通过PDF阅读或编辑工具&#xff0c;可在PDF中加入Watermark标识的PDF水印&#xff0c;如下图&#xff1a; 该类水印特点 这类型的水印&#xff0c;会在文件的字节流中出现/Watermark、EMC等标识&#xff0c;那么&#xff0c;我们可以通过改变文件字节内容&#xff0c;清理掉…

centos制作离线安装包

目录 1.yumdownloader与repotrack怎么选择&#xff1f; yumdownloader --resolve repotrack 总结 2.环境准备 3.安装 1.yumdownloader与repotrack怎么选择&#xff1f; yumdownloader --resolve 和 repotrack 都是与 YUM&#xff08;Yellowdog Updater Modified&#xf…

C++的内存四区

文章目录 内存四区1.程序运行前1.1 代码区2.1 全局区2.2 示例 2.程序运行后1.1 栈区1.2 堆区 内存四区 1.程序运行前 在程序编译后&#xff0c;生成了exe可执行程序&#xff0c;未执行该程序前分为两个区域。该区域的数据在程序结束后由操作系统释放. 1.1 代码区 ​存放 CPU …

网络工程师常用软件之PING测试工具

老王说网络&#xff1a;网络资源共享汇总 https://docs.qq.com/sheet/DWXZiSGxiaVhxYU1F ☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝ 今天介绍一款好用的PING测试工具&#xff0c;ATKKPING。 ATKKPING的主要功能包括测试…

118.【C语言】数据结构之排序(堆排序和冒泡排序)

目录 1.堆排序 2.冒泡排序 单趟排序的两种情况 情况1.和arr[i]的前一个元素交换,第一次循环结束时i的值为n-1,第二次循环结束时i的值为n-2 情况2.和arr[i]的后一个元素交换,第一次循环结束时i的值为n-2,第二次第一次循环结束时i的值为n-3,... 将单趟排序代码嵌入外循环中…

路由器做WPAD、VPN、透明代理中之间一个

本文章将采用家中TP-Link路由器 路由器进行配置DNS DNS理解知识本文DNS描述参考&#xff1a;网络安全基础知识&中间件简单介绍_计算机网络中间件-CSDN博客 TP LINK未知的错误&#xff0c;错误编号&#xff1a;-22025 TP-LINK 认证界面地址&#xff1a;https://realnam…

Docker部署Sentinel

一、简介 是什么&#xff1a;面向分布式、多语言异构化服务架构的流量治理组件 能干嘛&#xff1a;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 官网地址&#xff1a;https://sentinelguard.io/zh-c…

机器学习之KNN算法预测数据和数据可视化

机器学习及KNN算法 目录 机器学习及KNN算法机器学习基本概念概念理解步骤为什么要学习机器学习需要准备的库 KNN算法概念算法导入常用距离公式算法优缺点优点&#xff1a;缺点︰ 数据可视化二维界面三维界面 KNeighborsClassifier 和KNeighborsRegressor理解查看KNeighborsRegr…

Java包装类型的缓存

Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。 Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128&#xff0c;127] 的相应类型的缓存数据&#xff0c;Character 创建了数值在 [0,127] 范围的缓存数据&#xff0c;Boolean 直接返回 True or Fal…

施耐德变频器ATV320系列技术优势:创新与安全并重

在工业自动化领域&#xff0c;追求高效、安全与智能已成为不可阻挡的趋势。施耐德变频器ATV320系列凭借其强大的设计标准和全球认证&#xff0c;成为能够帮助企业降低安装成本&#xff0c;提高设备性能的创新解决方案。 【全球认证&#xff0c;品质保障】ATV320 系列秉持施耐德…

Excel批量设置行高,Excel表格设置自动换行后打印显示不全,Excel表格设置最合适的行高后打印显示不全,完美解决方案!!!

文章目录 说个问题&#xff08;很严重&#xff01;&#xff01;&#xff01;&#xff09;写个方案会Python看这里Python环境搭建不存在多行合并存在多行合并 不会Python看这里 说个问题&#xff08;很严重&#xff01;&#xff01;&#xff01;&#xff09; 平时处理Excel表格…

洛谷 P1014:Cantor 表

【题目来源】https://www.luogu.com.cn/problem/P1014https://www.acwing.com/problem/content/5510/【题目描述】 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。 他是用下面这一张表来证明这一命题的&#xff1a; 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 …

C语言基础:指针(数组指针与指针数组)

数组指针与指针数组 数组指针 概念&#xff1a;数组指针是指向数组的指针&#xff0c;本质上还是指针 特点&#xff1a; 先有数组&#xff0c;后有指针 它指向的是一个完整的数组 一维数组指针&#xff1a; 语法&#xff1a; 数据类型 (*指针变量名)[行容量][列容量]; 案…

华为管理变革之道:奋斗文化与活力

目录 企业文化是什么&#xff1f; 为什么活下去是华为的文化&#xff1f; 活下来&#xff0c;是华为公司的最低纲领&#xff0c;也是华为公司的最高纲领&#xff01; 资源终会枯竭&#xff0c;唯有文化才能生生不息 企业文化之一&#xff1a;以客户为中心 企业文化之二&a…

JS面试题|[2024-12-26]

1.事件委托是什么 又叫事件代理&#xff0c;原理就是直接利用了事件冒泡的机制来实现&#xff0c;也就是说把子元素的事件绑定到了父元素的身上&#xff0c;如果子元素阻止了事件冒泡&#xff0c;那么委托也就不成立了。 阻止事件冒泡&#xff1a;event.stopPropagation() addE…

upload-labs关卡记录12

直接上传一句话木马&#xff0c;发现提示&#xff1a; 很明显这是一个白名单&#xff0c;而且不是前端的js检查&#xff0c;而是服务端的检查&#xff0c;因此我们使用bp抓包&#xff0c;改一下文件类型试试&#xff1a; 找到包之后&#xff0c;我们对content-type进行一个更改…