springMVC传递list对象的三种使用方式

 更新时间:2023年11月03日 09:14:48   作者:陈袁  
这篇文章主要介绍了springMVC传递list对象的三种使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

springMVC接收List对象以及List对象与其它对象一起传参数的使用方法

概念

ajax请求里Content-type2个常用类型

application/x-www-form-urlencoded:传递的key/value会经过URL转码,所以如果传递的参数存在中文或者特殊字符需要注意。

默认编码方式。

//例子
//b=曹,a=1
POST  HTTP/1.1(CRLF)
Host: www.example.com(CRLF)
Content-Type: application/x-www-form-urlencoded(CRLF)
Cache-Control: no-cache(CRLF)
(CRLF)
b=%E6%9B%B9&a=1(CRLF)
//这里b参数的值"曹"因为URL转码变成其他的字符串了

-application/json:application/json用来告诉服务端消息主体是序列化后的 JSON 字符串,重点是使用JSON.stringify(data)将json对象转化是json字符串。

JSON对象和JSON字符串

在使用@RequestBody注解时,在SpringMVC环境中,@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。

然而在ajax请求往往传的都是Json对象,用 JSON.stringify(data)的方式就能将对象变成字符串。

同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样就可以轻易的将一个对象或者List传到Java端。

@RequestBody与contentType:"application/json"必需配合使用,且数据是字符串。

dataType与contentType

  • contentType:指定向后台传递数据编码格式
  • dataType:指定后台返回数据格式

对象复杂度

传单个key-value,或基本类型的数组最简单,稍微复杂一点的是传对象数组([object]),最复杂的是对象数组与key-value一起传到后台

dispatchServlet-mvc.xml配置

$("#test").click(function(){
    var testData={"nameIds": [1,2,3], "age": 18}
    $.ajax({
        type:"POST",
        url: basePath + "/test/testInOut",
        dataType:"json",
        contentType:"application/x-www-form-urlencoded", // 指定这个协议很重要
        data:faultList, //只有这一个参数,json格式,后台解析为实体,后台可以直接用
        success:function(data){
        }
    });
})

或者更简单的写法

<mvc:annotation-driven/> 

最简单:单个数组对象和key-value就比较简单了

前端

$("#test").click(function(){
    var testData={"nameIds": [1,2,3], "age": 18}
    $.ajax({
        type:"POST",
        url: basePath + "/test/testInOut",
        dataType:"json",
        contentType:"application/x-www-form-urlencoded", // 指定这个协议很重要
        data:faultList, //只有这一个参数,json格式,后台解析为实体,后台可以直接用
        success:function(data){
        }
    });
})

重点

  • contentType:"application/x-www-form-urlencoded",一般使用这个当然我们也可以使用
  • application/json(它需要序列化json数据)

后端

//controller层
 @RequestMapping(value = "/test/testInOut")
 @ResponseBody
 public void testInOut(Integer[] nameIds, Integer age){ 
      System.out.println(nameIds, age) ;
 }

重点

  • Integer[] nameIds:接收数组

稍微复杂:只接收对象数组

下面要使用到的pojo类

//POJO对象传输对象   RepairFaultList.java
public class RepairFaultList{
    private Integer id;
    private String faultName;//故障名称
    private String employeeGroup;//所属工组
    //getter  setter
}

下面还会使用RepairFaultList.java,需要传递的结构体。

前端

$("#test").click(function(){
     //对象数组
     var faultList=[];
     var data1={id:1,"faultName":"机电有问题","employeeGroup":"机电"};
     var data2={id:2,"faultName":"钣金有问题","employeeGroup":"钣金"};
     faultList.push(data1);
     faultList.push(data2);
    $.ajax({
        type:"POST",
        url: basePath + "/test/testInOut",
        dataType:"json",
        contentType:"application/json", // 指定这个协议很重要
        data:JSON.stringify(faultList), //只有这一个参数,json格式,后台解析为实体,后台可以直接用
        success:function(data){
        }
    });
})

重点

  • contentType:"application/json"
  • JSON.stringify(faultList)

这里传入的是一个数组,直接使用JSON.stringify(faultList)序列化数据,不是{"faultList":faultList},相应的后端接收数据的地方也只有一个参数。

后端

//controller层
 @RequestMapping(value = "/test/testInOut", method = {RequestMethod.POST })
 @ResponseBody
 public void testInOut( @RequestBody List<RepairFaultList> faultList ){ 
 //此时的faultList是map数据,并没有解析为bean // 不建议使用
      System.out.println(users) ;
 }

