Elim的博客

用来记录一些原创性的总结


Elim

路径变量中使用正则表达式匹配

SpringMVC的处理器映射的请求路径中是可以包含路径变量的,语法是{pathVar},如下面的请求路径映射中就定义了一个路径变量var,则在访问时该变量可以是任意的值,所以在请求时/pathvariable/apathvariable/bcd等形式的请求路径都可以映射到下面的处理器方法。

@RequestMapping("/pathvariable/{var}")
public Object testPathVar() {
    return "PathVar";
}

如果有需要,我们还可以通过一个方法参数接收实际访问过程中传递的该路径变量,需要在对应的方法参数上使用@PathVariable标注,如果路径变量的名称和定义的方法参数的名称是一致的,则通常可以不通过@PathVariable的value属性指定方法参数对应的路径变量的名称;如果方法参数的名称和对应的路径变量的名称不一致,则必须如下所示通过@PathVariable的value属性指定对应的路径变量名称。

@RequestMapping("/pathvariable/{var}")
public Object testPathVar(@PathVariable("var") String pathVar) {
    return pathVar;
}

通过方法参数接收的路径变量还会自动的添加到对应的Model中,所以如果上面的示例代码中返回的是一个页面,则我们还可以在对应的页面中通过路径变量名称var获取到传递的实际的路径变量值。

以上介绍的是普通的路径变量使用的方式,它对传递的具体的路径变量值没有什么约束,试想一下,如果我们明确的知道上面的路径变量var的取值只能是小写字母的组合,那么当我们传递的路径变量是abc时是满足我们需求的,可以进入该方法处理,但是当我们传递的路径变量是abc123是不满足我们需求的,这时候也会进入我们的处理方法。虽然我们也可以在我们的处理方法中对路径变量进行校验,但是这明显不是很好的做法,因为严格意义上来说这时候就不应该进入我们的处理器方法。针对这种场景SpringMVC为我们提供了路径变量的正则表达式限定,即允许我们在定义路径变量时指定其需要满足的正则表达式要求,此时只有满足对应正则表达式要求的路径变量才能映射到对应的处理器方法处理。其语法是{varName:regex},varName指定路径变量名,regex定义需要匹配的正则表达式。在下面的示例中只有当我们传递的路径变量regex1是完全由小写字母a-z组成,并且路径变量regex2是由3位的数字组成时才会被映射到下面的处理器方法。比如/pathvariable/a/123是可以映射到下面的处理器方法的,而/pathvariable/a/12a则不能映射到下面的处理器方法。

@RequestMapping("/pathvariable/{regex1:[a-z]}/{regex2:\\d{3}}")
public Object testPathVariableRegex(@PathVariable String regex1, @PathVariable String regex2) {
    Map<String, Object> result = new HashMap<>();
    result.put("regex1", regex1);
    result.put("regex2", regex2);
    return result;
}

如果是上面那样,因为我们已经明确的指定了路径变量regex2需要是3位的数字,所以在方法参数中接收该路径变量时可以把regex2声明为数字类型的,比如下面这样。

@RequestMapping("/pathvariable/{regex1:[a-z]}/{regex2:\\d{3}}")
public Object testPathVariableRegex(@PathVariable String regex1, @PathVariable int regex2) {
    Map<String, Object> result = new HashMap<>();
    result.put("regex1", regex1);
    result.put("regex2", regex2);
    return result;
}

(注:本文是基于Spring4.1.0所写)