在上一个博客中,学习了如何在@Controller中建立@RequestMapping(或者响应的简写)来处理不一样的URL请求。可是在Web应用中URL一般不是一成不变的,例如微博两个不一样用户的我的主页对应两个不一样的URL:http://weibo.com/user1,http://weibo.com/user2。咱们不能对于每个用户都编写一个被@RequestMapping注解的方法来处理其请求,也就是说,对于相同模式的URL(例如不一样用户的主页,它们仅仅是URL中的某一部分不一样,为他们各自的用户名,咱们说它们具备相同的模式)。正则表达式
能够在@RequestMapping注解中用{}来代表它的变量部分,例如:app
@RequestMapping("/users/{username}")
这里{username}就是咱们定义的变量规则,username是变量的名字,那么这个URL路由能够匹配下列任意URL并进行处理:框架
须要注意的是,在默认状况下,变量中不能够包含URL的分隔符/,例如路由不能匹配/users/tianmaying/ricky,即便你认为tianmaying/ricky是一个存在的用户名。函数
在路由中定义变量规则后,一般咱们须要在处理方法(也就是@RequestMapping注解的方法)中获取这个URL的具体值,并根据这个值(例如用户名)作相应的操做,SpringMVC提供的@PathVariable能够帮助咱们:学习
@RequestMapping("/users/{username}") @ResponseBody public String userProfile(@PathVariable String username){ // return String.format("user %s", username); return "user" + username; }
在上述例子中,当@Controller处理HTTP请求时,userProfile的参数username会自动设置为URL中对应变量username(同名赋值)的值,例如当HTTP请求为/users/fpcspa
,URL变量username的值fpc会被赋给函数参数username,函数的返回值天然是userfpc。code
在默认的状况下,Spring会对@PathVariable注解的变量进行自动赋值,固然你也能够指定@PathVariable使用哪个URL中的变量:orm
@RequestMapping("/users/{username}") @ResponseBody public String userProfile(@PathVariable("username") String username){ // return String.format("user %s", username); return "user" + username; }
运行结果:blog
能够定义URL路由,其中包含多个URL变量:路由
@RequestMapping("/user/{username}/blog/{blogId}") @ResponseBody 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。
运行结果:
不少时候,须要对URL变量进行更加精确的定义,例如-用户名只可能包含小写字母,数字,下划线,咱们但愿:
除了简单地定义{username}变量,还能够定义正则表达式进行更精确的控制,定义语法是{变量名:正则表达式}[a-zA-Z0-9_]+是一个正则表达式,表示只能包含小写字母,大写字母,数字,下划线。如此设置URL变量规则后,不合法的URL则不会被处理,直接由SpringMVC框架返回404Not Found。
@RequestMapping("/user/{username:[a-zA-Z0-9_]+}/blog/{blogId}")