今天郁闷。。我的jsp文件里面。有多个复选文本框 <s:checkbox name="deleteIds" value="false" fieldValue="%{userId}">,我用的action用一个整型的数组接收 Integer[] deleteIds; 大家可能应该知道我的思路了。。我的目的是选择复选框,然后根据复选框里面的ID,删除一个或者多个用户但是郁闷的地方来了。。如果我不选择复选框,就给我报错误了 , 错误信息是:“Invalid field value for field 'deleteIds'” 当然 这个错误信息值struts2自带的,这个信息说明类型转换错误了。 我当时就郁闷了为什么会类型转换错误呢??当我把Integer[] deleteIds 换成ArrayList<Integer> deleteIds ,居然又没错。。我用System.out.println(deleteIds ); 打印出来的效果是 "[ognl.NoConversionPossible]" 。说实话这句话是什么意思,我完全不明白。。我原本想的是空,但是不是。(呵呵,如果真的打出空,那我才认为真的有提问了。。还好打出的是个我不知道的东西,ognl原来本来就没接触过。还不是JAVA基础的问题哦。)所以希望 大家解释两点:
1:[ognl.NoConversionPossible] 是什么东西
2:为什么Integer[] deleteIds不行(我想第一个问题说清楚了。这个问题也应该就清楚了。所以重点强调的是第一个问题。)
1:[ognl.NoConversionPossible] 是什么东西
2:为什么Integer[] deleteIds不行(我想第一个问题说清楚了。这个问题也应该就清楚了。所以重点强调的是第一个问题。)
ognl.NoConversionPossible就是说Struts没办法把页面的值转换成你Action里面定义的值
关于为什么换成ArrayList <Integer> deleteIds为什么没有错误 我没有尝试,因为Struts默认情况下是把页面上这种类型的list放到数组里面的,所以用ArrayList的话,只有在loop里面的值的时候Struts才会去转换(你可以debug一下看看Action里面这个ArrayList到底放了什么东西)
知道这个你就有思路怎么改了
这个问题和是不是struts2.0无关。
这个朋友说的没错,
不过,有一点。
checkbox在不选中的情况下,上传的是null。
不是空字符串。
所以你后台要进行空值判断。
这个问题,是IE造成的,
和struts无关。
MVC框架中,
只有spring MVC防了这一点。
不过也产生了垃圾代码。
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%"
struts2缺省使用了一系列的intecerptor,其中就有CheckboxInterceptor。在这个interceptor中,会判断是否选择了任意一个checkbox,如果没有,则将其值设为false(字符串形式)
解决思路:
a. 在页面中加入一个与checkbox同名的hidden input,指定一个特殊的值,在action中进行参数校验时处理
b. 使用不同的模板
c. 禁用Checkbox Interceptor
d. 要求struts修改代码,或者自行修改,增加一个开关项,来选择是否为checkbox生成相应的hidden input