springmvc @RequestMapping映射请求

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) {
    // ...
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值