当表单中存在数组时(假定依次输入了1,2,3):
<form>
<input type="text" name="param"/>
<input type="text" name="param"/>
<input type="text" name="param">
<input type="submit"/>
</form>
表单提交传递的字符串为:param=1¶m=2¶m=3
传统的Servlet只能接收数组中第一个参数。
publicclass ServletA extends HttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getParameter("param"));
}
}
Struts2则能接收多个参数并自动填充数组。
publicclass A {
private String param[];
public String[] getParam() {
returnparam;
}
publicvoid setParam(String[] param) {
this.param = param;
}
publicvoid execute(){
for(int i=0;i<this.param.length;i++){
System.out.println(this.param[i]);
}
}
}
有时候HTML代码也会这样写:
<form>
<input type="text" name="param[0]"/>
<input type="text" name="param[1]"/>
<input type="text" name="param[2]">
<input type="submit"/>
</form>
然而,此时Struts2则会抛出空指针异常。
事实上第一种方式Struts2只接收了一个参数,参数的值为1,2,3,Struts2将接收到的参数依照Action中定义的类型自动转换成了长度为3的字符串数组
而第二种方式Struts2则接收了三个参数,参数值分别为1、2、3,这三个参数是依次接收的,在尚未接收完之前Struts2并不能得到数组的长度,因而不能创建数组
要想使得此种方式下Struts2依旧能工作就要手动为数组赋值:
private String param[] = new String[3];
另外,有时也会使用jQuery进行ajax请求:
$.ajax({
data:{param:[1,2,3]},
url:"a"
});
结果Struts2后台竟然抛出异常了,调试发现jQuery进行请求时发送的数据为:param%5B%5D=1¶m%5B%5D=2¶m%5B%5D=3
经过解析后也就是:param[]=1¶m[]=2¶m[]=3
这是jQuery专为适配php和Python框架而自动增加的内容,然而Struts2并不支持
为了确保jQuery ajax请求的参数能被Struts2框架识别,jQuery代码应该这样写:
$.ajax({
data:{param:[1,2,3]},
traditional:true,
url:"a"
});
此时的发送的数据就是传统的:param=1¶m=2¶m=3