@RequestParam和@PathVariable的用法与区别

2023-10-27

SpringBoot——@PathVariable

URL变量

Web应用中的URL通常不是一成不变的,例如微博两个不同用户的个人主页对应两个不同的URL:http://weibo.com/user1http://weibo.com/user2。我们不能对于每一个用户都编写一个被@RequestMapping注解的方法来处理其请求,也就是说,对于相同模式的URL(例如不同用户的主页,他们仅仅是URL中的某一部分不同,为他们各自的用户名,我们说他们具有相同的模式)。

定义URL变量规则

可以在@RequestMapping注解中用{ }来表明它的变量部分,例如:

@RequestMapping(value="/user/{username}")

这里的{username}就是我们定义的变量规则,username是变量的名字,那么这个URL路由可以匹配下列任意URL并进行处理:

  • /user/Tom
  • /user/Jerry
  • /user/Jack2

需要注意的是,在默认情况下,变量中不可以包含URL的分隔符/,例如路由不能匹配/user/Denny/Jon,即使你认为Denny/Jon是一个存在的用户名。

获取URL变量

在路由中定义变量规则后,通常我们需要在处理方法(也就是@RequestMapping注解的方法)中获取这个URL的具体值,并根据这个值(例如用户名)做相应的操作,SpringMVC提供的@PathVariable可以帮助我们:

@RequestMapping(value="/user/{username}")
    public String userProfile(@PathVariable(value="username") String username) {
    	return "user"+username;
    }

在上面的例子中,当@Controller处理HTTP请求时,userProfile的参数username会自动设置为URL中对应变量username(同名赋值)的值。例如,当HTTP请求为/user/fpc,URL变量username的值fpc就会被赋值给函数参数username,函数的返回值是userfpc。

在默认情况下,Spring会对@PathVariable注解的变量进行自动赋值,也可以指定@PathVariable使用哪一个URL中的变量:

@RequestMapping(value = "user/{username}")
    public String userProfile(@PathVariable(value="username") String username) {
    	return "user"+username;
    }

运行结果:

定义多个URL变量 

 可以定义URL路由,其中包含多个URL变量:

@RequestMapping(value = "/user/{username}/blog/{blogId}")
    public String getUserBlog(@PathVariable String username, @PathVariable int blogId) {
    	return "user:" + username + "blog->" + blogId;
    }

 这种情况下,Spring能够根据名字自动赋值对应的函数参数值,当然也可以在@PathVariable中显示地表明具体的URL变量值。

在默认情况下,@PathVariable注解的参数可以是一些基本的简单类型:int,long,Date,String等,Spring能够根据URL变量的具体值及函数参数类型来进行转换。例如/user/fpc/blog/1,会将fpc的值赋给username,而1赋给int变量blogId。

运行结果:

匹配正则表达式

 很多时候,需要对URL变量进行更加精确的定义。例如,用户名只可能包含大小写字母,数字,下划线,我们希望:

  • /user/fpc是一个合法的URL
  • /user/#$$$则是一个不合法的URL

除了简单地定义{username}变量,还可以定义正则表达式进行更精确地控制,定义语法是{变量名: 正则表达式}。[a-zA-Z0-9_]+是一个正则表达式,表示只能包含小写字母,大写字母,数字,下划线。如此设置URL变量规则后,不合法的URL则不会被处理,直接由SpringMVC框架返回404NotFound。

@RequestMapping(value = "/user/{username: [a-zA-Z0-9]+}/blog/{blogId}")

 

SpringBoot——@RequestParam

Request参数

 在访问各种各样的网站时,经常会发现网站的URL的最后一部分形如:?xx=yy&zz=ww。这就是HTTP协议中的Request参数,它有什么用呢?先看一个例子:

这里的type=content&q=web就是搜索请求的参数,不同参数之间用&分隔,每个参数形如name=value的形式,分别表示参数名字和参数值。在这个例子中,我们输入不同的搜索关键词,在搜索结果页面的URL的q参数是不同的。也就是说,HTTP参数实际上可以认为是一种用户的输入,根据不同的用户输入,服务器经过处理后返回不同的输出(例如搜索spring和搜索java,显示结果是不一样的)。

Spring MVC中的Request参数

 在SpringMVC框架中,可以通过定义@RequestMapping来处理URL请求。和@PathVariable一样,需要在处理URL的函数中获取URL中的参数,也就是?key1=value1&key2=value2这样的参数列表。通过注解@RequestParam可以轻松地将URL中的参数绑定到处理函数方法的变量中:

@RequestMapping(value="/user")
	public String getUserBlog(@RequestParam(value="id") int blogId) {
		return "blogId="+blogId;
	}

 这样,当我们访问/user/?id=123时,SpringMVC帮助我们将Request参数id的值绑定到了处理函数的参数blogId上。这样就能够轻松获取用户输入,并根据它的值进行计算并返回了。

