首页 > 其他分享 >@RequestParam和@PathVariable的用法与区别

@RequestParam和@PathVariable的用法与区别

时间:2022-09-02 22:23:01浏览次数:84  
标签:username PathVariable RequestParam URL 用法 user 变量

SpringBoot——@PathVariable

URL变量

Web应用中的URL通常不是一成不变的,例如微博两个不同用户的个人主页对应两个不同的URL:http://weibo.com/user1和http://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参数,它有什么用呢?先看一个例子:

在知乎中搜索web
浏览器跳转到新页面后,URL变为https://www.zhihu.com/search?type=content&q=web
在知乎中搜索java
浏览器跳转到新页面后,URL变为https://www.zhihu.com/search?type=content&q=java
这里的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")

转自:https://blog.csdn.net/a15028596338/article/details/84976223?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166212647516782388042781%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166212647516782388042781&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2

标签:username,PathVariable,RequestParam,URL,用法,user,变量
From: https://www.cnblogs.com/RB-L12/p/16651537.html

相关文章

  • Python学习:import的正确用法
    import语句用来导入其他python文件(称为模块module),使用该模块里定义的类、方法或者变量,从而达到代码复用的目的。将要建立文件的结构为:Tree|____m1.py|____m2.py|___......
  • Java中this和super的用法总结
    原文:https://www.cnblogs.com/hasse/p/5023392.htmlthis指向对象本身的指针,形参与成员名字重名,用this来区分。super超(父)类对象的一个指针。一、thisthis是自身......
  • unity prefab的新用法
    预制件是一个可重用的构建块,你可以把各种类型的对象统一成预制件。蓝色立方体是预制件,灰色的是游戏对象。用浏览器自带的翻译软件看的,可能会有一些细节问题......嵌套的......
  • Delphi 经典游戏程序设计40例 的学习 例26 Image List 的实力与用法
     unitR26;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,ExtCtrls,ImgList;typeTPatDt=rec......
  • java中List的详细用法
    目录:list中添加,获取,删除元素;list中是否包含某个元素;list中根据索引将元素数值改变(替换);list中查看(判断)元素的索引;根据元素索引位置进行的判断;利用list中索引位置重新生成......
  • C#|Map (Dictionary)的用法
    在C#中想要使用Map时,发现没有Map,但是有替代方案,就是使用Dictionary。Dictionary<string,string>hashMap=newDictionary<string,string>();说明:必须包含名......
  • 【面试题】Vue路由跳转的四种方式用法及区别
    Vue路由跳转的四种方式用法及区别点击打开视频讲解更加详细一、router-link<router-link:to="{name:'home'}"><router-link:to="{path:'/home'}">//name,path都行......
  • Oracle数据库expdp用法
    copy自:Oracle数据库expdp用法以及注意事项一、导出注意事项检查数据库版本(用于决定导出时生成为哪个版本的dmp头文件)selectversionfromv$instance;也可以用sqlplus......
  • Go中三个点(...)用法
    //接受可变长参数funcarg(args...string){fori,v:=rangeargs{fmt.Printf("index%d,value%v\n",i,v)}}funcmain(){temp:=[]string{"......
  • Application.EnableVisualStyles()和Application.SetCompatibleTextRenderingDefault(
    1、publicstaticvoidEnableVisualStyles():此方法为应用程序启用可视样式。2、Application.SetCompatibleTextRenderingDefault(false)3、Application.Run()函数1、pu......