日期:2014-05-17  浏览次数:20752 次

Struts的html:checkBox标签问题

Struts的html:checkBox标签问题 讨论

摘要 : Struts的html:checkBox标签问题 讨论
<script type="text/javascript">&lt;!-- google_ad_client = &quot;pub-5801877696325956&quot;; /* JavaNB_Article_View_300x250 */ google_ad_slot = &quot;5136578536&quot;; google_ad_width = 300; google_ad_height = 250; //--&gt; </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script><script>google_protectAndRun(&quot;ads_core.google_render_ad&quot;, google_handleError, google_render_ad);</script> 1)需求:

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

2) 问题:
这个需求看起来很简单,只需要
1)在对应的form中将checkbox对应的属性设为true就行了:
private boolean syaken = true;
2)在对应的jsp中使用html:checkbox标签就行了

但问题是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的属性值:
&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,暂时解决了提交问题。
但是这样做也会给一 些其他的操作带来麻烦,并不时万能的。

总之解决这些问题有各种各样的做法,具体应该视具体情况而定,不知道各位大虾有没有更好的方法来解 决这样的问题呢?提供给 小弟参考参考。拜谢!