Spring MVC请求参数的传递方式

 更新时间:2024年10月28日 08:46:27   作者:2的n次方_  
Spring MVC是一种基于Model-View-Controller(MVC)设计模式的轻量级Web框架,用于Java应用程序的开发,在处理HTTP请求时,Spring MVC会涉及到请求参数的传递,本文给大家介绍了Spring MVC请求参数的传递方式,需要的朋友可以参考下

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

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 是成员变量,是有默认值的,即使如此,还是建议使用包装类型,可以避免一些难以预料的问题

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

4. 传递数组

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

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

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

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

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;
}

6. 传递 JSON 数据

6.1. JSON 语法

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

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

6.2. 传递 JSON

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

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

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

以上就是Spring MVC请求参数的传递方式的详细内容,更多关于Spring MVC请求参数传递的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Java中二叉树的基础概念(递归&迭代)

    详解Java中二叉树的基础概念(递归&迭代)

    二叉树(Binary tree)是树形结构的一个重要类型。本文将通过图片和示例代码详细为大家讲解一下Java中的二叉树的基础概念,需要的可以参考一下
    2022-03-03
  • 老生常谈Java异常处理和设计(推荐)

    老生常谈Java异常处理和设计(推荐)

    下面小编就为大家带来一篇老生常谈Java异常处理和设计(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • java实现同态加密算法的实例代码

    java实现同态加密算法的实例代码

    这篇文章主要给大家介绍了关于java实现同态加密算法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • SpringBoot下载Excel文件时,报错文件损坏的解决方案

    SpringBoot下载Excel文件时,报错文件损坏的解决方案

    这篇文章主要介绍了SpringBoot下载Excel文件时,报错文件损坏的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 一篇文章带你了解java接口与继承

    一篇文章带你了解java接口与继承

    这篇文章主要介绍了Java接口和继承操作,结合具体实例形式分析了Java接口和继承与使用的相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2021-08-08
  • Windows中使用Java生成Excel文件并插入图片的方法

    Windows中使用Java生成Excel文件并插入图片的方法

    这篇文章主要介绍了Windows中使用Java生成Excel文件并插入图片的方法,其中向Excel中插入图片文中通过使用Apache POI来实现,需要的朋友可以参考下
    2016-02-02
  • Java中的JScrollPane使用详细说明

    Java中的JScrollPane使用详细说明

    这篇文章主要给大家介绍了关于Java中JScrollPane使用的相关资料,Java JScrollPane是Swing库提供的一个组件,用于在需要滚动的区域中显示内容,需要的朋友可以参考下
    2024-07-07
  • SpringBoot图文并茂讲解Lombok库的安装与使用

    SpringBoot图文并茂讲解Lombok库的安装与使用

    Lombok想要解决了的是在我们实体Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不会用到,但是某些时候仍然需要复写,以期方便使用的方法;在使用Lombok之后,将由其来自动帮你实现代码生成
    2022-06-06
  • 一文带你了解如何正确使用Java中的字符串常量池

    一文带你了解如何正确使用Java中的字符串常量池

    研究表明,Java堆中对象占据最大比重的就是字符串对象,所以弄清楚字符串知识对学习Java很重要。本文主要重点聊聊字符串常量池,希望对大家有所帮助
    2022-12-12
  • SpringBoot下无节制和数据库建立连接的问题及解决方法

    SpringBoot下无节制和数据库建立连接的问题及解决方法

    本文介绍了无节制建立MySQL连接的危害,包括数据库服务端资源耗尽、应用端性能劣化和监控与运维困境,提出了系统性解决方案,包括连接池标准化配置、代码规范与防御式编程、全链路监控体系和架构级优化,感兴趣的朋友一起看看吧
    2025-03-03

最新评论