# Spring `@PostMapping`示例 – `@GetMapping`示例

> 原文： [https://howtodoinjava.com/spring5/webmvc/controller-getmapping-postmapping/](https://howtodoinjava.com/spring5/webmvc/controller-getmapping-postmapping/)

学习使用`@Controller`创建 [Spring MVC](https://howtodoinjava.com/spring-mvc-tutorial/) 控制器，并使用请求映射注解来映射请求，例如 `@RequestMapping`，`@GetMapping`，`@PostMapping`，`@PutMapping`，`@DeleteMapping`和`@PatchMapping`。

## 1\. Spring 控制器

#### 1.1. `@Controller`注解

Spring MVC 提供了基于注解的方法，您无需扩展任何基类即可表达**请求映射**，请求**输入参数**，**异常处理**等。 [`@Controller`](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Controller.html)是类似的注解，将一个类标记为请求处理器。

`HomeController.java`

```java
package com.howtodoinjava.web;

@Controller
public class HomeController 
{
	@GetMapping("/")
	public String homeInit(Model model) {
		return "home";
	}
}

```

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

#### 1.2. 启用组件扫描

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

`WebConfig.java`

```java
@Configuration
@ComponentScan("com.howtodoinjava.web")
public class WebConfig {
	//Other configurations
}

//or

<context:component-scan base-package="com.howtodoinjava.web"/>

```

> 阅读更多： [Spring MVC 示例](https://howtodoinjava.com/spring5/webmvc/spring5-mvc-hibernate5-example/)

## 2\. Spring `@GetMapping`示例

`@GetMapping`是[`@RequestMapping`](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html)注解的专用版本，用作`@RequestMapping(method = RequestMethod.GET)`的快捷方式。 [`@GetMapping`](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/GetMapping.html)带注解的方法处理与给定 URI 表达式匹配的 HTTP `GET`请求。 例如

`@GetMapping Example`

```java
@GetMapping("/home")
public String homeInit(Model model) {
	return "home";
}

@GetMapping("/members/{id}")
public String getMembers(Model model) {
	return "member";
}

```

## 3\. Spring `@PostMapping`示例

`@PostMapping`是`@RequestMapping`注解的专用版本，用作`@RequestMapping(method = RequestMethod.POST)`的快捷方式。 [`@PostMapping`](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/PostMapping.html)带注解的方法处理与给定 URI 表达式匹配的 HTTP `POST`请求。 例如

`@PostMapping Example`

```java
@PostMapping(path = "/members", consumes = "application/json", produces = "application/json")
public void addMember(@RequestBody Member member) {
	//code
}

```

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

## 4\. 共享的类级别属性

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

`HomeController.java`

```java
package com.howtodoinjava.web;

@Controller
@RequestMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE)
public class HomeController 
{
	@PostMapping(path = "/members")
	public void addMemberV1(@RequestBody Member member) {
		//code
	}

	@PostMapping(path = "/members", produces = MediaType.APPLICATION_XML_VALUE)
	public void addMemberV2(@RequestBody Member member) {
		//code
	}
}

```

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

## 5\. `@PostMapping`与`@RequestMapping`

1.  如上所述，`@PostMapping`注解是`@RequestMapping`注解的一种特殊版本，用于处理 **HTTP POST** 请求。
2.  `@PostMapping`是`@RequestMapping(method = RequestMethod.POST)`的快捷方式。

    `PostMapping.java`

    ```java
    @Target({ java.lang.annotation.ElementType.METHOD })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @RequestMapping(method = { RequestMethod.POST })
    public @interface PostMapping 
    {
        //code
    }

    ```

3.  在两个注解中，传递 URL 信息都是相同的。

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

```java
@RequestMapping(value = "/employees", method = RequestMethod.POST)	//1

@PostMapping("/employees")	//2

```

## 6\. 总结

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

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

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

学习愉快！