Spring MVC——传递参数

简介: 本文介绍了在Spring框架中如何传递参数的方法,包括传递单个参数、多个参数、参数重命名、传递数组和集合以及JSON数据。对于单个参数,可以直接在方法中声明;多个参数无需关注传递顺序,只需确保参数名对应。使用`@RequestParam`注解可实现参数重命名,而传递数组和集合时需注意数据类型的转换。最后,通过`@RequestBody`注解可以处理JSON格式的数据,实现复杂对象的传递。

1. 传递参数

1.1. 传递单个参数

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

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

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

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

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

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

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

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

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

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


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

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

1.2. 传递多个参数

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

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

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

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

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

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

因为 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 的错误,并且无论是传入参数和名称不对应还是不传递参数,都会报错

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

来看 @RequestParam的源码:

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

1.4. 传递数组

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

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

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

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

1.5. 传递集合

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

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

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

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

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

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

1.6. 传递 JSON 数据

1.6.1. JSON 语法

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

接下来看 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);
    }
}

1.6.2. 传递 JSON

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

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

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

相关文章
|
6月前
|
JSON 前端开发 Java
【JavaEE进阶】 Spring请求如何传递参数详解
【JavaEE进阶】 Spring请求如何传递参数详解
|
XML 数据格式
SPRING-QUARTZ 定时器 给TARGETMETHOD传递参数
SPRING-QUARTZ 定时器 给TARGETMETHOD传递参数
133 0
|
JSON Java Apache
SpringCloud - Feign 调用服务及传递参数踩坑记录(上)
SpringCloud - Feign 调用服务及传递参数踩坑记录(上)
2419 0
|
Java Apache 网络架构
【小家Spring】Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method ‘POST‘ not supported (附带其余好几个坑)(上)
【小家Spring】Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method ‘POST‘ not supported (附带其余好几个坑)
|
JSON 前端开发 数据格式
SpringMVC学习笔记(获取参数,传递参数——关于前后端传参交互的总结、from表单、Ajax数据提交))(下)
SpringMVC学习笔记(获取参数,传递参数——关于前后端传参交互的总结、from表单、Ajax数据提交))(下)
116 0
|
前端开发 Java API
SpringMVC学习笔记(获取参数,传递参数——关于前后端传参交互的总结、from表单、Ajax数据提交))(上)
SpringMVC学习笔记(获取参数,传递参数——关于前后端传参交互的总结、from表单、Ajax数据提交))(上)
179 0
|
JSON 数据格式 容器
SpringMVC五种类型参数传递和json数据传递参数
SpringMVC五种类型参数传递和json数据传递参数
SpringMVC五种类型参数传递和json数据传递参数
|
JSON 开发框架 前端开发
Spring全家通之SpringMVC如何传递参数以及返回值的类型
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架。
Spring全家通之SpringMVC如何传递参数以及返回值的类型
|
负载均衡 Java Spring
【小家Spring】Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method ‘POST‘ not supported (附带其余好几个坑)(下)
【小家Spring】Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method ‘POST‘ not supported (附带其余好几个坑)(下)
【小家Spring】Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method ‘POST‘ not supported (附带其余好几个坑)(下)
|
JSON Dubbo 前端开发
SpringCloud - Feign 调用服务及传递参数踩坑记录(下)
SpringCloud - Feign 调用服务及传递参数踩坑记录(下)
1364 0