Spring-@PathVariable 系统管理员 2024-04-17 16:58 59阅读 0赞 #### 介绍: #### @PathVariable 映射 URL 绑定的占位符 带占位符的 URL 是 Spring3.0 新增的功能(Spingboot也可以),该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义; 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 \{xxx\} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。 主要是根据请求方法进行类的区别。 Web应用中URL不是一成不变的,例如微博两个不同用户的个人主页对应两个不同的URL:http://weibo.com/user1,http://weibo.com/user2。我们不能对每一个用户都编写一个被@RequestMapping注解的方法来处理其请求,也就是说,对于相同模式的URL(例如不同用户的主页,它们仅仅是URL中的某一部分不同,为他们各自的用户名,我们说它们具有相同的模式)。 -------------------- ##### 定义URL变量规则 ##### 可以在@RequestMapping注解中用\{\}来表明它的变量部分,例如: @RequestMapping("/users/{username}") 这里\{username\}就是我们定义的变量规则,username是变量的名字,那么这个URL路由可以匹配下列任意URL并进行处理: * /users/tianmaying * /users/ricky * users/tmy1234 需要注意: 在默认情况下,变量中不可以包含URL的分隔符 / 例如路由不能匹配/users/tianmaying/ricky,即使你认为tianmaying/ricky是一个存在的用户名,下面有进一步的说明。 ##### 获取URL变量 ##### 在路由中定义变量规则后,通常我们需要在处理方法(也就是@RequestMapping注解的方法)中获取这个URL的具体值,并根据这个值(例如用户名)做相应的操作,SpringMVC提供的@PathVariable可以帮助我们: //这里{username}就是我们定义的变量规则 @RequestMapping("/users/{username}") @ResponseBody public String userProfile(@PathVariable String username){ // return String.format("user %s", username); return "user" + username; 上述例子中,当@Controller处理HTTP请求时,userProfile方法的参数username会自动设置为URL中@RequestMapping("/users/\{username\}")的对应变量username(默认自动同名赋值)的值, 例如当HTTP请求为/users/fpc,URL变量username的值fpc会被赋给函数参数username,上述代码函数的返回值自然是userfpc。 在默认的情况下,Spring会对@PathVariable注解的变量进行自动同名赋值,当然你也可以指定@PathVariable使用哪一个URL中的变量: @RequestMapping("/users/{username}") @ResponseBody //@PathVariable("username") 指定URL的变量{username}赋给new_username public String userProfile(@PathVariable("username") String new_username){ // return String.format("user %s", new_username); return "user" + new_username; } ###### 运行结果: ###### ![在这里插入图片描述][20190829003419712.png] ![在这里插入图片描述][20190829003425385.png] ##### 定义多个URL变量 ##### PathVariable也可以定义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变量值。如: @RequestMapping("/user/{username}/blog/{blogId}") @ResponseBody //在@PathVariable中显示地表明具体的URL变量值 public String getUerBlog(@PathVariable("username") String new_username, @PathVariable("blogId") int new_blogId) { return "user: " + new_username + "blog->" + new_blogId; } 在默认情况下即@PathVariable中不显示地表明具体的URL变量值,@PathVariable注解的参数可以是一些基本的简单类型:int,long,Date,String等,Spring能根据URL变量的具体值以及函数参数的类型来进行转换,例如/user/fpc/blog/1,会将“fpc”的值赋给username,而1赋值给int变量blogId。 运行结果: ![在这里插入图片描述][20190829004255702.png] ##### 匹配正则表达式 ##### 很多时候,需要对URL变量进行更加精确的定义,例如-用户名只可能包含小写字母,数字,下划线,我们希望: * /user/fpc是一个合法的URL * /user/\#$$$则不是一个合法的URL * 除了简单地定义\{username\}变量,还可以定义正则表达式进行更精确的控制,定义语法是``java {`变量名:正则表达式}``,比如\[a-zA-Z0-9\_\]+是一个正则表达式,表示只能包含小写字母,大写字母,数字,下划线。如此设置URL变量规则后,不合法的URL则不会被处理,直接由SpringMVC框架返回404Not Found。 @RequestMapping("/user/{username:[a-zA-Z0-9_]+}/blog/{blogId}") ##### 总结 ##### * 在@RequestMapping注解中定义URL变量规则 * 在@RequestMapping注解方法中获取URL变量-@PathVariable * @PathVariable指定URL变量名 * 定义多个URL变量 * 用正则表达式精确定义URL变量 [20190829003419712.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/17/cf2c0fcd820d4fc7bc1dd2c656e5f258.png [20190829003425385.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/17/766c4fb5a4f24f8d8d858affc18a44f1.png [20190829004255702.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/17/9720f655970b4b78b11fbe5dc7a63b93.png
还没有评论,来说两句吧...