@RequestMapping 如何使用@PathVariable 从URI中获取参数

@RequestMapping 使用@PathVariable 从URI中获取参数

URI中的请求参数定义URL变量规则获取URI变量定义多个URL变量匹配正则表达式

URI中的请求参数

在Web应用中URL通常不是一成不变的,例如微博两个不同用户的个人主页对应两个不同的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/tmy1234

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

获取URI变量

在路由中定义变量规则后,通常我们需要在处理方法(也就是@RequestMapping注解的方法)中获取这个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/1,会将fpc的值赋给username,而1赋值给int变量blogId。

运行结果:

@RequestMapping 如何使用@PathVariable 从URI中获取参数_第1张图片

匹配正则表达式

很多时候,需要对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}")

SpringMVC使用@PathVariable,参数接收使用基本类型

使用MVC时,总是出现一些问题,当然都是使用造成的。

今天遇到一个问题,使用@PathVariable接收路径传递来的参数,可是访问时总是给500错误。

网上查了一下,有人说是不能带点符号,最后确定不是这个问题。

最后看到一个人说,使用@PathVariable时,参数接收要使用基本类型,比如我的代码:

@RequestMapping("/{reqKey}/req.do")
@ResponseBody
public ResponseEntity ordersBack(
  @PathVariable String reqKey,
  @RequestParam(value="intVal") Integer intVal,
  @RequestParam(value="strVal") String strVal) throws Exception{
 return new ResponseEntity("ok", HttpStatus.OK);
}

这里面的intVal 我写成了int,现在改为Integer就可以了。

这里你给 required=false 是不行的,因为如果你不需要,这里Spring会给一个Null默认值,而你的类型如果是int,那肯定会出错。

你也可以使用defaultValue,这样Spring就不会去注入Null值,一样也不会出错。

综上,使用@PathVariable时注意两点:

1:参数接收类型使用基本类型

2:不用基本类型时,给defaultValue值

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

你可能感兴趣的