现在的位置: 首页 > 综合 > 正文

Struts的html:checkBox标签超郁闷的问题

2012年12月06日 ⁄ 综合 ⁄ 共 1604字 ⁄ 字号 评论关闭

1)需求:
当通过菜单进入页面时,页面中的checkbox处于被选中状态,页面提交后forward回本页,对应的checkbox保持提交时的状态,也就是说:如果提交时checkbox是选中状态回来仍然是选中状态;如果用户在提交前将checkbox的勾去掉,回来时checkbox应该为为选中状态。

2)问题:
这个需求看起来很简单,只需要
1)在对应的form中将checkbox对应的属性设为true就行了:
private boolean syaken = true;
2)在对应的jsp中使用html:checkbox标签就行了
<html:checkbox property="syaken"/>
但问题是checkbox标签不会去set初始化值为true的checkbox属性,不赋初值时Struts默认赋为false;
从网上找资料有人说可以实现ActionFrom的reset()方法将对应的属性值设为false,但reset方法是在form实例化以后被调用的,也就是说你初始化的值true将被重置为false,这和直接将属性值设为false没有任何区别,这样做的结果是你从菜单进入页面时checkbox是处于不被选中的状态。
他们之间存在着矛盾,问题的关键就是每次提交时,Struts并没有去重新设置所有checkbox的属性值,而是有选择地(初始化值为false)地进行重新设置。

3)解决办法:
超级简单,在checkbox后面添加一个和checkbox的属性同名并且value为“false”的隐藏输入框,强迫Struts去重新设置checkbox的属性值:
<html:checkbox property="syaken"/>&nbsp;
<input type="hidden" name="syaken" value="false">
=================================================================================
以上为转载。

经过本人尝试之后,觉得此方法是行得通的。

其实multibox也存在相似问题。
假设: 在 form 里面定义 : private String[] seqNum = null;
当 seqNum 长度为 “1”的时候,也就是 jsp上显示的multibox 的个数为一个。
这个时候,在javascript里使用:
document.all.seqNum[0] , 通过alert(document.all.seqNum[0] ),发现结果是undefined,并不是我们所期望得到的checkbox的对象。
如果 seqNum 的长度 〉1, 则不出现以上的问题。

同时:如果 seqNum 的长度 = 1时,multibox提交到后台时,出现了上文同checkbox的选中状态不正确的问题。

现在自己解决的方法就是:加一个隐藏域。
<input type="hidden" name="seqNum" value="-1">
这样作就增加了 seqNum 的长度,使其长度 > 1,暂时解决了提交问题。

假设: 某一览画面有multibox,并且对应3组数据。
作如下操作:1.第一条记录的checkbox钩上,提交,form得到第一条数据
2.把刚才钩上的checkbox钩掉,提交,form还是得到第一条数据,
并不是我们所想象的 seqNum = null 或者 seqNum.length=0。

解决方案还是原来的方法:
<input type="hidden" name="seqNum" value="false">
其中 value 只要不与 其他multibox混淆,理论上可以用任意值。

注:
document.all.seqNum[0] 指的是隐藏 seqNum 的值。

document.all.seqNum[1] 开始往后指的才是 真正画面上Multibox的东西。

但是这样做也会给一些其他的操作和算法带来麻烦,并不是万能的。

抱歉!评论已关闭.