Spring MVC中@RequestParam和@PathVariable批注之间的区别?

Spring MVC框架是在Java世界中开发Web应用程序最流行的框架之一,它还提供了一些有用的注释,可以从传入的请求中提取数据并将请求映射到控制器,例如@ RequestMapping,@ RequestParam和@PathVariable。

即使将@RequestParam和@ParthVariable都用于从HTTP请求中提取值,它们之间也存在细微的差异,这使得它们从访谈和Spring认证的角度来看都是一个有用的问题。 我们将研究之间的细微差别
本文中的@RequestParam和@PathVaraible。 顾名思义,@ RequestParam用于从URL获取请求参数,也称为查询参数,而@PathVariable则从URI提取值。

例如,如果传入的检索主题为“ Java”的书的HTTP请求是http:// localhost:8080 / shop / order / 1001 / receipts?date = 12-05-2017,则可以使用@RequestParam批注检索查询参数日期,您可以使用@PathVariable提取orderId即“ 1001”,如下所示:

@RequestMapping(value="/order/{orderId}/receipts", method = RequestMethod.GET)public List listUsersInvoices(
@PathVariable("orderId") int order,@RequestParam(value = "date", required = false) Date dateOrNull) {...}

required = false表示查询参数可以是可选的,但URL必须具有相同的URI。

如何使用@RequestParam在Spring MVC中提取查询参数

Spring MVC是一个丰富的框架,可以用Java开发Web应用程序和RESTful Web服务 。 它提供了几种从传入的HTTP请求中检索数据的方法,例如

  • 请求参数
  • 路径变量
  • 表格输入

既然您知道了Spring MVC中@RequestParam和@PathVariable之间的区别,让我们看看如何编写可以处理请求参数和路径变量的Spring控制器。

使用@RequestParam获取查询参数

在Spring MVC应用程序中,可以使用@RequestParam批注在Controller的处理程序方法中接受查询参数。

例如,假设您有一个Web应用程序,该应用程序返回订单和交易的详细信息,并且具有以下URL:

http://localhost:8080/eportal/orders?id=1001

要接受上述URL中的查询参数,可以在Spring MVC控制器中使用以下代码:

@RequestMapping("/orders")public String showOrderDetails(@RequestParam("id") String orderId, Model model){model.addAttribute("orderId", orderId);return "orderDetails";}

如果查询参数的名称与处理程序的@RequestParam注释参数中的变量名称相同,则可以直接使用@RequestParam而不指定查询参数的名称,Spring会自动派生该值(请参见
Spring MVC简介 )。

另外,这是证明这一点的代码:

URL:http://localhost:8080/eportal/trades?tradeId=2001
@RequestMapping("/trades")public String showTradeDetails(@RequestParam String tradeId,Model model){model.addAttribute("tradeId", tradeId);return "tradeDetails";}

可以看到,我们刚刚使用@RequestParam注释了方法参数tradeId,而未指定查询参数的名称,因为请求参数的名称和参数名称都相同,即“ tradeId”。

如果您有兴趣了解有关@RequestParam的更多信息,建议您查看Bryan Hassen的Spring MVC 4简介,以了解有关@RequestParam批注的更多信息。

使用@PathVariable批注从URI中提取值

您可以使用Spring MVC的@Path Varaible注释来提取嵌入在URL本身中的任何值。 Spring将其称为URI模板,其中@PathVariable用于从URI本身获取一些占位符。

如果您使用过RESTful Web服务,则可能会知道REST URI包含值,例如使用ISBN号检索书籍的REST API如下所示:

URL:http://localhost:8080/book/9783827319333

现在,要从Spring MVC Controller的处理程序方法中的URI中提取ISBN号的值,可以使用@PathVariable注释,如以下代码所示:

@RequestMapping(value="/book/{ISBN}", method= RequestMethod.GET)public String showBookDetails(@PathVariable("ISBN") String id,Model model){model.addAttribute("ISBN", id);return "bookDetails";}

与@RequestParameter批注类似,如果@RequestMapping批注中路径变量占位符的名称与处理程序方法的@PathVariable批注参数中的变量名相同,则也可以省略@PathVariable批注中的value属性。(请参阅REST with Spring )。

例如,您可以重写以上代码,如下所示:

@RequestMapping(value="/book/{ISBN}", method= RequestMethod.GET)public String showBookDetails(@PathVariable String ISBN,Model model){model.addAttribute("ISBN", ISBN);return "bookDetails";}

Spring MVC提供了一些有用的注释来映射和提取HTTP请求中的数据,作为Spring开发人员,您应该了解这些注释,例如@ RequestMapping,@ RequestParam和@PathVariable。

这些概念和注释对于Spring MVC的访问前景以及Spring认证都是非常重要的。 基于这些概念,您总是会发现几个问题。

顺便说一句,如果您正在准备Spring Web认证,还可以查看David Mayer的免费Spring Mock Questions ,以了解有关实际Spring Web Certification的问题级别和问题格式的信息。

