SpringBoot @PathVariable实现参数传递(附带实例)
参数传递是 Web 开发的基础内容,前端页面和后端服务通过请求和返回的参数来判断所执行的业务逻辑,因此参数的传递和接收是 Web 开发中最基础却非常重要的功能。
Spring Boot 支持多种参数接收方式,通过提供注解来帮助限制请求的类型、接收不同格式的参数等。在 Web 应用中,最常用的参数传递方式就是 URL 传参,也就是将参数放在请求的 URL 中。
例如微博上不同用户的个人主页应该对应不同的 URL:http://weibo.com/user/1、http://weibo.com/user/2。我们不可能对每个用户都定义一个 @RequestMapping 注解的方法来映射 URL 请求。对于相同模式的 URL,可以采用同一种规则进行处理。
在 @RequestMapping 中定义变量规则后,Spring Boot 提供的 @PathVariable 注解帮助我们获取URL中定义的变量参数,示例如下:
需要注意的是,在默认情况下,变量参数不能包含 URL 的分隔符“/”,也就是说上面定义的 URL 路由不能匹配 /users/weiz/zhang,即使 weiz/zhang 是一个存在的用户名。
在多变量参数的情况下,Spring Boot 能够根据变量名自动赋值对应的函数参数值,也可以在 @PathVariable 中显式声明具体的 URL 变量名。
在默认情况下,@PathVariable 注解的参数支持自动转换一些基本的数据类型,如 int、long、date、string 等,Spring Boot 能够根据 URL 变量的具体值以及函数参数的数据类型来进行转换,例如 /user/weiz/blog/1 会将“weiz”的值赋给 username,而 1 赋给 int 类型的变量 blogId。
没关系,@RequestMapping 注解同样支持正则表达式匹配,可以通过定义正则表达式更精确地控制,定义语法是 {变量名:正则表达式},示例代码如下:
Spring Boot 支持多种参数接收方式,通过提供注解来帮助限制请求的类型、接收不同格式的参数等。在 Web 应用中,最常用的参数传递方式就是 URL 传参,也就是将参数放在请求的 URL 中。
例如微博上不同用户的个人主页应该对应不同的 URL:http://weibo.com/user/1、http://weibo.com/user/2。我们不可能对每个用户都定义一个 @RequestMapping 注解的方法来映射 URL 请求。对于相同模式的 URL,可以采用同一种规则进行处理。
定义URL变量
@RequestMapping 注解使用 {} 来声明 URL 变量,例如 @RequestMapping("/user/{username}")。其中,{username} 是定义的变量规则,username 是变量的名字。此 URL 路由可以匹配下列任意 URL 请求:/user/tianmaying /user/ricky /user/tmy1234
在 @RequestMapping 中定义变量规则后,Spring Boot 提供的 @PathVariable 注解帮助我们获取URL中定义的变量参数,示例如下:
@RequestMapping("/user/{username}") @ResponseBody public String userProfile(@PathVariable String username){ return "user:" + username; }在上面的示例中,Spring Boot 会自动将 URL 中定义的变量传递给 userProfile 方法的 username 参数(同名赋值),例如当 HTTP 请求为 /users/weiz 时,URL 变量 username 的值 weiz 会被赋给函数参数 username,返回的数据为 user:weiz。
需要注意的是,在默认情况下,变量参数不能包含 URL 的分隔符“/”,也就是说上面定义的 URL 路由不能匹配 /users/weiz/zhang,即使 weiz/zhang 是一个存在的用户名。
定义多个URL变量
上面介绍了传递单个变量的例子,那么多个变量呢?同样,@RequestMapping 支持定义包含多个 URL 变量的路由,示例如下:@RequestMapping("/user/{username}/blog/{blogId}") @ResponseBody public String getUerBlog(@PathVariable String username , @PathVariable int blogId) { return "user: " + username + "blog:" + blogId; }在上面的示例中,@RequestMapping("/user/{username}/blog/{blogId}") 传入 {username} 和 {blogId} 两个参数,然后使用 @PathVariable 映射对应的变量参数。
在多变量参数的情况下,Spring Boot 能够根据变量名自动赋值对应的函数参数值,也可以在 @PathVariable 中显式声明具体的 URL 变量名。
在默认情况下,@PathVariable 注解的参数支持自动转换一些基本的数据类型,如 int、long、date、string 等,Spring Boot 能够根据 URL 变量的具体值以及函数参数的数据类型来进行转换,例如 /user/weiz/blog/1 会将“weiz”的值赋给 username,而 1 赋给 int 类型的变量 blogId。
匹配正则表达式
虽然 @RequestMapping 路由支持 URL 变量,但是很多时候需要对 URL 变量进行更加精确的定义和限制,例如用户名只包含小写字母、数字、下划线:/user/fpc是一个合法的URL /user/#不是一个合法的URL这种情况下,简单定义 {username} 变量就无法满足需求了。
没关系,@RequestMapping 注解同样支持正则表达式匹配,可以通过定义正则表达式更精确地控制,定义语法是 {变量名:正则表达式},示例代码如下:
@RequestMapping("/user/{username:[a-zA-Z0-9_]+}/blog/{blogId}") @ResponseBody public String getUerBlog(@PathVariable String username , @PathVariable int blogId) { return "user: " + username + "blog:" + blogId; }在上面的示例中,使用 [a-zA-Z0-9_]+正则表达式来限定 username 参数值只能包含小写字母、大写字母、数字、下划线。如此设置 URL 变量规则后,不合法的 URL 不会被处理,直接返回 404Not Found。