映射的URL中有占位符变量,符合这个映射关系的请求都会被这个handler方法处理,下面就是一个模板例子。
/template/hello/jack和/template/hello/devin等等这样形式的请求都会被处理
@Controller
@RequestMapping(value = "/template")
public class URLTemplateController {
@RequestMapping(value = "/hello/{name}")
@ResponseBody
public String hello(@PathVariable(value = "name") String name){
return String.format("hello %s", name);
}
}
@PathVariable
获取占位符变量的值,上面那个例子name值就是jack或devin。支持多个占位符,可以是Map获取占位符变量值。
@RequestMapping(value = "/customer/{name}/order/{id}")
@ResponseBody
public String multiPathVariable(@PathVariable Map<String, String> vars){
return String.format("name %s, id %s", vars.get("name"), vars.get("id"));
}
注意:多个占位符使用map获取值,记得在beans 添加<mvc:annotation-driven/>,否则会报错误:Could not find @PathVariable [vars] in @RequestMapping
正则表达式
语法:{变量名:正则表达式},例如:只匹配单词字符的name
@RequestMapping(value = "/regexp/{name:\\w}")
@ResponseBody
public String regexp(@PathVariable(value = "name") String name){
return String.format("hello %s", name);
}
Ant路径模式
在映射URL中可以包含通配符(*),例如:/ant/*SpringMVC自动执行 ".*" 的后缀匹配,匹配/ant/user时,也会匹配/ant/user.*
占位符和路径模式比较
当一个URL匹配多个模式时,会找一个更具体模式进行匹配
a、模式中的 URI 模版变量和通配符的数量相对较少。如:/hotels/{hotel}/* 相对 /hotels/{hotel}/** 更具体
b、两个模式中的 URI 模版变量和通配符数量相同时,更详细的那一个会认为相对适合。如 /foo/bar* 比 /foo/* 更具体
c、当两个模式中变量个数详细程度相同时,模板比通配符更具体,如/hotels/{hotel}比/hotels/*更具体
d、任意模式都比默认全匹配 /** 模式更具体;任意不包含两个通配符的模式都比前缀模式(如 /public/**) 更加具体。/public/path3/{a}/{b}/{c} 比 /public/** 更具体
矩阵变量
语法:每个矩阵变量用分号隔开,例如:/cars;color=red;year=2012,矩阵变量有多个值时,用逗号隔开,例如:color=red,green,blue,也可以这样color=red;color=green;color=blue。包含矩阵变量的URL必须是一个URL模板,才能确保请求被正确匹配到。
支持矩阵变量还需要在beans文件中加上配置:
<mvc:annotation-driven enable-matrix-variables="true"/>
@RequestMapping(value = "/owners/{ownerId}/pets/{petId}", method = RequestMethod.GET)
@ResponseBody
public String findPet(
@MatrixVariable Map<String, String> matrixVars,
@MatrixVariable(pathVar="petId") Map<String, String> petMatrixVars) {
//matrixVars {q=[11, 22], r=[12], s=[23]}
//petMatrixVars {q=[22], s=[23]}
return matrixVars.toString()+" "+petMatrixVars.toString();
}
pathVar是指占位符变量(模板变量),即获取模板变量后面的矩阵变量