您的位置:首页 > 移动开发

springmvc @RequestMapping映射请求

2016-04-11 15:45 363 查看
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) {
// ...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: