有关 RequestMapping 注解的一些事(一)


1、同一 URI 对应不同 Http 方法

@RequestMapping 可以使用在类级别上,在类中用 @GetMapping@PostMapping 等注解的方法会映射到统一 URL,并对应各自的方法:

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {

  @GetMapping
  public Map get() {
    // content
  }

  @GetMapping("/{day}")
  public Map getForDay() {
    // content
  }

  @PostMapping
  public String add() {
    // content
  }
}

2、路径参数

URL 上可以带参数,并且可以有多个参数:

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
  @RequestMapping("/pets/{petId}") public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
    // content
  }
}

3、URL 与 正则表达式

URL 上可以使用正则表达式

@RequestMapping("/web//{module:.+}/{pageName:.+}") 
public void handle(@PathVariable String module, @PathVariable String pageName) { 
  // content  
}

使用正则表达式有几个注意点:

  • 一个 URL 匹配多个 path 时,只有最具体的那个会被用到 —— 比如 /person 就比 /** 具体;
  • URL 路径可以带占位符:@RequestMapping 支持 ${…};
  • 后缀匹配:Spring MVC 默认后缀匹配 *.,映射到 /personController 也会隐式地映射到 /person.*

4、矩阵变量(Matrix Variables)

矩阵变量可以出现在路径的每个部分,每个变量可以用分号;或者逗号,分隔,如 “/cars;color=red;year=2012”,或者”color=red,green,blue”:

// GET /pets/42;q=11;r=22
@GetMapping("/pets/{petId}") 
public void findPet(@PathVariable String petId, @MatrixVariable int q) {
// petId == 42 // q == 11
}

有几个注意点:

  • 因为路径的每个部分都可以有矩阵参数,所以在一些情况下要提供具体的路径参数加以区别:

    // GET /owners/42;q=11/pets/21;q=22
    @GetMapping("/owners/{ownerId}/pets/{petId}") 
    public void findPet(
      @MatrixVariable(name="q", pathVar="ownerId") int q1, @MatrixVariable(name="q", pathVar="petId") int q2) {
      // q1 == 11 // q2 == 22
    }
    
  • 矩阵参数可以有默认值:

    // GET /pets/42
    @GetMapping("/pets/{petId}") 
    public void findPet(@MatrixVariable(required=false, defaultValue="1") int q) {
      // q == 1
    }
    
  • 矩阵参数可以保存在 Map 中:

    // GET /owners/42;q=11;r=12/pets/21;q=22;s=23
    @GetMapping("/owners/{ownerId}/pets/{petId}") public void findPet(
      @MatrixVariable MultiValueMap<String, String> matrixVars, 
      @MatrixVariable(pathVar="petId") MultiValueMap<String, String> petMatrixVars) {
      // matrixVars: ["q" : [11,22], "r" : 12, "s" : 23] 
      // petMatrixVars: ["q" : 11, "s" : 23]
    }