Spring MVC中@RequestMapping注释

2020-12-21 14:22发布

1.@RequestMapping请求映射

@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

官方给出的文档 为:

    @RequestMapping注释用于将请求映射到控制器方法。它具有通过URL,HTTP方法,请求参数,标题和媒体类型进行匹配的各种属性。它可以在类级使用来表示共享映射,或者在方法级使用,以缩小到特定的端点映射。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

1、 value, method;

value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);

method:  指定请求的method类型, GET、POST、PUT、DELETE等;

2、 consumes,produces;

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

    3、 params,headers;

params: 指定request中必须包含某些参数值是,才让该方法处理。

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

2.类型和方法级别映射示例

@RestController
@RequestMapping("/persons")
class PersonController {
 
    @GetMapping("/{id}")
    public Person getPerson(@PathVariable Long id) {
        // ...
    }
 
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void add(@RequestBody Person person) {
        // ...
    }
}

1、 value, method:

URI patterns

您可以使用glob模式和通配符映射请求:

  • ? 匹配一个字符

  • * 匹配路径段中的零个或多个字符

  • ** 匹配零个或多个路径段

value的uri值为以下三类:

A) 可以指定为普通的具体值;

B)  可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);

C) 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);

您还可以声明URI变量并使用以下命令访问它们的值@PathVariable

@GetMapping("/owners/{ownerId}/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
    // ...
}

可以在类和方法级别声明URI变量:

@Controller
@RequestMapping("/owners/{ownerId}")
public class OwnerController {
 
    @GetMapping("/pets/{petId}")
    public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
        // ...
    }
}

语法{varName:regex}用正则表达式用语法声明一个URI变量{varName:regex} - 例如给定的URL:

@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String ext) {
    // ...
}

2、 consumes,produces:

当多个模式与URL匹配时,必须对它们进行比较以找到最佳匹配。这是通过PathPattern.SPECIFICITY_COMPARATOR寻找更具体的模式来完成的

对于每个模式,根据URI变量和通配符的数量计算得分,其中URI变量得分低于通配符。总分较低的模式获胜。如果两个模式具有相同的分数,则选择更长的时间。

捕捉所有模式,例如**{*varName}排除在评分之外,总是排在最后。如果两个模式都是全部捕获,则选择的时间越长。


您可以根据请求缩小请求映射Content-Type

@PostMapping(path = "/pets", consumes = "application/json")
public void addPet(@RequestBody Pet pet) {
    // ...
}


您可以根据Accept请求标头和控制器方法生成的内容类型列表缩小请求映射

@GetMapping(path = "/pets/{petId}", produces = "application/json;charset=UTF-8")
@ResponseBody
public Pet getPet(@PathVariable String petId) {
    // ...
}

3、 params,headers:

您可以根据查询参数条件缩小请求映射。您可以测试查询参数("myParam"),缺省("!myParam"或特定值("myParam=myValue")的存在:

@GetMapping(path = "/pets/{petId}", params = "myParam=myValue")
public void findPet(@PathVariable String petId) {
    // ...
}

您还可以将其与请求标头条件一起使用:

@GetMapping(path = "/pets", headers = "myHeader=myValue")
public void findPet(@PathVariable String petId) {
    // ...
}


作者:Soinice

链接:https://blog.csdn.net/Soinice/article/details/80881029

来源:CSDN
著作权归作者所有,转载请联系作者获得授权,切勿私自转载。