我需要从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发送数组到数组的正确方法吗?我做错了什么?谢谢。
答案 0 :(得分:1)
您的问题与数据绑定有关,因为您没有遵循数据绑定在Spring中的工作方式。所以Spring有一种特定的方式来进行数据绑定。数据绑定是获取数据流并将其转换为语言中的对象和本机数据类型,或将数据从流绑定到一系列对象的过程。你可以让Spring为你做这个,或者你可以自己做。鉴于你正在以艰难的方式编写所有内容,我将假设你喜欢自己做的模型。所以让我们跳过自动类型转换的解释,这里是“我可以自己做爸爸”的方式。
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来发送数据,因为它允许在服务器上使用更复杂的数据结构(对象等)。