【问题标题】:Pass array data from javascript in browser to spring mvc controller using ajax使用ajax将数组数据从浏览器中的javascript传递到spring mvc控制器
【发布时间】:2013-07-07 18:28:44
【问题描述】:

我想使用 AJAX 将数组从 web 浏览器中的 javascript 传递到 Spring MVC 控制器

在javascript中,我有

var a = [];
a[0] = 1;
a[1] = 2;
a[2] = 3;

// how about multiple arrays as well?

$.ajax({
    type : "POST",
    url : "/myurl",
    data : //not sure how to write this, ("a="+a), ?
    success : function(response) {
       // do something ... 
    },
    error : function(e) {
       alert('Error: ' + e);
    }
}); 

在Java中,我想创建一个类来接收来自AJAX的数据,我创建一个类来接收数据

package com.amazon.infratool.ui;

import lombok.Getter;
import lombok.Setter;


@Setter @Getter
public class RepairInfomationParameters {
//how to write this variable?
    List<String> a = null; // is it something like this?
}

这样做的正确方法是什么?谢谢!

【问题讨论】:

    标签: javascript jquery ajax arrays spring-mvc


    【解决方案1】:

    您可以从 JavaScript 端执行此操作:

    $.ajax({
        type : "POST",
        url : "/myurl",
        data : {
            myArray: a //notice that "myArray" matches the value for @RequestParam
                       //on the Java side
        },
        success : function(response) {
           // do something ... 
        },
        error : function(e) {
           alert('Error: ' + e);
        }
    }); 
    

    那么在Java端(在Spring 3中),假设这个方法被/myurl映射:

    public String controllerMethod(@RequestParam(value="myArray[]") Integer[] myArray){
        ....
    }
    

    我相信以下方法也会起作用:

    public String controllerMethod(@RequestParam(value="myArray[]") List<Integer> myArray){
        ....
    }
    

    Spring 足够聪明,可以弄清楚如何进行绑定。

    对于多个数组,您可能只想拥有一个命令对象:

    public class MyData {
        private List<Integer> firstArray;
        private List<Integer> secondArray;
        private List<Integer> thirdArray;
    
        ...
        ...
    }
    

    然后在 JavaScript 方面:

    $.ajax({
        type : "POST",
        url : "/myurl",
        data : {            
            myData: {
               "firstArray": firstArray,
               "secondArray": secondArray,
               "thirdArray": thirdArray
            }            
        },
        success : function(response) {
           // do something ... 
        },
        error : function(e) {
           alert('Error: ' + e);
        }
    }); 
    

    在 Java 端,您可以使用 @ModelAttribute 进行绑定:

    public String controllerMethod(@ModelAttribute(value="myData") MyData myData) throws ParseException {
        ....
    }
    

    编辑

    @RequestParam 注释更改为使用myArray[] 而不仅仅是myArray,因为此更改似乎是在首次发布此答案后在 Spring 中进行的。

    【讨论】:

    • 谢谢@vivin,多个数组怎么样?数据:{myArray: a, myArray2: b, ...} ?
    • myArray 应该是像“myArray”这样的字符串吗?
    • @AlfredZhong 我看到你使用了ints 的数组,这就是我使用Integer 的原因。但是你没有理由不能进入String[]List&lt;String&gt;
    • @AlfredZhong 我将第二个示例修改为使用ModelAttribute 而不是RequestParamRequestParam 用于基元。
    • 我得到一个 [object Object] 错误,我猜是 $ajex 将它转换为隐藏的字符串时与数据有关的东西?
    【解决方案2】:

    当您记住数据是从字符串中解析时,将此类数据传递给 Spring MVC 控制器非常简单。因此,如果您想在控制器中获取数组/列表 - 传递数组的字符串化版本:

    public String method(
            @RequestParam(value = "stringParam") String stringParam,
            @RequestParam(value = "arrayParam") List<String> arrayParam) {
        ...
    }
    

    jQuery 对应的 javascript 如下:

    $.post("/urlToControllerMethod",
        {
            "stringParam" : "test",
            "arrayParam" : [1, 2, 3, "test"].toString()
        }
    );
    

    注意:参数类型

    List<String> arrayParam
    

    也可以用等效的数组替换

    String[] arrayParam
    

    【讨论】:

      【解决方案3】:

      除非您使用 myArray[],否则 Vivin Paliath 不起作用

      public String controllerMethod(@RequestParam(value="myArray[]") Integer[] myArray){
          ...
      }
      

      【讨论】:

      • 这似乎也适用于我们的案例,而 Vivin 的回答却没有。
      • 看起来它在春季的最新版本中进行了更新。我会更新我的答案。
      【解决方案4】:

      我最终这样做了,它有效

      在js中,

      var a = [];
      a[0] = 1;
      a[1] = 2;
      a[2] = 3;
      
      
      $.ajax({
          type : "POST",
          url : "/myurl",
          data : "a="+a,  //multiple array, just add something like "&b="+b ...
          success : function(response) {
             // do something ... 
          },
          error : function(e) {
             alert('Error: ' + e);
          }
      }); 
      

      java端,获取类接收数据,使用lombok

      @Setter @Getter 公共类 MyData { 私有 ArrayList a;
      }

      然后在控制器中

      @RequestMapping(value = "/repair_info", method = RequestMethod.POST)
      public ModelAndView myControl(MyData myData) {
          // get data with myData object
      }
      

      【讨论】:

        【解决方案5】:

        如果您使用的是 spring mvc 4,那么下面将是最好的方法

        jQuery 代码

        var dataArrayToSend = []; dataArrayToSend.push("a"); dataArrayToSend.push("b"); dataArrayToSend.push("c");

        // ajax 代码

        $.ajax({ contentType: "application/json", type: "POST", data: JSON.stringify(dataArrayToSend), url: "/appUrl", success: function(data) { console.log('done'); }, error: function(jqXHR, textStatus, errorThrown) { console.log('error while post'); }
        });

        弹簧控制器代码

        @RequestMapping(value = "/appUrl", method = RequestMethod.POST) public @ResponseBody void yourMethod(@RequestBody String[] dataArrayToSend) { for (String data : dataArrayToSend) { System.out.println("Your Data =>" + data); } }

        检查这是否对您有帮助!

        干杯!

        【讨论】:

          【解决方案6】:

          经过全面测试的解决方案

          $.ajax({
              type : "POST",
              url : "/myurl",
              data : {
                  myArray: a //notice that "myArray" matches the value for @RequestParam
                             //on the Java side
              },
              success : function(response) {
                 // do something ... 
              },
              error : function(e) {
                 alert('Error: ' + e);
              }
          }); 
          
          @RequestMapping(value = "/save/", method = RequestMethod.POST)
              public String controllerMethod(@RequestParam(value="myArray[]") List<Integer> myArray){
                  System.out.println("My Array"+myArray.get(0));
                  return "";
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-07-06
            • 2013-08-01
            • 2014-11-21
            • 2015-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-12
            相关资源
            最近更新 更多