通过  前文 了解了 Spring MVC 如何匹配请求,接下来就应该思考如何获取请求中的参数,只有得到了请求中的参数才能完成与客户端之间的交互。通常请求的传参方式有查询参数、请求体、URL 路径参数、请求头、Cookie。

HTTP 协议的传参方式

查询参数(Query Parameters)

使用 Hoppscotch 发起请求进行测试

Spring Web MVC 获取请求参数_spring MVC 参数

方法形参名称和 URL 查询字符串参数名称相同的情形

@RestController
public class HelloController {
  
  // 获取到数据 name = Alice,age = 18
  // gender 被忽略
  @RequestMapping(value = { "/hello" }, method = RequestMethod.GET)
  public String requestMethodName(String name, String age) {
    return "Hello, Spring!";
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

如果是 URL 参数名和方法形参名称不一致,可以在方法形参上使用 @RequestParam 注解,@RequestParam 有四个参数:

  • name/value:URL 中的参数名
  • required:参数是否必传(默认为 true),如果为 true 并且 URL 中没有此参数,就会抛出异常
  • defaultValue:参数不存在时的默认值
@RestController
public class HelloController {

  // 获取到数据 name = Alice,age = 18
  // gender 被忽略
  @RequestMapping(value = { "/hello" }, method = RequestMethod.GET)
  public String requestMethodName(@RequestParam(name = "name") String username, String age) {
    return "Hello, Spring!";
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

如果有多个相同的参数名,方法会获取到哪个参数呢

Spring Web MVC 获取请求参数_客户端_02

结果是以逗号分隔的多个值

Spring Web MVC 获取请求参数_封装_03

如果 URL 查询参数比较多,这时把参数封装成一个实体类就比较合适了,但此时就不能使用 @RequestParam 注解了。

Spring Web MVC 获取请求参数_spring MVC 参数_04

@RestController
public class HelloController {

  class User {
    private String name;
    private int age;

    // Getters and Setters
    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    public int getAge() {
      return age;
    }

    public void setAge(int age) {
      this.age = age;
    }
  }

  // 把 name、age 封装到 user 对象中
  @RequestMapping(value = { "/hello" }, method = RequestMethod.GET)
  public String requestMethodName(User user) {
    return "Hello, Spring!";
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

Spring Web MVC 获取请求参数_封装_05

还可以把查询参数封装进多个对象中

Spring Web MVC 获取请求参数_spring MVC 参数_06

@RestController
public class HelloController {

  class User {
    private String name;
    private int age;

    // Getters and Setters
    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    public int getAge() {
      return age;
    }

    public void setAge(int age) {
      this.age = age;
    }
  }

  class Product {
    private String productName;
    private String price;

    // Getters and Setters
    public String getProductName() {
      return productName;
    }

    public void setProductName(String productName) {
      this.productName = productName;
    }

    public String getPrice() {
      return price;
    }

    public void setPrice(String price) {
      this.price = price;
    }
  }
	// 把 name、age 封装到 user 对象中
  // 同时把 productName、price 封装到 product 对象中
  @RequestMapping(value = { "/hello" }, method = RequestMethod.GET)
  public String requestMethodName(User user, Product product) {
    return "Hello, Spring!";
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.

Spring Web MVC 获取请求参数_请求参数_07

请求体参数(Request Body)

从请求体中获取数据,需要使用 @RequestBody 注解,注解有一个 required 参数,需要注意的是,一个方法只能有一个 @RequestBody 注解,但可以和@RequestParam 注解同时使用。

在 Hoppscotch 中配置 Body 参数

Spring Web MVC 获取请求参数_封装_08

@RestController
public class HelloController {

  @RequestMapping(value = { "/hello" }, method = RequestMethod.GET)
  public String requestMethodName(@RequestBody User user) {
    return "Hello, Spring!";
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

Spring Web MVC 获取请求参数_封装_09

URL 路径参数(Path Parameters)

路径参数就是把参数放在路径中,通过 @PathVariable 注解来获取路径参数。

Spring Web MVC 获取请求参数_spring MVC 参数_10

@RestController
public class HelloController {

  // 获取到 name = Alice,age = 18
  @RequestMapping(value = { "/hello/{name}/{age}" }, method = RequestMethod.GET)
  public String requestMethodName(@PathVariable String name, @PathVariable int age) {
    return "Hello, Spring!";
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

请求头参数(Request Headers)

客户端发起请求的时候,可以把数据放在 header 中,可以通过 @RequestHeader 获取 header 中的数据,@RequestHeader 有四个参数:

  • name/value:URL 中的参数名
  • required:参数是否必传(默认为 true),如果为 true 并且 URL 中没有此参数,就会抛出异常
  • defaultValue:参数不存在时的默认值

Spring Web MVC 获取请求参数_客户端_11

@RestController
public class HelloController {

  // 获取到 name = Alice,age = 18
  @RequestMapping(value = { "/hello" }, method = RequestMethod.GET)
  public String requestMethodName(@RequestHeader String name, @RequestHeader int age) {
    return "Hello, Spring!";
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

Spring Web MVC 获取请求参数_请求参数_12

Cookie 参数

服务端可以为客户端设置 Cookie,客户端也可以设置 Cookie,客户端发起请求的时候会自动携带上 Cookie。通过 @CookieValue 注解获取 Cookie 中的数据,@CookieValue 有四个参数:

  • name/value:URL 中的参数名
  • required:参数是否必传(默认为 true),如果为 true 并且 URL 中没有此参数,就会抛出异常
  • defaultValue:参数不存在时的默认值

设置 Cookie

Spring Web MVC 获取请求参数_封装_13

发起请求

Spring Web MVC 获取请求参数_请求参数_14

@RestController
public class HelloController {

  // 获取到 name = Alice,age = 18
  @RequestMapping(value = { "/hello" }, method = RequestMethod.GET)
  public String requestMethodName(@CookieValue String name, @CookieValue int age) {
    return "Hello, Spring!";
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.