作者:juxiu小妹_895 | 来源:互联网 | 2023-08-22 20:45
原标题:@RequestMapping 使用@PathVariable 从URI中获取参数
@RequestMapping 使用@PathVariable 从URI中获取参数
- URI中的请求参数
- 定义URL变量规则
- 获取URI变量
- 定义多个URL变量
- 匹配正则表达式
URI中的请求参数
在Web应用中URL通常不是一成不变的,例如微博两个不同用户文章来源地址49633.html的个人主页对应两个不同的URL:http://weibo.com/user1,http://weibo.com/user2 。我们不能对于每一个用户都编写一个被@RequestMapping
注解的方法来处理其请求。
对于相同模式的URL(例如不同用户的主页,它们仅仅是URL中的某一部分不同,为他们各自的用户名,我们说它们具有相同的模式)。
定义URL变量规则
可以在 @RequestMapping
注解中用{}来表明它的变量部分,例如:
@RequestMapping("/users/{username}")
这里{username}
就是我们定义的变量规则,username
是变量的名字,那么这个URI路由可以匹配下列任意URI并进行处理:
/users/tianmaying
/users/ricky
/users/tm文章来源地址49633.htmly1234
需要注意的是,在默认情况下,变量中不可以包含URL的分隔符/
,例如路由不能匹配/users/tianmaying/ricky
,即使你认为tianmaying/ricky
是一个存在的用户名。
获取URI变量
在路由中定义变量规则后,通常我们需要在处理方法(也就是@RequestMapping
注解的方法)www.yii666.com中获取这个URL的具体值,并根据这个值(例如用户名)做相应的操作,SpringMVC提供的@PathVariable
可以帮助我们:
@ResponseBody
@RequestMapping("/users/{username}")
public String userProfile(@PathVariable("username") String username){
return "user" + username;
}
运行结果:
定义多个URL变量
可以定义URI路由,其中包含多个URI变量:
@ResponseBody
@RequestMapping("/user/{username}/blog/{blogId}")
public String getUerBlog(@PathVariable String username , @PathVariable int blogId) {
return "user: " + username + "blog->" + blogId;
}
这种情况下,Spring能够根据名字自动赋值对应的函数参数值,当然也可以在@PathVariable
中显示地表明具体的URL变量值。
在默认情况下,@PathVariable
注解的参数可以是一些基本的简单类型:int
,long
,Date
,String
等,Spring能根据URL变量的具体值以及函数参数的类型来进行转换,例如/user/fpc/blog/1www.yii666.com
,会将fpc
的值赋给username
,而1
赋值给int变量blog文章来源站点https://www.yii666.com/Id
。
运行结果:
匹配正则表达式
很多时候,需要对URL变量进行更加精确的定义,例如-用户名只可能包含小写字母,数字,下划线,我们希望:
/user/fpc
是一个合法的URL
/user/#$$$
则不是一个合法的URL
除了简单地定义{username}
变量,还可以定义正则表达式进行更精确的控制,定义语法是{变量名:正则表达式}[a-zA-Z0-9_]+
是一个正则表达式,表示只能包含小写字母,大写字母,数字,下划线。如此设置URL变量规则后,不合法的URL则不会被处理,直接由SpringMVC框架返回404 Not Found。
@RequestMapping("/user/{username:[a-zA-Z0-9_]+}/blog/{blogId}")
来源于:@RequestMapping 使用@PathVariable 从URI中获取参数