//使用如下方法,可以使用bean
 @RequestMapping(value = "/test/testInOut", method = RequestMethod.POST)
 @ResponseBody
 public void testInOut( @RequestBody RepairFaultList[] faultList ){ 
     // 此时的faultList是实体bean
      System.out.println(users.getName()) ; 
 }

重点

  • RepairFaultList[]或List<RepairFaultList>
  • method=RequestMethod.POST,指定post请求方式
  • @RequestBody注意faultList是随机命名,没要求。

还有种不需要POJO对象的写法,比较另类,代码如下

//前端同上
//controller层
 @RequestMapping(value = "/test/testInOut", method = RequestMethod.POST)
 @ResponseBody
 public void testInOut( @RequestBody List<Map<String,String>> faultList ){ // spring MVC只能解析外层的json格式,内部的bean转化为Map格式的键值对,需要对map解析
      List<RepairFaultList> result = new ArrayList<RepairFaultList>();
      for(Map<String,String> map : faultList){
          RepairFaultList u = new RepairFaultList();
          //一系列get  set数据
      }
     // 这里就可以使用 result 了
 }

最复杂:对象数组与key-value一起传

使用@RequestBody与json一起操作,上面说过,application/json用来告诉服务端消息主体是序列化后的 JSON 字符串。

前端

前端请求

     //基本数据类型数组对象
     var operatorIds = [1,2,3];
     //对象数组
      var faultList=[];
      var data1={id:1,"faultName":"机电有问题","employeeGroup":"机电"};
      var data2={id:2,"faultName":"钣金有问题","employeeGroup":"钣金"};
      faultList.push(data1);
      faultList.push(data2);
      var testData={operatorIds:operatorIds,repairBillId: 110,faultList: faultList};
      $.ajax({
          type:"POST",
          url: basePath + "/test/testInOut",
          dataType:"json",
          contentType: application/json,
          data:JSON.stringify(testData), //只有这一个参数,json格式,后台解析为实体,后台可以直接用
          success:function(data){
          }
      });
  })

重点

  • contentType: application/json,指定数据编码格式
  • JSON.stringify(testData)序列化数据,字符串

后台

//POJO对象   创建一个对象由于存放key-value和对象数组  AppointPrePersonRo.java
public class AppointPrePersonRo {
    private Integer[] operatorIds;
    private List<RepairFaultList> faultList;
    private Integer repairBillId;
    //getter setter
}

//controller层
@RequestMapping(value = "/test/testInOut")
@ResponseBody
 public String testInOut(@RequestBody  AppointPrePersonRo appointPrePersonRo) {
         return "sucess";
     }
 }

这样就可以接收对象数组和key-value混合的数据。

重点

- 创建AppointPrePersonRo类,由于保存接收的数据对象

- @RequestBody注解,必需与application/json配合使用

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • yaml配置对象map使用示例

    yaml配置对象map使用示例

    这篇文章主要为大家介绍了yaml配置对象map使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 实例分析java对象的序列化和反序列化

    实例分析java对象的序列化和反序列化

    序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化
    2018-09-09
  • Java微信支付之服务号支付代码示例

    Java微信支付之服务号支付代码示例

    这篇文章主要介绍了Java微信支付之服务号支付代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java 使用Docker时经常遇到的五个问题

    Java 使用Docker时经常遇到的五个问题

    这篇文章主要介绍了Java 使用Docker时经常遇到的五个问题的相关资料,需要的朋友可以参考下
    2016-10-10
  • JavaWeb Session失效时间设置方法

    JavaWeb Session失效时间设置方法

    这篇文章主要介绍了JavaWeb Session失效时间设置方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • SpringBoot整合XxlJob分布式任务调度平台

    SpringBoot整合XxlJob分布式任务调度平台

    xxl-job是一个开源的分布式定时任务框架,它可以与其他微服务组件一起构成微服务集群。它的调度中心(xxl-job)和执行器(自己的springboot项目中有@XxlJob("定时任务名称")的方法)是相互分离,分开部署的,两者通过HTTP协议进行通信
    2023-02-02
  • Java使用fill()数组填充的实现

    Java使用fill()数组填充的实现

    这篇文章主要介绍了Java使用fill()数组填充的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 使用javaMail实现发送邮件

    使用javaMail实现发送邮件

    这篇文章主要为大家详细介绍了使用javaMail实现发送邮件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 解析spring-security权限控制和校验的问题

    解析spring-security权限控制和校验的问题

    这篇文章主要介绍了解析spring-security权限控制和校验的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • mybatis中的扩展实现源码解析

    mybatis中的扩展实现源码解析

    这篇文章主要介给大家绍了关于mybatis中扩展实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01

最新评论