原文: https://howtodoinjava.com/spring5/webmvc/controller-getmapping-postmapping/

学习使用@Controller创建 Spring MVC 控制器,并使用请求映射注解来映射请求,例如 @RequestMapping@GetMapping@PostMapping@PutMapping@DeleteMapping@PatchMapping

1. Spring 控制器

1.1. @Controller注解

Spring MVC 提供了基于注解的方法,您无需扩展任何基类即可表达请求映射,请求输入参数异常处理等。 @Controller是类似的注解,将一个类标记为请求处理器。

HomeController.java

  1. package com.howtodoinjava.web;
  2. @Controller
  3. public class HomeController
  4. {
  5. @GetMapping("/")
  6. public String homeInit(Model model) {
  7. return "home";
  8. }
  9. }

在上面的代码中,HomeController类充当请求控制器。 它的homeInit()方法将处理对 URI "/"的所有传入请求。 它接受Model并返回视图名称home。 此视图名称由配置的视图解析器解析。

1.2. 启用组件扫描

要让 Spring 扫描和配置@Controller带注解的类,您需要在存储控制器的软件包上配置组件扫描。

WebConfig.java

  1. @Configuration
  2. @ComponentScan("com.howtodoinjava.web")
  3. public class WebConfig {
  4. //Other configurations
  5. }
  6. //or
  7. <context:component-scan base-package="com.howtodoinjava.web"/>

阅读更多: Spring MVC 示例

2. Spring @GetMapping示例

@GetMapping@RequestMapping注解的专用版本,用作@RequestMapping(method = RequestMethod.GET)的快捷方式。 @GetMapping带注解的方法处理与给定 URI 表达式匹配的 HTTP GET请求。 例如

@GetMapping Example

  1. @GetMapping("/home")
  2. public String homeInit(Model model) {
  3. return "home";
  4. }
  5. @GetMapping("/members/{id}")
  6. public String getMembers(Model model) {
  7. return "member";
  8. }

3. Spring @PostMapping示例

@PostMapping@RequestMapping注解的专用版本,用作@RequestMapping(method = RequestMethod.POST)的快捷方式。 @PostMapping带注解的方法处理与给定 URI 表达式匹配的 HTTP POST请求。 例如

@PostMapping Example

  1. @PostMapping(path = "/members", consumes = "application/json", produces = "application/json")
  2. public void addMember(@RequestBody Member member) {
  3. //code
  4. }

consumesproduces属性还支持否定表达式,例如!text/plain表示除text/plain以外的任何媒体类型。

4. 共享的类级别属性

您可以在类级别声明共享的produces属性。 在类级别使用时,方法级别的produces属性将覆盖类级别的声明。

HomeController.java

  1. package com.howtodoinjava.web;
  2. @Controller
  3. @RequestMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE)
  4. public class HomeController
  5. {
  6. @PostMapping(path = "/members")
  7. public void addMemberV1(@RequestBody Member member) {
  8. //code
  9. }
  10. @PostMapping(path = "/members", produces = MediaType.APPLICATION_XML_VALUE)
  11. public void addMemberV2(@RequestBody Member member) {
  12. //code
  13. }
  14. }

在上面的示例中,addMemberV1()方法以默认媒体类型(即application/json)生成内容。 第二种方法addMemberV2()会覆盖produces属性,并将生成application/xml类型的内容。

5. @PostMapping@RequestMapping

  1. 如上所述,@PostMapping注解是@RequestMapping注解的一种特殊版本,用于处理 HTTP POST 请求。

  2. @PostMapping@RequestMapping(method = RequestMethod.POST)的快捷方式。
    PostMapping.java

    1. @Target({ java.lang.annotation.ElementType.METHOD })
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @RequestMapping(method = { RequestMethod.POST })
    5. public @interface PostMapping
    6. {
    7. //code
    8. }
  1. 在两个注解中,传递 URL 信息都是相同的。

让我们看看使用简单代码的 PostMapping 和@RequestMapping 注解之间的 区别

  1. @RequestMapping(value = "/employees", method = RequestMethod.POST) //1
  2. @PostMapping("/employees") //2

6. 总结

Spring MVC 使编写请求处理器控制器类和方法变得非常容易。 只需添加一些注解,例如@GetMapping@PostMapping,然后将此类放置在组件扫描可以找到它们并在 Web 应用程序上下文中对其进行配置的位置。

在类级别创建属性也非常容易,以便所有处理器方法默认都继承它们,并可以在需要时覆盖它们。

同样,您可以使用其他请求映射注解,例如 @PutMapping@DeleteMapping@PatchMapping

学习愉快!