在没有jquery的情况下将Javascript数组发送到Spring Controller

时间:2014-07-30 13:11:19

标签: javascript arrays spring jsp

我需要从JSP页面向Spring Controller发送一个数组。在我的JSP中,我得到了我需要的东西,然后,我开始一个AJAX请求:

var ajaxRequest;  

    try{
        // Opera 8.0+, Firefox, Safari
        ajaxRequest = new XMLHttpRequest();
    } catch (e){
        // Internet Explorer Browsers
        try{
            ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try{
                ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e){
                // Something went wrong
                alert("Your browser broke!");
                return false;
            }
        }
    }

    ajaxRequest.open('POST', 'saveRecompensas.action');

    ajaxRequest.send('array='+array);

在控制器中:

@RequestMapping ("/proyecto/saveRecompensas")
public String saveRecompensas(@RequestParam ("array") String[] array, HttpSession session){
//public String saveRecompensas(){  
System.out.println(Method saveRecompensas called");

    return null;        
}

如您所见,我有两种方法签名。那是因为,如果我使用没有@RequestParam(“array”)String []数组的那个,那么该方法被称为ok。但我需要那个阵列。如果我使用RequestParam,则永远不会调用该方法。

这是从JSP发送数组到数组的正确方法吗?我做错了什么?谢谢。

1 个答案:

答案 0 :(得分:1)

您的问题与数据绑定有关,因为您没有遵循数据绑定在Spring中的工作方式。所以Spring有一种特定的方式来进行数据绑定。数据绑定是获取数据流并将其转换为语言中的对象和本机数据类型,或将数据从流绑定到一系列对象的过程。你可以让Spring为你做这个,或者你可以自己做。鉴于你正在以艰难的方式编写所有内容,我将假设你喜欢自己做的模型。所以让我们跳过自动类型转换的解释,这里是“我可以自己做爸爸”的方式。

  1. 更改@RequestParam(“array”)String [] array - > @RequestParam(“array”)String inputArray
  2. 在你的方法体中String [] array = inputArray.split(“,”)
  3. Viola你有你的阵列。虽然您在Javascript中添加参数的方法存在问题,因为您没有使用encodeURI()来正确转义字符串,但是当您的输入发生更改时,此方法会出现问题。

    现在,如果您对更复杂的数据绑定或使您的示例工作感到好奇。你需要按照Spring理解的方式对其进行编码。这与您在Javascript中的工作方式有关。如果参数名在参数字符串上多次出现,Spring将意识到某个东西是一个数组。例如,

    http://somedomain.com/some/url?array=first&array=second&array=third

    如果您对数组进行如下编码:

    ajaxRequest.send( array.reduce( function( prev, curr ) { 
       return prev + (prev.length > 0 ? "&" : "") + "array=" + encodeURI( curr ); 
    }, "" ) );
    

    请注意,encodeURI(curr)调用会围绕数组的值,因此使用空格之类的输入不会搞砸对服务器的调用。

    最后,如果你真的做了很多事情,你可能会考虑使用JSON来发送数据,因为它允许在服务器上使用更复杂的数据结构(对象等)。