SpringWeb常用注解解析

目录

1.概述

2.@RequestMapping

3.@RequestBody

4.@PathVariable

5.@RequestParam

6.响应处理注解

6.1 @ResponseBody

6.2 @ExceptionHandler

6.3 @ResponseStatus

7. 其余web注解

7.1 @Controller

7.2 @RestController

7.3 @ModelAttribute

7.4 @CrossOrigin

8. 结论


1.概述

此教程中,我们将会讲解位于org.springframework.web.bind.annotation package包下的spring web注解。

2.@RequestMapping

简单的说,@RequestMapping 用于含有@Controller 注解的类的内部标记请求处理方法,可以使用以下方式配置:

  • 路径、路径依赖、名称、值:方法映射到的URL
  • 方法:兼容的HTTP方法
  • 参数:根据HTTP参数的存在、不存在或值筛选请求
  • 请求头:根据HTTP标头的存在、不存在或值筛选请求
  • 消费方:方法可以在HTTP请求正文中使用哪些媒体类型
  • 生产方:该方法可以在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。

这些都是从spring4.3发布后提供的。

3.@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来标记路径变量为可选:

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

5.@RequestParam

我们使用@RequestParam来获取HTTP请求参数

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

它具有与@PathVariable注释相同的配置选项。

除此之外,当Spring在请求中找不到值或空值时,我们可以使用@RequestParam指定注入值。为此,我们必须设置defaultValue参数。

提供默认值隐式地将所需设置为false:

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

除了参数之外,我们还可以访问其他HTTP请求部分:cookies和header。我们可以分别用@CookieValue和@RequestHeader来获取它们。

我们可以用与@RequestParam相同的方式配置它们。

6.响应处理注解

在下一节中,我们将看到在springmvc中处理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) {
    // ...
}

有关HTTP响应状态的详细信息,请访问Returning Custom Status Codes from Spring Controllers

7. 其余web注解

有些注释不直接管理HTTP请求或响应。在下一节中,我们将介绍最常见的注解。

7.1 @Controller

我们可以用@controller定义一个springmvc控制器。有关更多信息,请访问Spring Bean Annotations.

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注释的方法。

关于@ModelAttribute的更多信息可以访问Spring MVC and the @ModelAttribute Annotation

7.4 @CrossOrigin

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

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

如果我们用它标记一个类,它将应用于其中的所有请求处理程序方法。

我们可以用这个注释的参数来微调CORS的行为。

更多信息请访问CORS with Spring

8. 结论

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

你可能感兴趣的:(Java)