Spring中@PathVariable和@RequestParam之间的区别

现在我们了解了两者的区别以及如何使用两者
@RequestParam和
Spring MVC应用程序中的@PathVariable,让我们从访谈的角度修改它们之间的主要区别。

1)@RequestParam用于提取查询参数,而@PathVariable用于直接从URI提取数据。

2)@RequestParam在传统的Web应用程序上更有用,在传统的Web应用程序中,数据主要在查询消除中传递,而@PathVariable更适合RESTful Web服务,其中URL包含值,例如http:// localhost:8080 / book / 9783827319333,此处为data ISBN号是URI的一部分。

如果您想了解更多有关如何使用Spring有效开发REST应用程序的信息,建议您加入Eugen Paraschiv的
REST with Spring课程。

这是一门在线课程,它将教您为现实场景开发REST API和服务的精妙方法。

Eugen在使用Spring开发RESTful Web服务方面拥有丰富的经验,本课程是利用他的知识的绝佳方法。

3)如果查询参数不存在或为空,则@DefaultParam批注可以使用defaultValue属性指定默认值,前提是必填属性为false。

4)Spring MVC允许您在同一方法中使用多个@PathVariable批注,前提是不超过一个参数具有相同的模式。

这就是Spring MVC中@PathVariable和@RequestParam之间区别 。 即使两者都用于从URL提取数据,@ RequestParam仍用于检索查询参数,在?之后是什么? 在URL中,而@PathVariable用于从URI本身检索值。 这个概念对于传统的Web应用程序开发以及使用Spring开发RESTful Web Services都是非常重要的,因此您必须花一些时间来更好地理解它。

您可能想探索的其他Spring MVC文章

Bryan Hassen的Spring MVC 4简介

Spring MVC中@RestController和@Controller之间的区别?

Spring MVC在内部如何工作?

Spring MVC中DispatcherServlet的用途是什么?

如何在Java Web应用程序中启用Spring安全性?

Craig Walls的《春天在行动》

感谢您到目前为止阅读本文。 如果您喜欢这篇文章,请与您的朋友和同事分享。 如有任何疑问,请给我留言。

翻译自: https://www.javacodegeeks.com/2017/10/differences-requestparam-pathvariable-annotations-spring-mvc.html

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

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

相关文章

excel 两列模糊匹配给出结果_北大硕士给大脑植入Excel病毒,工作效率提升了好几倍...

在工作中,我们经常会碰到这样的同事,他们是这样完成工作的:先用计算器算好结果,甚者动用手指头在电脑屏幕上数数,然后把数据填写到Excel表格中。结果可以预见,原本可以在上班时间完成的工作,愣是…

java ee cdi_Java EE CDI Producer方法教程

java ee cdi这是CDI Producer方法的教程。 在CDI中,生产者方法生成一个对象,然后可以将其注入。 当我们要注入本身不是bean的对象,要注入的对象的具体类型在运行时可能有所不同,或者当对象需要一些bean构造函数不执行的自定义初始…

qnap nas web php,如何在QNAP NAS上建立并使用 iSCSI Target

