springmvc 使用@RequestMapping来拦截路径,将路径拦截到某个controller某个方法进行具体处理,@RequestMapping可以在类级别上注解以及方法级别上注解
@Controller
@RequestMapping("/task")
public class TaskController {
@RequestMapping(value = { "", "/" })
public String whatPage() {
return "task/task" ;
}
@RequestMapping("/mvcTest1")
public void mvcTest1(
HttpServletRequest req,
HttpServletResponse res,
@CookieValue("JSESSIONID") String sessionId,
@RequestParam(value = "param", required = false) String param,
@RequestHeader(value = "Accept-Encoding", required = false) String encoding,
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss") Date date ,
Integer type,
@Validated Task task ) {
}
}
看看@RequestMapping注解源码
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String[] value() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
拦截多个路径
@RequestMapping不写具体key时候,默认是按key为value拦截且拦截一个,如果你想拦截多个路径,可以这样子配置
@RequestMapping(value = { "", "/" })
public String whatPage() {
return "task/task" ;
}
利用{…}匹配变量,利用@PathVariable 可以将变量绑定在方法入参中获取
@RequestMapping("/pets/{petId}")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
// ...
}
利用正则表达式来匹配路径,语法为{varName:regex},varName是变量,regex是具体的正则匹配,可以用@PathVariable将varName绑定在方法入参中,然后获取,例如下面的例子这样子请求”/spring-web/spring-web-3.0.5.jar”
@RequestMapping("/spring-web/{symbolicName:[a-z-]}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]}")
public void handle(@PathVariable String version, @PathVariable String extension) {
// ...
}
支持Ant的rest风格
/**
*匹配如/task/aaa/saveTask,/task/bbb/saveTask
*/
@RequestMapping("/task/*/saveTask")
public void saveTask1() {
// ...
}
/**
*匹配如/task/aaa/bbb/saveTask,/task/aaa/bbb/ccc/saveTask
*/
@RequestMapping("/task/**/saveTasks")
public void saveTask2() {
// ...
}
/**
*匹配如/task/saveTask1,/task/saveTask2
*/
@RequestMapping("/task/saveTasks??")
public void saveTask3() {
// ...
}
Ant的rest风格和{…}模式混合匹配
@RequestMapping("/task/**/findTaskById/{taskId}")
public void saveTask4(@PathVariable Long taskId ) {
// ...
}
后缀模式匹配
/**
* 获取任务栏
*/
@RequestMapping("/findTaskList")
public void findTaskList(@PathVariable Long taskId ) {
// ...
}
springmvc在配置”/findTaskList”这样子的路径时,如果用户路径是”/findTaskList/”,”/findTaskList.xml”,”/findTaskList.json”都会进入到findTaskList方法中。可以在配置文件中配置后缀
<!-- 注解驱动 -->
<mvc:annotation-driven >
<mvc:path-matching suffix-pattern="false" trailing-slash="false" />
</mvc:annotation-driven>
suffix-pattern匹配后缀,如.xml,.json默认是true,trailing-slash匹配”/”,如“/findTaskList/”默认是true。
矩阵匹配,可以匹配 URI RFC 398 标准的路径,如/cars;color=red;year=2012”的key和value类型的路径,需要在配置中打开矩阵请求允许
// GET /pets/42;q=11;r=22
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET)
public void findPet(@PathVariable String petId, @MatrixVariable int q) {
// petId == 42
// q == 11
}
//在dispatch-content.xml配置打开允许矩阵请求格式
<mvc:annotation-driven enable-matrix-variables="true">
</mvc:annotation-driven>
其他参数匹配,method ,params,headers,consumes,produces
匹配method ,能按照请求方法匹配,如POST,GET,PUT等
@RequestMapping(value = "/saveTask", params = RequestMethod.POST)
public void saveTask(Task task) {
// ...
}
用params匹配具体的参数,以key=value或者key!=value存在
@RequestMapping(value = "/findTaskByTaskName", params="taskName = mytask")
public void findTaskByTaskName(String taskName) {
// ...
}
@RequestMapping(value = "/findTaskByTaskName", params="taskName != mytask")
public void findTaskByTaskName(String taskName) {
// ...
}
用headers匹配请求的头部信息,以key = value或者key != value存在
@RequestMapping(value = "/findTaskByTaskName", headers="Accept-Charset=iso-8859-1")
public void findTaskByTaskName(String taskName) {
// ...
}
用consumes匹配请求头部的Content-Type
@RequestMapping(value = "/findTaskByTaskName", consumes="application/json")
public void findTaskByTaskName(String taskName) {
// ...
}
用produces匹配请求头部的accpet
@RequestMapping(value = "/findTaskByTaskName", produces="application/json")
public void findTaskByTaskName(String taskName) {
// ...
}