???? 被Struts的html:checkBox標(biāo)簽使用的小問(wèn)題郁悶了兩天,今天終于找到了解決的辦法。如果大家也遇到同樣的問(wèn)題,可以參考。
1)需求:
???? 當(dāng)通過(guò)菜單進(jìn)入頁(yè)面時(shí),頁(yè)面中的checkbox處于被選中狀態(tài),頁(yè)面提交后forward回本頁(yè),對(duì)應(yīng)的checkbox保持提交時(shí)的狀態(tài),也就是說(shuō):如果提交時(shí)checkbox是選中狀態(tài)回來(lái)仍然是選中狀態(tài);如果用戶在提交前將checkbox的勾去掉,回來(lái)時(shí)checkbox應(yīng)該為為選中狀態(tài)。
2)問(wèn)題:
???? 這個(gè)需求看起來(lái)很簡(jiǎn)單,只需要
??? 1)在對(duì)應(yīng)的form中將checkbox對(duì)應(yīng)的屬性設(shè)為true就行了:
????????
private boolean syaken = true;??? 2)在對(duì)應(yīng)的jsp中使用html:checkbox標(biāo)簽就行了
? ? ??
<html:checkbox property="syaken"/>??? 但問(wèn)題是checkbox標(biāo)簽不會(huì)去set初始化值為true的checkbox屬性,不賦初值時(shí)Struts默認(rèn)賦為false;
??? 從網(wǎng)上找資料有人說(shuō)可以實(shí)現(xiàn)ActionFrom的reset()方法將對(duì)應(yīng)的屬性值設(shè)為false,但reset方法是在form實(shí)例化以后被調(diào)用的,也就是說(shuō)你初始化的值true將被重置為false,這和直接將屬性值設(shè)為false沒(méi)有任何區(qū)別,這樣做的結(jié)果是你從菜單進(jìn)入頁(yè)面時(shí)checkbox是處于不被選中的狀態(tài)。
?? 他們之間存在著矛盾,問(wèn)題的關(guān)鍵就是每次提交時(shí),Struts并沒(méi)有去重新設(shè)置所有checkbox的屬性值,而是有選擇地(初始化值為false)地進(jìn)行重新設(shè)置。
3)解決辦法:
???? 超級(jí)簡(jiǎn)單,在checkbox后面添加一個(gè)和checkbox的屬性同名并且value為“false”的隱藏輸入框,強(qiáng)迫Struts去重新設(shè)置checkbox的屬性值:
?????
<html:checkbox property="syaken"/>
? ??? <input type="hidden" name="syaken" value="false">
???這個(gè)問(wèn)題郁悶了我兩天,沒(méi)想到解決辦法這么簡(jiǎn)單。