运行结果:

 

@RequestParam和@PathVariable

 相同点与区别

 @RequestParam和@PathVariable都能够完成类似的功能——因为本质上,它们都是用户的输入,只不过输入的部分不同,一个在URL路径部分,另一个在参数部分。要访问一篇博客文章,这两种URL设计都是可以的:

  • 通过@PathVariable,例如/blogs/1
  • 通过@RequestParam,例如blogs?blogId=1

那么究竟应该选择哪一种呢?建议:

1、当URL指向的是某一具体业务资源(或资源列表),例如博客,用户时,使用@PathVariable

2、当URL需要对资源或者资源列表进行过滤,筛选时,用@RequestParam

例如我们会这样设计URL:

  • /blogs/{blogId}
  • /blogs?state=publish而不是/blogs/state/publish来表示处于发布状态的博客文章

更多用法

 一旦我们在方法中定义了@RequestParam变量,如果访问的URL中不带有相应的参数,就会抛出异常——这是显然的,Spring尝试帮我们进行绑定,然而没有成功。但有的时候,参数确实不一定永远都存在,这时我们可以通过定义required属性:

@RequestParam(value = "id", required = false)

当然,在参数不存在的情况下,可能希望变量有一个默认值:

@RequestParam(value = "id", required = false, defaultValue = "0")

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@RequestParam和@PathVariable的用法与区别 的相关文章

  • Flutter学习之旅(五)----网络请求获取数据、解析数据和显示等待动画

    参考官方文章 英文版 网络请求是APP开发中至关重要的一步 回想一下Android开发中的Retrofit框架或者Volley框架 iOS开发中AFNetworking框架 如果使用Volley进行网络请求 我们需要new一个StringR
  • 内网穿透Neo-reGeorg的使用

    内网穿透Neo reGeorg的使用 网络 拓扑图使用环境 目标机不出网 可以在边界服务器上设置代理 这里kali就可以通过代理访问目标机的整个内网网段 reGeorg简介 reGeorg是一个内网穿透工具 基于socks5 而且支持众多脚
  • 服务器物理内存90%怎么办,服务器物理内存使用率90以上

    服务器物理内存使用率90以上 内容精选 换一换 数据库安全审计的审计日志存放在日志数据库中 日志的处理机制说明如下 当日志数据库的磁盘空间使用率达到85 及以上时 系统将自动循环删除存放时间最久的审计日志 每次删除一天的审计日志 直至磁盘空
  • SpringBoot与Shiro整合

    一 Shiro 体系结构 Apache Shiro是一个强大且易用的Java安全框架 执行身份验证 授权 密码和会话管理 使用Shiro的易于理解的API 您可以快速 轻松地获得任何应用程序 从最小的移动应用程序到最大的网络和企业应用程序
  • 网页登录出错DNS_PROBE_FINISHED_BAD_CONFIG,QQ登录正常。解决方法!

    某天上着QQ网课 结果突然被卡出来了 心里mmp 重新登录 想浏览一下网站 结果 DNS PROBE FINISHED BAD CONFIG 报错了 可qq可以正常登录啊 dns解析错误吧应该 然后百度一顿乱搜 终于 弄好了 1 输入ipc
  • https://aka.ms/ 无法访问的问题

    今天在下载WSL发行版的 需要访问https aka ms 点开连接出现了这样的问题 出现这个问题让人很懵逼 从上面的错误代码上来看应该是证书的问题 上面出现VMware就很离谱 可能是电脑上的VMware修改了什么东西 试着看看又没有什么
  • mysql 一行数据拆分多行

    查找出被逗号分隔字段需要拆分的最大数量 select max LENGTH 逗号分隔的字段 LENGTH REPLACE 逗号分隔的字段 1 from 处理表 where 条件 创建一张临时表用于联合查询 方便把处理表单行记录分隔为多行 C
  • 使用SQLiteOpenHelper的onUpgrade实现数据库版本升级

    Andoird的SQLiteOpenHelper类中有一个onUpgrade方法 帮助文档中只是说当数据库升级时该方法被触发 经过实践 解决了我一连串的疑问 1 帮助文档里说的 数据库升级 是指什么 你开发了一个程序 当前是1 0版本 该程
  • uniapp开发H5及app监听返回事件(以及监听不到的处理方法)

    1 使用页面事件onBackPress事件监听返回键 onBackPress e e from backbutton 说明如果点击的是物理返回键或导航栏的返回键就进行以下操作 if e from backbutton if 遮罩层是否隐藏
  • 刷脸支付提高技术服务水平以及用户黏性

    刷脸支付无需手机 等物理介质 通过刷脸 支付口令即可完成交易 增强服务获得感和便捷度 是该产品的显著特点 综合运用支付标记化 多方安全计算 活体检测 风控模型等构建风险防控体系 避免支付敏感信息直接参与交易流程 保障用户信息和资金安全 是该
  • 美国服务器有哪些类型?

    美国服务器有哪些类型 常见的服务器可分为虚拟主机 云服务器 物理服务器以及高防服务器 在海外服务器之中 使 用较多的属于美国服务器 下面我们就一起看看美国服务器有哪些及常见的美国服务器 美国服务器有哪些 与服务器一样 常见的美国服务器请到T
  • 解决TortoiseSVN提交代码被拒绝

    TortoiseSVN提交代码被拒绝 随便选个目录右键进入TortoiseSVN gt settings 选择左边的saved data gt clear 掉之前的用户名和密码 cmd命令行界面执行 svn ls svn路径 你要导入项目的
  • 使用shell脚本执行oracle sql语句示例

    脚本内容如下 bin bash sqlplus emuser emuser ctmdb lt lt EOF update GENERALAUTHORIZATIONS set isaccountlocked 0 where username
  • mybatis 大于小于号 <和>

    Mybatis中的sql语句中的 lt 和 gt 号要用转义字符 lt 和 gt 否则会报错 SELECT count id FROM housing record where adiut state lt 3 and admin id i
  • python中安装pyinstaller库的方法

    最近 在学习python过程中运用到了一个python的第三方库pyinstaller 是一个可以把程序打包为一个可执行文件 用户可以直接运行 一 pyinstaller库的安装 1 pip包安装 因为在配置python环境中自带了一个下载
  • Vuepress 文档脚手架(vue 3.x+vuepress2.x+vite+ts)

    在项目扩展到一定程度 我们会对项目中大量的公共业务做封装 当多人开发时就带来一个问题 如何让所有人快速使用封装好的组件 降低学习成本 这里提供一个解决方案 那就是Vuepress框架 最新的 Vuepress2 x 框架已经蓄势待发 支持V
  • 请用ST语言写一个6轴搬运机器人的底层程序

    ST语言是指Structured Text语言 它是一种PLC 可编程控制器 编程语言 用于编写工业自动化控制程序 以下是一份可以用于编写6轴搬运机器人的底层程序的示例 PROGRAM main VAR posX posY posZ REA
  • 【蓝牙串口通讯基础知识

    蓝牙串口通讯基础知识 一 串口 串行接口简称为串口 也叫串行通信接口 一般也叫COM口 这是一个统称 采用串行通信的接口都叫作串口 串口是一个硬件接口 UART是UniversalAsynchronous Receiver Transmit
  • layui子页面中退出登录使父页面跳转到登录页面

    在layui的iframe模板中 因为页面都是通过iframe方式引入的 所以在子 iframe 页面中使用location href user login html 后 跳转的页面依然显示在内联框架中 而不是父页面跳转 parent lo
  • 无人驾驶系统Autoware与仿真环境LGSVL Simulator联合配置

    在此 把在Ubuntu 16 04中 搭建无人驾驶系统Autoware编译环境 配置无人驾驶仿真环境LGSVL Simulator 并进行联合测试的步骤 记录下来 以备查阅 系统配置 我所用的配置 需要两个系统 一个Ubuntu系统 一个W

