1. 传递参数

1.1. 传递单个参数

接收单个参数,直接在方法中加入参数即可

@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m1")
    public String method1(String name){
        return "接收到参数name: " + name;
    }
}

Spring MVC——传递参数_JSON

在传递参数的时候,代码中的参数名称需要和请求的参数名称是一致的

Spring MVC——传递参数_mvc_02

如果传入的参数是整形呢,整数的话是可以用 Integer 和 int 来表示的,下面来演示一下

Spring MVC——传递参数_JSON_03

@RequestMapping("/m2")
public String method2(Integer age){
return "接收到参数age: " + age;
}
@RequestMapping("/m3")
public String method3(int age){
return "接收到参数age: " + age;
}

那么他们的区别是什么呢?

接下来试着不传参,发现 int 定义的参数是直接报错了,Integer 定义的是可以接受 null 的

Spring MVC——传递参数_mvc_04

并且无论是 int 还是 Integer,传入的参数一定要对应,否则也会报错

Spring MVC——传递参数_JSON_05

错误日志上描述的是 String 类型转化为其他类型失败,传递的普通参数,默认的类型是 String ,后端接收时根据定义的类型再进行相应的转化

Spring MVC——传递参数_mvc_06

int 等一些基本数据类型不能传入 null,不过 boolean 是可以传入 null 的


@RequestMapping("/m4")
public String method4(Boolean gender){
return "接收到参数gender: " + gender;
}
@RequestMapping("/m5")
public String method5(boolean gender){
return "接收到参数gender: " + gender;
}

Spring MVC——传递参数_spring_07

可以看出,如果不传参数的话,Boolean 接收到的是 null,boolean 接收到的 false,boolean 类型默认就是 false

1.2. 传递多个参数

多个参数也是可以直接传递的,并且不需要保证传参的顺序,只需要参数名对应即可

@RequestMapping("/m6")
public String method6(String name,Integer age){
    return "接收到参数name: " + name + "," + "age: " + age ;
}

Spring MVC——传递参数_JSON_08

再传递几个参数也是可以的,不过这种方式传递这么多参数就有些麻烦了,可以通过传递对象的方式可以传入多个参数

创建一个 User 的类(重写了 toString() 方法)之后再进行对象的传递

@RequestMapping("/m7")
public String method7(User user){
return "接收到参数user: " + user;
}

Spring MVC——传递参数_mvc_09

通过传入对象的方式就可以进行多个参数的传递,在之前,如果 int 类型参数没有传的话是会报错的,如果对象中使用 int 类型来描述属性的话,传递参数时不传也不会报错:

Spring MVC——传递参数_mvc_10

因为 age 是成员变量,是有默认值的,即使如此,还是建议使用包装类型,可以避免一些难以预料的问题

1.3. 参数重命名

在上面提到过,前端传递的参数要和后端方法里的参数保持一致,而前端可能会传入各种各样的参数,比如 userName, productName 等,后端如果只想要一个 name 的话可以对前端传递的参数进行重命名,把前端传入的名称都重命名为 name,后续就使用 name 进行操作,这就需要使用到 @RequestParam注解

@RequestMapping("/m8")
public String method8(@RequestParam("userName") String name){
    return "接收到参数name: " + name;
}

@RequestParam就起到了参数绑定的作用,把前端的 userName 和后端的 name 进行了绑定,那如果前端还是传入 name 会怎么样呢

直接报了一个 400 的错误,并且无论是传入参数和名称不对应还是不传递参数,都会报错

Spring MVC——传递参数_JSON_11

Spring MVC——传递参数_JSON_12

意思就是传递 userName 的参数,相当于强制绑定

来看 @RequestParam的源码:

Spring MVC——传递参数_JSON_13

value(或name)属性:用于指定请求参数的名称

required属性:表示该参数是否必须在请求中存在。如果设置为true,当请求中没有这个参数时,会抛出异常。如果设置为false,则在请求中没有该参数时,会使用默认值(如果有设置默认值)或者为null

在使用@RequestParam注解时,如果只提供一个字符串参数,它会被视为value(或name)属性的值。

@RequestMapping("/m8")
public String method8(@RequestParam(value = "userName",required = false) String name){
    return "接收到参数name: " + name;
}

把 required 改为 false 不传递参数也不会报错,会使用默认值或者 null

Spring MVC——传递参数_mvc_14

1.4. 传递数组

@RequestMapping("/m9")
public String method9(String[] arr){
    return "接收到参数name: " + List.of(arr);
}

传递数组的方式是有两种的,第一种就是直接传入数组中的数据,第二种就是传入多个数据,参数一致

Spring MVC——传递参数_mvc_15

那么第一种传入的数据是按照字符来传的还是按照数组中的三个元素来传的

Spring MVC——传递参数_mvc_16

调试一下发现是按照数组元素的形式自动切割了

1.5. 传递集合

数组可以通过上面的方式传,那么 List 行不行呢

@RequestMapping("/m10")
public String method10(List<String> list){
    return "接收到参数list: " + list;
}

这一次是直接报错了,显示 500 的状态码

Spring MVC——传递参数_spring_17

抛出了异常,无法构造一个 List

Spring MVC——传递参数_JSON_18

原因是发送上述请求时,默认是把请求的参数封装成数组的,并不是一个 List,所以需要进行参数绑定,也就是把数组转化为 List

@RequestMapping("/m10")
public String method10(@RequestParam List<String> list){
    return "接收到参数list: " + list;
}

Spring MVC——传递参数_spring_19

1.6. 传递 JSON 数据

1.6.1. JSON 语法

  1. 数据在键值对(Key/Value)中;
  2. 数据由逗号 , 分隔;
  3. 对象用 {} 表示;
  4. 数组用 [] 表示;
  5. 值可以为对象,也可以为数组,数组中可以包含多个对象。

Spring MVC——传递参数_mvc_20

Spring MVC——传递参数_spring_21

接下来看 JSON 是怎么转化为 java 对象的:

使用 ObjectMapper 对象提供的两个⽅法,可以完成对象和 JSON 字符串的互转。
writeValueAsString:把对象转为 JSON 字符串。
readValue:把字符串转为对象。

public class JsonTest {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        User user = new User();
        user.setName("zhangsan");
        user.setGender(1);
        user.setAge(18);
        //对象转JSON
        String s = objectMapper.writeValueAsString(user);
        System.out.println(s);
        //JSON转对象
        User user1 = objectMapper.readValue(s,User.class);
        System.out.println(user1);
    }
}

Spring MVC——传递参数_JSON_22

1.6.2. 传递 JSON

传递 JSON 参数是通过@RequestBody注解来实现的,从请求正文中获取数据

@RequestMapping("/m11")
public String method11(@RequestBody User user){
    return "接收到参数user: " + user;
}

可以看出,请求的数据格式是不同的

Spring MVC——传递参数_JSON_23