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