页面上有一组checkbox,映射到action中的 int[]。当不选中任何checkbox时出错。
环境:
jdk 1.5
struts 2.0.11.2
xwork 2.0.5
在struts.xml中设置:
Console出错信息:
分析:
1、做了两断代码对比,都是生成一组checkbox,一个用手写的 <input type="checkbox">,另一个用struts2标签 <s:checkbox>
结果:手写的,服务器得到的是null,可以正常处理;用struts2标签,得到false,无法转换为int[],出错。
2、看struts2源码
发现原因在于struts2 checkbox 的template 和interceptor.
在simple template中,对于每一个checkbox,都会生成一个hidden input,其name为"__checkbox_%checkbox的name%" 。看源码是希望找到开关设置不生成hidden input代码,可惜没有这个开关,一定会生成。
struts2缺省使用了一系列的intecerptor,其中就有CheckboxInterceptor。在这个interceptor中,会判断是否选择了任意一个checkbox,如果没有,则将其值设为false(字符串形式)
相应代码如下:
解决思路:
a. 在页面中加入一个与checkbox同名的hidden input,指定一个特殊的值,在action中进行参数校验时处理
b. 使用不同的模板 //TODO
c. 设置不使用Checkbox Interceptor (需要自行指定interceptor-ref,不能使用default)
d. 修改struts代码,增加一个开关项,来选择是否为checkbox生成相应的hidden input (最好struts修改,自行修改会带来后续问题)