本帖最后由 小Q 于 2015-2-5 13:30 编辑在QNAP Turbo NAS上建立并使用iSCSI Target,快速、便利且便宜建置网络储存系统之方式内容:l 在Windows中使用Microsoft iSCSI启动器来连接iSCSI装置什么是iSCSI且它有什么好处?iSCSI(Internet Small Computer Sy…

openssl php api,PHP7使用openssl解密易班API中的用户数据

PHP7使用openssl解密易班API中的用户数据一、mcrypt扩展解密自从PHP版本更新到了7.1以上以后,mcrypt扩展被废弃,使用mcrypt扩展会出现如下图的报错。只能使用openssl来代替。然而易班轻应用提供的还是旧版本的mcrypt扩展,这将导致php版本升级…

Spring MVC的DispatcherServlet – Java开发人员应该知道的10件事

如果您使用过Spring MVC,那么您应该知道什么是DispatcherServlet? 它实际上是Spring MVC的心脏,确切地说是MVC设计模式或控制器的C语言。 应该由Spring MVC处理的每个Web请求都通过DispatcherServlet处理。 通常,它是Front Contro…

运行时错误7内存溢出_分别从运行时和GC的角度看JAVA8内存管理

运行时区域1.程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型里(概念模型,各种虚拟机可能会通过一些更高效的方式实现&#…

极域课堂管理系统软件如何取消控制_微缔电子组装业MES系统软件六大功能组成...

电子组装业MES系统软件六大功能组成MES系统软件是制造执行系统的英文简称,MES系统软件在整个企业信息集成系统中承上启下,是生产活动与管理活动信息沟通的桥梁,MES系统软件在产品从工单下发到生产成成品的整个过程中,扮演着促进生…

多个cuda 被单进程沾满_报名 | 提高GPU利用率,听英伟达专家分享这个CUDA工具

随着 NVIDIA GPU 计算性能的不断提升,如何提升 GPU 利用率是开发者普遍关心的问题之一。从 Kepler 架构开始,NVIDIA GPU 支持多个 CUDA kernels 函数的并发执行,称为 Hyper-Q 技术。Hyper-Q 技术支持多个 CUDA streams、多个 CPU threads 或者…

usb转ttl模块与matlab,USB接口转TTL小板的自检测试

现在电脑基本上都不会配置DB9串行数据端口了,这给一些喜欢折腾刷机和单片机加载程序的朋友带来了诸多的不便。还好,随着技术的发展,USB接口转TTL的产品越来越成熟,而这种产品主要以采用PL-2303HX芯片作为主控器的居多,…

matlab 误差椭圆,求3倍标准差误差椭圆分析的程序

根据《白话空间统计之九:方向分布(标准差椭圆)修正版》(有些地方没有理解清楚),写了下面的程序。但是好像结果不对Zmvnrnd([0.5 1.5], [0.025 0.03 ; 0.03 0.16], 50);XZ(:,1); YZ(:,2);mean_Xnanmean(X); mean_Ynanmean(Y); %椭圆圆心%确定长短半轴…

java ee cdi_Java EE CDI处理程序方法示例

java ee cdi这是CDI Disposer方法的教程。 在CDI中,由于Producer方法生成的对象随后可以注入到应用程序中,因此使用Disposer方法,以便在其工作完成时将其删除。 Disposer方法始终与Producer方法匹配。 Disposer方法使用的一个示例是当应用程…

python皮卡丘编程代码_再接再厉,用python编程13行代码解方程组(纯字符)

因为是示例为主,我们将方程组限制在二元一次方程组:x,y两个变量,两个方程。类似这样:每个方程有两个变量,x和y,形式为:axbycd由于这次有了两个方程,我们提取参数的代码就适合提炼为一…

快速提示:使用Chrome开发工具调试GWT应用程序

调试是软件开发的重要方面。 拥有正确的工具可以节省大量时间和头痛。 在GWT Super Dev模式之前,经典的Dev模式允许使用JVM调试。 开发人员可以在其IDE中设置断点,并使用调试模式来跟踪错误和错误。 现在,在超级开发模式下,情况有…

用matlab做纹理合成,关于图像纹理合成的Matlab例程

纹理是普遍存在的视觉现象,其可以描述地形、植物、矿石、纤维和皮肤等等物体的表面特征。纹理结构在图像中反映其图像像素取值的空间变化情况,这种变化具有某中统计规律,在纹理区域内的各部分具有大致相同的结构。纹理合成是利用计算机产生纹…

matlab评估边缘检测性能,【模糊推理】模糊逻辑图像边缘检测,原理+matlab代码~...

这篇博客是接着上一篇来哒,https://blog.csdn.net/luolan9611/article/details/94285158本篇博客及上篇博客搜集的资料、实验代码、实验报告、PPT均已上传至百度网盘:链接:https://pan.baidu.com/s/1AmT4TtBAxj1FKf4KUFcsBw 提取码&#x…

qt中实现左右分割线_Qt项目中,实现屏幕截图并生成gif的详细示例(值得细读)...

总第50篇平时我们在工作和学习的过程中,有时需要将桌面的某些动作截图生成gif动图,以更生动地呈现出来。目前有很多这样的软件,并且方便易使用,比如我经常使用的GifCam,软件小巧,生成的图片文件也比较小&am…

构建Spring Boot RESTful服务+ Spring Boot执行器

总览 什么是REST? REST(代表状态转移)是Web构建的体系结构样式,已成为用于Web应用程序的标准软件设计模式 。 代表性国家转移一词最早由REST的发起人,HTTP规范的主要作者之一Roy Fielding在其博士论文中使用 。 REST上…

tf调不到keras怎么 回事_格力变频空调快速维修方法及技巧 空调压缩机不到一分钟就停,怎么回事?...

格力变频空调快速维修方法及技巧一、 室内部分: 1、F1开路:制冷时不启动或启动一下就停机;制热正常,且一直高频运转。 2、F2开路:工作6—10分钟就停机,显示E2停止外机。 3、F2短路&#xff1…

php自动释放mysql连接,php怎么关闭mysql连接

php怎么关闭mysql连接2021-03-17 07:45:43php中可使用mysqli_close()函数来关闭mysql连接,语法格式“mysqli_close(connection);”。mysqli_close()函数可关闭先前打开的数据库连接,如果成功返回TRUE,反之则返回FALSE。本教程操作环境&#x…

Java 8 –按值对HashMap进行升序和降序排序

在上一篇文章中,我向您展示了如何通过键对Java 8中的Map进行排序 ,今天,我将教您如何使用Java 8功能(例如,lambda表达式,方法引用,流和新方法) 按值对Map进行排序。添加到java.util.…