随机推荐

  • 服务器如何安装虚拟机,服务器如何安装虚拟机

    服务器如何安装虚拟机 内容精选 换一换 确认虚拟机使用的网卡安全组配置是否正确 在弹性云服务器详情页面查看网卡使用的安全组 查看安全组是否已放行100 125 0 0 16网段的地址 如果没有放行 请添加100 125 0 0 16网段的入
  • java/lang/NoClassDefFoundError: java/lang/Object

    一 问题描述 本地原来已经安装了JAVA JDK1 7并配置好了环境变量 然后又安装了JDK1 8 想2个版本并存 然后发现eclipse 打不开 闪退 在命令行执行以下语句 C Users Administrator gt java ve
  • ECU-TEST 快速入门

    ECU TEST 是由位于德国德累斯顿的TraceTronic公司开发的一款用于嵌入式系统测试验证软件工具 自从2003年首次发布ECU TEST 该软件成为了汽车ECU开发的标准工具 同时也逐步成为了重型机械和工业自动化开发的标准工具 该
  • 数学建模竞赛培训:华为杯、高教社杯和数学建模国赛全面指南

    文章目录 赛事介绍 参赛好处 辅导比赛 赛事介绍 华为杯全国研究生数学建模竞赛是由华为公司主办的一项面向全国研究生的数学建模竞赛 该竞赛旨在通过实际问题的建模和解决 培养研究生的创新能力和团队合作精神 推动科技创新和应用 华为杯竞赛分为初赛
  • git commit报did not match any file known to git

    使用到以下命令时 git commit m project initialized 回车之后报错了 报了以下的错误 error pathspec initialized did not match any file s known to g
  • hive截取字符串substr和substring的用法

    第一种用法 substr string A int start 和 substring string A int start 用法一样 功效 返回字符串A从下标start位置到结尾的字符串 第二种用法 substr string A int
  • “最强”博士论文答辩阵容:6位院士,副院长任答辩秘书!

    点击 凹凸域 马上关注 更多内容 请置顶或星标 十二月份前后 是不少研究生毕业答辩的时间段 在社交媒体上 关于论文答辩的热度也逐渐上升 与此同时 也有网友注意到一些答辩委员会的阵容非常强大 比如 就有微博用户表示 其导师请了足以给博士生论文
  • layui table的实现以及详细解释

    老规矩先看效果 这里用的主要是layui 的弹框和table数据表格 第一 引入的文件 百度网盘地址 https pan baidu com s 1neZbcX8IieMgiBdcVPhO1g 提取码 rqdc 改成本地路径 这里也可以用l
  • 从 Vision 到 Language 再到 Action,万字漫谈三年跨域信息融合研究

    本文作者为阿德莱德大学助理教授吴琦 他在为雷锋网 AI 科技评论投递的独家稿件中回顾了他从跨领域图像识别到 Vision to Language 相关的研究思路 如今正将研究领域延伸到与 Action 相关的工作 雷锋网 AI 科技评论对文
  • 6.63 猜数字之生成随机数

    1 生成 m n 的随机数 m n 的元素个数为 n m 1 若利用模进行 n m 1 运算 其结果为 0 n m 此时左右两边同加 m 其结果为 m n void TestRand 生成 m n 的随机数 rand n m 1 m sra
  • Django图书商城系统实战开发 - 实现个人中心管理

    Django图书商城系统实战开发 实现个人中心管理 介绍 在本项目中 我们已经实现了登录注册 商品详情查看 购物车购买 个人订单管理 评价功能 接下来 我们将完成个人中心管理的模块 包括个人密码修改 个人地址管理和注销功能 本文将详细介绍如
  • I2C总结(单主机和多主机)

    I2C在使用过程中单个主机是不论是硬件I2C还是硬件I2C都不太难 理解好时序很容易实现 还有就是很多人认为硬件I2C有很多缺点 其实这是谬论吧 硬件I2C在稳定性上胜过软件I2C 而且不占用MCU时间 可以实现I2C中断 如果系统有硬件I
  • Java开发快速上手!3分钟就能完成的Redis主从复制搭建,完整PDF

    前言 高并发 几乎是每个程序员都想拥有的经验 原因很简单 随着流量变大 会遇到各种各样的技术问题 比如接口响应超时 CPU load升高 GC频繁 死锁 大数据量存储等等 这些问题能推动我们在技术深度上不断精进 我们知道 高并发代表着大流量
  • 【Flutter 3-1】Flutter手把手教程UI布局和Widget——底部导航栏BottomNavigationBar使用

    作者 弗拉德 来源 弗拉德 公众号 fulade me BottomNavigationBar BottomNavigationBar 和 BottomNavigationBarItem 配合来共同展示Flutter里面的底部状态栏 底部状
  • 敏捷开发之Scrum扫盲篇

    转载至 http www cnblogs com taven archive 2010 10 17 1853386 html 现在敏捷开发是越来越火了 人人都在谈敏捷 人人都在学习Scrum和XP 为了不落后他人 于是我也开始学习Scrum
  • kerberos 术语和认证流程介绍

    重要术语 1 KDC 全称 key distributed center 作用 整个安全认证过程的票据生成管理服务 其中包含两个服务 AS和TGS 2 AS 全称 authentication service 作用 为client生成TGT
  • 操作系统的文件结构

    文件的 逻辑结构 主要有 1 连续结构 2 多重结构 3 转置结构 4 顺序结构 文件的 物理存储 主要有 1 顺序结构 2 链接结构 3 索引结构 文件的 目录结构 主要有 1 一级目录结构 2 二级目录结构 3 树形结构 4 无环图
  • Springboot定时任务

    下文为 Scheduled的使用方法 1 简介 Scheduled支持三种部署方式 fixedRate fixedRateString 上一次执行开始后 n秒后再次执 fixedDelay fixedDelayString 上一次执行完毕后
  • 舵机的三条线分别代表什么

    橙色信号线 红色正极 棕褐色负极
  • @RequestParam和@PathVariable的用法与区别

    SpringBoot PathVariable URL变量 Web应用中的URL通常不是一成不变的 例如微博两个不同用户的个人主页对应两个不同的URL http weibo com user1和http weibo com user2 我们