1. 程式人生 > >【解決】關於Struts2 Checkbox標籤回填的辦法

【解決】關於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程式碼  收藏程式碼
  1. <input type="checkbox" name="name" value="name" checked="checked" id="name"/>  
  2. <input type="hidden" id="__checkbox_name" name="__checkbox_name" value="name" />  
  3. <label for="name" class="checkboxLabel">測試</label>
      

    JSP中的程式碼如下:

Jsp程式碼  收藏程式碼
  1. <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程式碼  收藏程式碼
  1. <s:checkbox label="測試2" name="name" value="false" />  

    編譯後的HTML:

Html程式碼  收藏程式碼
  1. <input type="checkbox" name="name" value="true" id="name"/>  
  2. <input type="hidden" id="__checkbox_name" name="__checkbox_name" value="true" />  
  3. <label for="name" class="checkboxLabel">測試2</label>   

    頁面上的顯示的“測試2” 複選框未被選中!(請大家複製程式碼試驗,至於value值為true,我未試過接收,有興趣的朋友可以試試,告訴我。)

  情景二:

     JSP中的程式碼 (有fieldValue屬性 且name在ValueStack中有值):

Jsp程式碼  收藏程式碼
  1. <s:checkbox label="測試2" name="name" value="false" fieldValue="name" />  

    編譯後的HTML:

Html程式碼  收藏程式碼
  1. <input type="checkbox" name="name" value="name" id="name"/>  
  2. <input type="hidden" id="__checkbox_name" name="__checkbox_name" value="name" />   
  3. <label for="name" class="checkboxLabel">測試2</label>   

  測試2 仍然未被選中!

  情景三:

    JSP中的程式碼:

Jsp程式碼  收藏程式碼
  1. <s:checkbox label="測試2" name="name" value="true" />  

    編譯後的HTML:

Html程式碼  收藏程式碼
  1. <input type="checkbox" name="name" value="true" checked="checked" id="name"/>  
  2. <input type="hidden" id="__checkbox_name" name="__checkbox_name" value="true" />  
  3. <label for="name" class="checkboxLabel">測試2</label>  

    測試2被選中了。。。但你會發現,生成的HTML中,value屬性的值為true。這樣就沒有意義了。

  情景四:

    JSP中的程式碼: 

Jsp程式碼  收藏程式碼
  1. <s:checkbox label="測試2" name="name" value="true" fieldValue="%{name}" /><!--OGNL表示式 用%{}區別-->  

    編譯後的HTML:

Html程式碼  收藏程式碼
  1. <input type="checkbox" name="name" value="aaa" checked="checked" id="name"/>  
  2. <input type="hidden" id="__checkbox_name" name="__checkbox_name" value="aaa" />  
  3. <label for="name" class="checkboxLabel">測試2</label>  

    測試2被選中,且生成的HTML程式碼中value屬性值回填了。

   所以,value和fieldValue兩個屬性通常是一塊使用的。且為了讓其預設選中,我們可以使用Struts的if標籤,具體程式碼如下:

Jsp程式碼  收藏程式碼
  1. <s:if test="%{name=='aaa'}"><s:checkbox label="測試1" name="name" value="true" fieldValue="%{name}" /></s:if>  
  2. <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