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请求参数传递的资料请关注脚本之家其它相关文章!

相关文章

  • springboot整合netty过程详解

    springboot整合netty过程详解

    这篇文章主要介绍了springboot整合netty过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java 全排列的几种实现方法

    Java 全排列的几种实现方法

    本文详细介绍了Java中全排列问题的几种实现方法,包括回溯法、字典序排列法和迭代法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • 使用Java冻结Excel行和列的完整指南

    使用Java冻结Excel行和列的完整指南

    在日常数据处理和报表生成中,Excel 扮演着不可或缺的角色,然而,当面对包含成百上千行、几十乃至上百列的大型 Excel 文件时,反复滚动查看数据往往会带来极大的不便,所以本文旨在提供一份清晰、实用且基于 Java 的解决方案,帮助读者高效地实现 Excel 行和列的冻结操作
    2026-02-02
  • SpringBoot整合flyway实现自动创建表的方法

    SpringBoot整合flyway实现自动创建表的方法

    这篇文章主要介绍了SpringBoot整合flyway实现自动创建表的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 一文教会你如何从0到1搭建一个SpringBoot项目

    一文教会你如何从0到1搭建一个SpringBoot项目

    今天刚好学习到SpringBoot,就顺便记录一下吧,下面这篇文章主要给大家介绍了关于如何从0到1搭建一个SpringBoot项目的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Spring boot集成RabbitMQ的示例代码

    Spring boot集成RabbitMQ的示例代码

    本篇文章主要介绍了Spring boot集成RabbitMQ的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java指令重排序在多线程环境下的处理方法

    Java指令重排序在多线程环境下的处理方法

    指令重排在单线程环境下有利于提高程序的执行效率,不会对程序产生负面影响,本文对多线程指令重排问题进行复原,并针对指令重排给出相应的解决方案,需要的朋友参考下吧
    2022-04-04
  • Mac安装和配置Java JDK的完整教程

    Mac安装和配置Java JDK的完整教程

    文章详细介绍了Java JDK的相关知识,包括JDK的定义、核心组成、版本说明、安装方法、环境变量配置、常见问题及解决方案,并提供了在Mac上安装和配置JDK的具体步骤,最后,还给出了后续学习建议,强调了配置完成后的开发步骤,需要的朋友可以参考下
    2026-04-04
  • Java实现文件和base64流的相互转换功能示例

    Java实现文件和base64流的相互转换功能示例

    这篇文章主要介绍了Java实现文件和base64流的相互转换功能,涉及Java文件读取及base64 转换相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • Java 嵌入数据引擎从 SQLite 到 SPL详解

    Java 嵌入数据引擎从 SQLite 到 SPL详解

    这篇文章主要介绍了Java 嵌入数据引擎:从 SQLite 到 SPL,SQLite架构简单,其核心虽然是C语言开发的,但封装得比较好,对外呈现为一个小巧的Jar包,能方便地集成在Java应用中,本文给大家介绍的非常详细,需要的朋友参考下
    2022-07-07

最新评论