@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.mzph.cn/news/890797.shtml

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

相关文章

Python vs PHP:哪种语言更适合网页抓取

本文将比较 Python 和 PHP&#xff0c;以帮助读者确定哪种语言更适合他们的需求。文章将探讨两种语言的优点和缺点&#xff0c;并根据读者的经验水平分析哪种语言可能更容易上手。接下来&#xff0c;文章将深入探讨哪种语言在抓取网页数据方面更胜一筹。 简而言之&#xff0c;…

python+reportlab创建PDF文件

目录 字体导入 画布写入 创建画布对象 写入文本内容 写入图片内容 新增页 画线 表格 保存 模板写入 创建模板对象 段落及样式 表格及样式 画框 图片 页眉页脚 添加图形 构建pdf文件 reportlab库支持创建包含文本、图像、图形和表格的复杂PDF文档。 安装&…

打造两轮差速机器人fishbot:从零开始构建移动机器人

大家好&#xff0c;我是梦笔生花&#xff0c;我们一起来动手创建一个两轮差速的移动机器人fishbot。 机器人除了雷达之外&#xff0c;还需要IMU加速度传感器以及可以驱动的轮子&#xff0c;我们曾介绍过机器人学部分&#xff0c;曾对两差速模型进行过介绍&#xff0c;所以我们…

Python函数(十二):函数的创建和调用、参数传递、返回值

前言&#xff1a;在编程的世界里&#xff0c;函数是一种基本的构建块&#xff0c;它允许我们将代码封装成可重复使用的单元。在Python中&#xff0c;函数的使用尤为重要&#xff0c;因为它不仅有助于代码的模块化&#xff0c;还提高了代码的可读性和可维护性。本章节&#xff0…

UE5 崩溃问题汇总!!!

Using bundled DotNet SDK version: 6.0.302 ERROR: UnrealBuildTool.dll not found in "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" 在你遇到这种极奇崩溃的BUG &#xff0c;难以解决的时候。 尝试了N种方法&#xff0c;都不行的解决方法。…

nginx Rewrite 相关功能

一、Nginx Rewrite 概述 定义 Nginx 的 Rewrite 模块允许对请求的 URI 进行重写操作。它可以基于一定的规则修改请求的 URL 路径&#xff0c;然后将请求定向到新的 URL 地址&#xff0c;这在很多场景下都非常有用&#xff0c;比如实现 URL 美化、网站重构后的 URL 跳转等。主要…

GA-Kmeans-Transformer时序聚类+状态识别组合模型

创新研究亮点&#xff01;GA-Kmeans-Transformer时序聚类状态识别组合模型 目录 创新研究亮点&#xff01;GA-Kmeans-Transformer时序聚类状态识别组合模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.创新研究亮点&#xff01;GA-Kmeans-Transformer时序聚类状态识…

最新的强大的文生视频模型Pyramid Flow 论文阅读及复现

《PYRAMIDAL FLOW MATCHING FOR EFFICIENT VIDEO GENERATIVE MODELING》 论文地址&#xff1a;2410.05954https://arxiv.org/pdf/2410.05954 项目地址&#xff1a; jy0205/Pyramid-Flow&#xff1a; 用于高效视频生成建模的金字塔流匹配代码https://github.com/jy0205/Pyram…

阻塞队列BlockingQueue实战及其原理分析

1. 阻塞队列介绍 1.1 队列 是限定在一端进行插入&#xff0c;另一端进行删除的特殊线性表。先进先出(FIFO)线性表。允许出队的一端称为队头&#xff0c;允许入队的一端称为队尾。 数据结构演示网站&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.ht…

hadoop搭建

前言 一般企业中不会使用master slave01 slave02来命名 vmware创建虚拟机 打开vmware软件&#xff0c;新建虚拟机 典型 稍后安装系统 选择centos7 虚拟机名称和安放位置自行选择&#xff08;最小化安装消耗空间较少&#xff09; 默认磁盘大小即可 自定义硬件 选择centos7的i…

测试 - 1 ( 9000 字详解 )

