【解決】關於Struts2 Checkbox標籤回填的辦法
Struts2自帶著許多標籤,控制和資料部分的使用較多,UI部分的標籤其實用得並不多,但實然用到了,有時可能會讓你措手不及,就拿Checkbox標籤的回填來說。
Struts2對Checkbox標籤的描述如下:
Description
Renders an HTML input element of type checkbox, populated by the specified property from the ValueStack.
生成一個型別為checkbox的HTML input 元素,顯示值棧中一個指定的屬性。(本人英語一般,若翻譯不當,請見諒
從以上的意見得知,Checkbox標籤在頁面編譯後,會自動轉成對應的HTML程式碼,
Html程式碼- <input type="checkbox" name="name" value="name" checked="checked" id="name"/>
- <input type="hidden" id="__checkbox_name" name="__checkbox_name" value="name" />
-
<label for="name" class="checkboxLabel">測試</label>
JSP中的程式碼如下:
Jsp程式碼- <s:checkbox label="測試2" name="name" value="false" fieldValue="name" />
大家會發現編譯後的HTML程式碼除了產生一個checkbox型別的input元素,同時也產生對應的一個隱藏域元素,對於這個隱藏域的作用,還未研究。(這次主要講回填的,先忽略)
重點:在Checkbox這個標籤中,有兩個關鍵的屬性(value 和 fieldValue) ,先來看看Struts2給出的官方文件說明。
value:Preset the value of input element. (事先調整input元素的值)
fieldValue: The actual HTML value attribute of the checkbox(checkbox真實的HTML 屬性值)
從以上的解釋來看,Struts2 Checkbox這個標籤的特別之處在於 value值並不是真正代表這個複選框的屬性,而 fieldValue值才是真正的屬性值。
情景一:
JSP中的程式碼(無fieldValue屬性):
Jsp程式碼- <s:checkbox label="測試2" name="name" value="false" />
編譯後的HTML:
Html程式碼- <input type="checkbox" name="name" value="true" id="name"/>
- <input type="hidden" id="__checkbox_name" name="__checkbox_name" value="true" />
- <label for="name" class="checkboxLabel">測試2</label>
頁面上的顯示的“測試2” 複選框未被選中!(請大家複製程式碼試驗,至於value值為true,我未試過接收,有興趣的朋友可以試試,告訴我。)
情景二:
JSP中的程式碼 (有fieldValue屬性 且name在ValueStack中有值):
Jsp程式碼- <s:checkbox label="測試2" name="name" value="false" fieldValue="name" />
編譯後的HTML:
Html程式碼- <input type="checkbox" name="name" value="name" id="name"/>
- <input type="hidden" id="__checkbox_name" name="__checkbox_name" value="name" />
- <label for="name" class="checkboxLabel">測試2</label>
測試2 仍然未被選中!
情景三:
JSP中的程式碼:
Jsp程式碼- <s:checkbox label="測試2" name="name" value="true" />
編譯後的HTML:
Html程式碼- <input type="checkbox" name="name" value="true" checked="checked" id="name"/>
- <input type="hidden" id="__checkbox_name" name="__checkbox_name" value="true" />
- <label for="name" class="checkboxLabel">測試2</label>
測試2被選中了。。。但你會發現,生成的HTML中,value屬性的值為true。這樣就沒有意義了。
情景四:
JSP中的程式碼:
Jsp程式碼- <s:checkbox label="測試2" name="name" value="true" fieldValue="%{name}" /><!--OGNL表示式 用%{}區別-->
編譯後的HTML:
Html程式碼- <input type="checkbox" name="name" value="aaa" checked="checked" id="name"/>
- <input type="hidden" id="__checkbox_name" name="__checkbox_name" value="aaa" />
- <label for="name" class="checkboxLabel">測試2</label>
測試2被選中,且生成的HTML程式碼中value屬性值回填了。
所以,value和fieldValue兩個屬性通常是一塊使用的。且為了讓其預設選中,我們可以使用Struts的if標籤,具體程式碼如下:
Jsp程式碼- <s:if test="%{name=='aaa'}"><s:checkbox label="測試1" name="name" value="true" fieldValue="%{name}" /></s:if>
- <s:else><s:checkbox label="測試2" name="name" value="false" fieldValue="bbb"/></s:else>
補充:根據value屬性中的值(true or false)判斷是否選中,所以也可以使用三目運算子,
例如:1=1?'true':'false',或者是 1=1?'1:0 (非0的都表示真,0表示假) ;
實現回填的方式還有其他的,大家也可以搜尋一下,如使用JavaScript,這裡我就不重複說明了。
個人總結,Struts2 checkbox適用的場景為“是、否;有、無;符合、不符合;男、女”等這樣的情況;如果選擇的專案較多,應該使用checkboxlist標籤為佳!
備註:Struts2版本為2.2.1