zoukankan      html  css  js  c++  java
  • springboot 传List参数

    最近项目有个需求,前台需要传list参数请求controller接口,一开始直接使用ResponseBody注解,但实践下来发现参数没有传到controller。
    现将处理方式记录如下:
     1、前台
    将list参数转换为json字符串: JSON.stringify(list)
     var list=[];
    
     list.push({
    
          "id":1,
    
          "type":2,                  
    
      });
    
     list.push({
    
          "id":2,
    
          "type":3,                  
    
      });
    this.$http.post("/demo/testListParam",{"jsonStr":JSON.stringify(list),"id":parseInt(this.id),"reason":this.reason} , {
    
                }).then(res => {
    
                  if (res.resultCode == 200 ) {
    
                    console.log("data:"+res.data);
    
                   
    
                  } else {
    
                    setTimeout(() => {
    
                      this.instance("error", "提示",  res.message);
    
                    }, 500);
    
                  }
    
                });

    2、controller

    通过String拿到json字符串,再将json字符串转为List.

    StAdjust类有字段id、reason

    @RequestMapping(value = "/demo/testListParam", method = RequestMethod.POST)
    @ResponseBody
    public ResponseVO<Map<String,Object>> test(StAdjust stAdjust, @RequestParam("jsonStr")String listJSON) {
       
        List<Demo> demoList = JSON.parseArray(listJSON,Demo.class);
     
     }





    SpringBoot前端给后端传list

    var taskList = ["123","456"];
    var params = {
        taskList: taskList
    };
    
    $.ajax({
        type: "PUT",
        dataType: "json",
        url: "/client/update",
        data: params,
        success: function (msg) {
        }
    });
    1 @RequestMapping(value = "/update", method = RequestMethod.PUT)
    2 @ResponseBody
    3 public JSONResult updateClient(Client client, @RequestParam(value = "taskList[]") List<String> taskList) {
    4     logger.debug("Yufan taskList={}", taskList);
    5     return JSONResult.ok();
    6 }







    发送的参数Json数据:

    {"id":1,
    
     "shiftDetails":[{"id":1,"lineId":2}],
    
     "broadcasts":[{"id":1,"lineId":1,"imgPath":"TEST1"}, 
    
                   {"id":2,"lineId":2,"imgPath":"TEST2"}]
    
    }

    Controller类:

    @Controller
    
    @RequestMapping("/travelLine")
    
     
    
    public class TravelLineController {
    
     
    
        @RequestMapping("/insertTest")
    
        @ResponseBody
    
        public Json insertTest(@RequestBody TravelLineDomain tl) {
    
            Json j = new Json();
    
            j.setData(tl);
    
            return j;
    
        }
    
     
    
    }

    TravelLineDomain实体类:

    @Table(name = "t_travel_line")
    
    public class TravelLineDomain{
    
     
    
        @Id
    
        @GeneratedValue(generator = "JDBC")
    
        private Integer id;
    
     
    
        private List<ShiftDetailDomain> shiftDetails;
    
        
    
        private List<BroadcastDomain> Broadcasts;
    
     
    
        public Integer getId() {
    
            return id;
    
        }
    
     
    
        public void setId(Integer id) {
    
            this.id = id;
    
        }
    
     
    
        public List<ShiftDetailDomain> getShiftDetails() {
    
            return shiftDetails;
    
        }
    
     
    
        public void setShiftDetails(List<ShiftDetailDomain> shiftDetails) {
    
            this.shiftDetails = shiftDetails;
    
        }
    
     
    
        public List<BroadcastDomain> getBroadcasts() {
    
            return Broadcasts;
    
        }
    
     
    
        public void setBroadcasts(List<BroadcastDomain> broadcasts) {
    
            Broadcasts = broadcasts;
    
        }
    
     
    
    }





    springMVC通过ajax传递参数list对象或传递数组对象到后台

    springMVC通过ajax传递参数list对象或传递数组对象到后台
     
    环境:
    前台传递参数到后台
    前台使用ajax
    后台使用springMVC
    传递的参数是N多个对象
     
    JSON对象和JSON字符串
    在SpringMVC环境中,@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,用 JSON.stringify(data)的方式就能将对象变成字符串。
    同时ajax请求的时候也要指定dataType: “json”,contentType:”application/json” 这样就可以轻易的将一个对象或者List传到Java端!
     
    Content-Type
    服务器为什么会对表单提交和文件上传做特殊处理,因为表单提交数据是名值对的方式,
    而文件上传服务器需要特殊处理,普通的post请求(Content-Type不是application/x-www-form-urlencoded)数据格式不固定,不一定是名值对的方式,所以服务器无法知道具体的处理方式,所以只能通过获取原始数据流的方式来进行解析。
    jquery在执行post请求时,会设置Content-Type为application/x-www-form-urlencoded,所以服务器能够正确解析,而使用原生ajax请求时,如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。
    ---------------------
    第一种方式 传递的参数Bean
    jsp文件:
    $("#saveuddd").click(function(){
        var saveDataAry=[];
        var data1={"name":"test","password":"gz"};
        var data2={"name":"ququ","password":"gr"};
        saveDataAry.push(data1);
        saveDataAry.push(data2);
        $.ajax({
            type:"POST",
            url: basePath + "/user/saveUser",
            dataType:"json",
            contentType:"application/json", // 指定这个协议很重要
            data:JSON.stringify(saveDataAry), 
            //只有这一个参数,json格式,后台解析为实体,后台可以直接用
            success:function(data){
                //do something
            }
        })
    });
    java文件
    @RequestMapping(value = "saveUser", method = {RequestMethod.POST })
    @ResponseBody //此时的user是map数据,并没有解析为bean 不建议使用
    public void savu(User[] users){
        System.out.println(users) ;
    }
    使用如下方法,可以使用bean
    @RequestMapping(value = "saveUser", method = {RequestMethod.POST })
    @ResponseBody
    public void saveu( @RequestBody User[] users ){ 
        System.out.println(users.getName()) ; // 此时的user是实体bean
    }
    --------------------- 

    第二种方式 传递的键值对

    jsp同上
    另外一种:
     @RequestMapping(value = "saveUser", method = {RequestMethod.POST })
     @ResponseBody
     public void saveu( @RequestBody List<Map<String,String>> users ){ 
     // spring MVC只能解析外层的json格式,内部的bean转化为Map格式的键值对,需要对map解析
          List<User> userList = new ArrayList<User>();
          for(Map<String,String> map : users){
              User u = new User();
              u.setName(map.get("name"));
              u.setPassword(map.get("password"));
              userList.add(u);
          }
         //
    --------------------- 

    第三种方式

    能够传递多个参数,但是每一个参数都是字符串(bean类型的数据会转化为JSON格式的字符串)

    jsp文件
    $("#saveuddd").click(function(){
        var saveDataAry=[];
        var data1={"name":"test","password":"gz"};
        var data2={"name":"ququ","password":"gr"};
        saveDataAry.push(data1);
        saveDataAry.push(data2);
        $.ajax({
            type:"POST",
            url: basePath + "/user/saveUser",
            dataType:"json",
            data:{users:JSON.stringify(saveDataAry),aa:"ddd"},
            //可以传递多个参数
            //此时的users内容与另外一个参数:aa 的内容一起传递,所以后台解析为字符串
            //后台接收的users内容:[{"name":"test","password":"gz"},{"name":"ququ","password":"gr"}]
            //后台接收的 aa 内容:"ddd"
            success:function(data){
                // do something
            }
        })
    });
    java文件
    @RequestMapping(value = "saveUser", method = {RequestMethod.POST})
    @ResponseBody
    public void saveu( String users , String aa ){
        System.out.println(users) ;
    }
    --------------------- 

     =========================================================================================

    js前端ajax提交list集合参数至后端

    方法一

                var orderNosList = new Array();
    
                var rows = $("#dg_linkOrder").datagrid("getChecked");
    
                if(rows.length < 1){
    
                    $('#error').dialog('open').dialog('center').dialog('setTitle', '错误提示');
    
                    $('#error').text("请选择一条数据");
    
                }else  {
    
                    for (var i = 0; i < rows.length; i++) {
    
                        orderNosList[i] = rows[i].orderNo;
    
                    }
    
                    
    
                    var params = {
    
                            reserveOrderNoList:orderNosList
    
                         };
    
                                    
    
                    $.ajax({
    
                        url : api.LINK_ORDER_RESERVE_RETRY,
    
                        data : JSON.stringify(params),
    
                        type : 'POST',
    
                        contentType: "application/json",
    
                        dataType : 'json',
    
                        success : function(res) {
    
                            var str = '';
    
                            $(res.reserveFlowList).each(function(i, obj){
    
                                var responseCode = obj.responseCode;
    
                                var orderNo = obj.reserveFlow.orderNo;
    
                                if (responseCode == 0) {
    
                                    str += "订单号为"+ orderNo +"成功<br/>";
    
                                } else {
    
                                    str += "订单号为"+ orderNo + obj.responseMsg +"<br/>"
    
                                }
    
                            });
    
                            
    
                            $('#error2').dialog('open').dialog('center').dialog('setTitle', '提示');
    
                            $('#error2').html(str);
    
                            // 刷新列表
    
                            linkOrder.unfresh_LinkOrder();
    
                        }
    
                    });
    
                }
        @RequestMapping("/http/pss/reserveOrderRetry")
    
        @ResponseBody
    
        public Object reserveOrderRetry(@RequestParam("reserveOrderNoList")List<String> reserveOrderNoList) {
    
            return service.reserveOrderRetry(reserveOrderNoList);
    
        }

    方法二

    var demo = new Object();
    
    demo.name="1";
    
    demo.id="2";
    
    var demo2 = new Object();
    
    demo2.name="1";
    
    demo2.id="2";
    
     
    
    var conditons = [];
    
    conditons.push(demo);
    
    conditons.push(demo2);
    
     
    
    $(function(){
    
      $.ajax({
    
        type:'post',
    
        url:'/http/pss/demo', 
    
            contentType: "application/json",
    
        data:{name:"123",conditions:JSON.stringify(conditons)},
    
        dataType : 'json', 
    
        success:function(data){
    
          console.log(data);
    
        },
    
        error: function (XMLHttpRequest, textStatus, errorThrown){
    
          alert("error");
    
        }
    
      });
    
    });
        @RequestMapping("/http/pss/reserveOrderRetry")
    
        @ResponseBody
    
        public Object reserveOrderRetry(@RequestParam("conditions")List<Demo> conditions,
    
                                        @RequestParam("name")String name) {
    
            
    
        }

     ===================================================================================================================

    ===================================================================================================================

    Spring 接收表单List集合数据

    第一种:

    1.新增类,其中有属性为该对象的集合

    public class SettingModel {
        private List<Setting> sets;
    
        public final List<Setting> getSets() {
            return sets;
        }
    
        public final void setSets(List<Setting> sets) {
            this.sets = sets;
        }
    
        @Override
        public String toString() {
            return "SettingModel [sets=" + sets + "]";
        }
        
    }

    2.表单字段name属性值为数组形式:

    <form action="/user/submitUserList_2" method="post">
            ID:<input type="text" name="users[0].id"><br/>
            Username:<input type="text" name="users[0].name"><br/>
            Password:<input type="text" name="users[0].pwd"><br/><br/>
    
            ID:<input type="text" name="users[2].id"><br/>
            Username:<input type="text" name="users[2].name"><br/>
            Password:<input type="text" name="users[2].pwd"><br/><br/>
            <input type="submit" value="Submit">
    </form>

    3.后台接收:

    @RequestMapping("/update")
    public void update(SettingModel users){ 
      System.out.println(sets);
    }

     第二种:

    1.ajax请求,POST请求、'Content-Type' : 'application/json;charset=utf-8'、data:json(例如:[{"id":"1","content":"14"},{"id":"2","content":"测试修改2"}])

    $.ajax({
                    url:'/update',
                    type:'POST',
                    headers : {  
                            'Content-Type' : 'application/json;charset=utf-8'  
                        },
                    dataType:"json",
                    data:datastr,//datastr=JSON.stringify(datastr);转换为JSON格式
                    success: function(data){
                        alert('111');
                    }
    });

    2.后台接收:

    @RequestMapping(value="/update")
        public void update(@RequestBody List<Setting> sets){
            System.out.println(sets);
        }
    
    
  • 相关阅读:
    length()与trim()函数用法
    软件测试面试题集锦
    数据库索引介绍
    sum 函数语法与应用
    报表测试方法与注意事项
    添加、编辑、删除功能测试点
    登陆测试思路总结
    查询功能测试点总结
    case 函数语法与使用
    js获取地址栏上的Id值
  • 原文地址:https://www.cnblogs.com/dand/p/10179128.html
Copyright © 2011-2022 走看看