Spring Web注解

1. 概述

在本教程中,我们将探索来自org.springframework.web.bind.annotation 的Spring Web注解。

2. @RequestMapping

简单地说,@RequestMapping标记了@Controller类内部的请求处理程序方法;它可以配置使用:

  • path, name, value:方法映射到哪个URL
  • method: 兼容的HTTP方法
  • params: 根据HTTP参数的存在、不存在或值过滤请求
  • headers:根据HTTP头的存在、不存在或值过滤请求
  • consumes:该方法可以在HTTP请求体中使用哪些媒体类型
  • produces:该方法可以在HTTP响应体中生成哪些媒体类型

下面是一个简单的例子:

@Controller
class VehicleController {

    @RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
    String home() {
        return "home";
    }
}

如果我们在类级别上应用这个注解,我们可以为@Controller类中的所有处理程序方法提供默认设置。唯一的例外是URL, Spring不会用方法级别设置覆盖它,而是添加了两个路径部分。
例如,下面的配置与上面的配置具有相同的效果:

@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {

    @RequestMapping("/home")
    String home() {
        return "home";
    }
}

此外,@GetMapping、@PostMapping、@PutMapping、@DeleteMapping和@PatchMapping是@RequestMapping的不同变体,它们的HTTP方法已经分别设置为GET、POST、PUT、DELETE和PATCH。自Spring 4.3发布以来就可以使用了。

3. @RequestBody

让我们转到@RequestBody——它将HTTP请求体映射到一个对象:

@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
    // ...
}

反序列化是自动的,取决于请求的内容类型。

4. @PathVariable

接下来,让我们讨论@PathVariable。
此注解指示方法参数绑定到URI模板变量。我们可以用@RequestMapping注解指定URI模板,并用@PathVariable将方法参数绑定到模板的一个部分。
我们可以通过名称或其别名,value参数来实现这一点:

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable("id") long id) {
    // ...
}

如果模板中部件的名称与方法参数的名称相匹配,我们不需要在注解中指定:

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
    // ...
}

此外,我们可以通过将参数required设置为false来标记一个可选的path变量:

	@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) long id) {
    // ...
}

5. @RequestParam

我们使用@RequestParam来访问HTTP请求参数:

@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
    // ...
}

它具有与@PathVariable注解相同的配置选项。
除了这些设置,使用@RequestParam,我们可以在Spring在请求中没有发现值或空值时指定注入值。要实现这一点,我们必须设置defaultValue参数。
提供默认值隐式设置required为false:

@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
    // ...
}

除了参数,我们还可以访问其他HTTP请求部分:cookie和头。我们可以分别使用注解@CookieValue和@RequestHeader来访问它们。
我们可以像配置@RequestParam一样配置它们。

6. 响应处理注解

在下一节中,我们将看到在Spring MVC中操作HTTP响应的最常见注解。

6.1. @ResponseBody

如果我们用@ResponseBody标记一个请求处理程序方法,Spring将该方法的结果作为响应本身:

@ResponseBody
@RequestMapping("/hello")
String hello() {
    return "Hello World!";
}

如果我们用这个注解一个@Controller类,所有请求处理程序方法都将使用它。

6.2. @ExceptionHandler

通过这个注解,我们可以声明一个自定义错误处理程序方法。当请求处理程序方法抛出任何指定的异常时,Spring将调用此方法。
捕获的异常可以作为参数传递给方法:

@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
    // ...
}

6.3. @ResponseStatus

如果我们用这个注解一个请求处理程序方法,我们可以指定响应所需的HTTP状态。我们可以使用code参数声明状态代码,或者使用它的别名(value参数)声明状态代码。
同样,我们可以使用理由论证来提供一个理由。
我们也可以与@ExceptionHandler一起使用:

@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
    // ...
}

## 7. Other Web Annotations 有些注解不直接管理HTTP请求或响应。在下一节中,我们将介绍最常见的一些。 ### 7.1. _@Controller_ 我们可以用@Controller定义Spring MVC控制器。

7.2. @RestController

@RestController组合了@Controller和@ResponseBody。
因此,以下声明是等价的:

@Controller
@ResponseBody
class VehicleRestController {
    // ...
}
@RestController
class VehicleRestController {
    // ...
}

7.3. @ModelAttribute

通过这个注解,我们可以通过提供模型键来访问已经在MVC @Controller模型中的元素:

@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
    // ...
}

就像@PathVariable和@RequestParam一样,如果参数同名,我们不需要指定模型键:

@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
    // ...
}

除此之外,@ModelAttribute还有另一个用途:如果我们用它注解一个方法,Spring会自动将该方法的返回值添加到模型中:

@ModelAttribute("vehicle")
Vehicle getVehicle() {
    // ...
}

像以前一样,我们不需要指定模型键,Spring默认使用方法名:

@ModelAttribute
Vehicle vehicle() {
    // ...
}

在Spring调用请求处理程序方法之前,它调用类中所有@ModelAttribute注解的方法。

7.4. @CrossOrigin

@CrossOrigin为带注解的请求处理程序方法启用跨域通信:

@CrossOrigin
@RequestMapping("/hello")
String hello() {
    return "Hello World!";
}

如果我们用它标记一个类,它将应用于其中的所有请求处理程序方法。
我们可以使用这个注解的参数微调CORS行为。

8. 结论

在本文中,我们了解了如何使用Spring MVC处理HTTP请求和响应。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!