一&#xff1a; 测试入门 测试是指运用特定的方法、手段或工具&#xff0c;对某一对象进行验证、检查或评估&#xff0c;判断其是否符合预期标准或目标。例如&#xff0c;修理好一盏灯后通过按开关测试其是否正常工作&#xff1b;通过一次数学测验评估学生对代数知识的掌握程度…

【MATLAB第110期】#保姆级教学 | 基于MATLAB的PAWN全局敏感性分析方法(无目标函数)含特征变量置信区间分析

【MATLAB第110期】#保姆级教学 | 基于MATLAB的PAWN全局敏感性分析方法&#xff08;无目标函数&#xff09;含特征变量置信区间分析 一、介绍 PAWN&#xff08;Probabilistic Analysis With Numerical Uncertainties&#xff09;是一种基于密度的全局敏感性分析&#xff08;Gl…

DX12 快速教程(2) —— 渲染天蓝色窗口

快速导航 新建项目 "002-DrawSkyblueWindow"DirectX 12 入门1. COM 技术&#xff1a;DirectX 的中流砥柱什么是 COM 技术COM 智能指针 2.创建 D3D12 调试层设备&#xff1a;CreateDebugDevice什么是调试层如何创建并使用调试层 3.创建 D3D12 设备&#xff1a;CreateD…

【合作原创】使用Termux搭建可以使用的生产力环境(八)

前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境&#xff08;七&#xff09;-CSDN博客中我们讲到了安装百度网盘、VS Code还有java&#xff0c;这篇我打算讲一下最后的编程&#xff0c;还有输入法相关问题解决。众所周知我的本职工作是Java程序猿&#xff0c;因…

VLMs之Gemma 2:PaliGemma 2的简介、安装和使用方法、案例应用之详细攻略

VLMs之Gemma 2&#xff1a;PaliGemma 2的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年12月4日&#xff0c;PaliGemma 2是一个基于Gemma 2系列语言模型的开源视觉语言模型 (VLM) 家族。PaliGemma 2 通过提供一个规模化、多功能且开源的VLM家族&#xff0c;…

24.12.26 SpringMVCDay01

SpringMVC 也被称为SpringWeb Spring提供的Web框架,是在Servlet基础上,构建的框架 SpringMVC看成是一个特殊的Servlet,由Spring来编写的Servlet 搭建 引入依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc<…

国产 HighGo 数据库企业版安装与配置指南

国产 HighGo 数据库企业版安装与配置指南 1. 下载安装包 访问 HighGo 官方网站&#xff08;https://www.highgo.com/&#xff09;&#xff0c;选择并下载企业版安装包。 2. 上传安装包到服务器 将下载的安装包上传至服务器&#xff0c;并执行以下命令&#xff1a; [rootmas…

Java程序设计,使用属性的选项库,轻松实现商品检索的复杂查询(上)

一、背景 本文我们以某商城的商品检索为例,说一说如何使用属性及选项,实现复杂的逻辑表达式的查询。 先贴图,总结出业务需求。 可以通过一系列属性及选项的组合,过滤出用户想要的商品列表。 1、属性 上文中的品牌、分类、屏幕尺寸、CPU型号、运行内存、机身内存、屏幕材…

机器学习(二)-简单线性回归

文章目录 1. 简单线性回归理论2. python通过简单线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 导入线性回归模块2.6 对测试集进行预测2.7 计算均方误差 J2.8 计算参数 w0、w12.9 可视化训练集拟合结果2.10 可视化测试集拟合结果2.11 保存模型2.12 …

WHAT KAN I SAY?Kolmogorov-Arnold Network (KAN)网络结构介绍及实战(文末送书)

一、KAN网络介绍 1.1 Kolmogorov-Arnold Network (KAN)网络结构的提出 2024年4月&#xff0c;来自MIT、加州理工学院、东北大学等团队的研究&#xff0c;引爆了一整个科技圈&#xff1a;Yes We KAN&#xff01; 这种创新方法挑战了多层感知器(Multilayer Perceptron&#xff…