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,一经查实,立即删除!

相关文章

php 随机钱数,PHP 仿微信红包金额随机

博主寒冰最近闲来无事。就想研究一下微信红包的金额随机算法。早在微信红包刚出来的时候就研究过。始终不得要领。后来,通过查阅诸多资料。听说要实现“正态分布”。这个理论的东西不想深挖。恰好在网上一篇博客找到一个相对完整的算法。我经过试用确实不错。经过我…

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

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

5 在java等于多少,java基础面试题之Java中的Math. round(-1. 5)等于多少

Java 中的 Math. round(-1. 5) 等于多少?答案:-1/*** Returns the closest {code long} to the argument, with ties* rounding to positive infinity.** Special cases:* If the argument is NaN, the result is 0.* If the argument is negative infin…

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…

python坐标轴刻度设置对数_Python中的对数刻度

我试图以对数比例(Y轴)绘制一个图形,但我需要在Y轴上显示原始值。我用了密码:# -*- coding: utf-8 -*-import mathimport matplotlib.pyplot as pltimport matplotlib.dates as datesfrom datetime import datetime, timedeltaimport numpy as npx []y …

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…

python123第七章_Python入门第7/10页

Python入门第7/10页更新时间:2007年02月08日 00:00:00 作者:第七章 输入输出有几种办法可以从程序输出;数据可以用可读的形式显示,或保存到文件中以备日后使用。本章讨论一些输入输出的办法。7.1 输出格式控制到现在为止我们已经…

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

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

php baocuo error,PHP编译报错configure: error: Cannot find libmysqlclient under /usr.

今天编译PHP的时候遇到了几个错误,记录一下第一次编译的时候报错如下:configure: error: mcrypt.h not found. Please reinstall libmcrypt.报这个错是因为没有安装libmcrypt这个包,下载地址如下:wget ftp://mcrypt.hellug.gr/pub…

dart和python哪个好_RedMonk 2020 年 Q1 编程语言排行:Python 冲进前二,Dart 值得关注...

知名软件行业分析公司 RedMonk 发布了 2020 年第一季度编程语言排行榜。RedMonk 编程语言排行榜通过追踪编程语言在 GitHub 和 Stack Overflow 上的代码使用情况与讨论数量,统计分析后进行排序,其旨在深入了解潜在的语言采用趋势。该榜单一年发布两次&am…

jclouds_使用jclouds在S3上分段上传

jclouds1.目标 在上一篇文章中 ,我们研究了如何使用jclouds中的通用Blob API将内容上传到S3。 在本文中,我们将使用jclouds的S3特定的异步API上传内容并利用S3提供的分段上传功能。 2.准备 2.1。 设置自定义API 上传过程的第一部分是创建jclouds API-这…

mysql+表中公共信息,計算mysql中兩個表之間的公共行數

so heres my question...這是我的問題…Hi have two tables in mysql, called go_H and go_J, both looking like this:在mysql中有兩個表,叫做go_H和go_J,它們都是這樣的:go_Hgo_H---------------------------| gene | GoCode |-----------------------…

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

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

使用虚拟时间测试基于时间的反应堆堆芯流

Reactor Core实现了Reactive Streams规范,并处理了(可能无限的)数据流。 如果您感兴趣,请查看它提供的出色文档 。 在这里,我假设对Reactor Core库的Flux和Mono类型有一些基本的了解,并且将介绍Reactor Cor…

matlab二维数组排序函数,Matlab 用sort函数排序 二维数组

在Matlab中排序某个向量(一维)时,可以使用sort(A),其中A为待排序的向量,如果仅是用来排序A,那么直接使用sort(A)即可, 如果排序后还需要保留原来的索引可以用返回值,即[B,ind]sort(A),计算后&am…

多个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芯片作为主控器的居多,…

程序员python工作_程序员如何在工作中进步

工作,对于大部分人都是不可避免的一件事,有的人是为了生存,有的人是为了自我价值的实现,也有人是为了将来不工作而现在努力工作,出发点可能各种各样,但是工作总是大部分人不可避免的一部分。程序员&#xf…