在struts2支持功能強大的類型轉換,它通過提供了一個StrutsTypeConverter抽象類,它是DefaultTypeConverter類的子類,用戶在使用時需要實現以下兩個類
convertFromString(Map context,String[] values,Class toType),它是字符串轉換成復合類型,其中為了滿足html中的多種請求參數形式如復合列表框,把參數values設成字符串數組形式。
converttoString(Map context,Object o),它是從復合類型轉換成字符串類型的方法
實現了自定義類型轉換器后,將該類型轉換器注冊在Web應用中,Struts2才能正常使用它。
Struts2提供了3種注冊方式:
1. 注冊成局部類型轉換器
在與*Action.class相同位置下提供一個ActionName-conversion.properties的Properites,文件 由key-value組成,內容如下:
propertyName=類型轉換器類(需要加包前綴)
2. 注冊成全局類型轉換器
為了讓系統中的多個Action重復使用類型轉換器類,需要把類型轉換器類設置成全局類型轉換器:它需要在classes目錄提供一個xwork-conversion.properties文件,內容由“復合類型=對應類型轉換器”項組成,它們都需要提供完整的包前綴。
3. 使用JDK1.5的注釋來注冊
由于Struts2內建了OGNL表達式的支持,所以比較常用,簡單的方式是把html的請求屬性名直接設置成Action中VO的值.屬性形式。
比如一個User的Bean包括兩個屬性name和pass,在Action中它的變量為user變量對象,則在html表單中可以直接把請求參數名user.name和user.pass,這樣struts2就會自動轉換。
另外,Struts2支持數組,集合屬性的類型轉換器,其中在集合轉換器中為了讓系統了解集合中元素的類型,有兩種方法:
- 使用泛型來限制集合的元素的類型。
- 使用了Struts2的配置文件,使用局部類型轉換的配置文件來指定集合元素的數據類型,其中格式如下:
對于List類型:Element_xxx=復合類型(xxx表示屬性名,以下也是)
而對于Set類型:
Element_xxx=復合類型
KeyProperty_xxx=name (其中name為set索引屬性名)
類型轉換中錯誤處理:
Struts內置了類型轉換攔截器,它負責將對應錯誤封裝成表單域錯誤信息(fieldErro),并將其放入ActionContext中。為了在input視圖對應的頁面中顯示錯誤信息,只需要在頁面中使用<s:fielderror/>標簽就可輸出類型轉換的錯誤信息,其中可以通過在應用的國際化資源文件中增加代碼來修改類型轉換失敗后的提示信息:
Xwork.default.invald.fieldvalue={0} 字段類型轉換失敗!.(非西歐字符,需要用native2ascii轉換)
以上改變的是全局的錯誤信息提示,若需要對特定字段指定特別的提示信息,可以提供Action的局部資源文件,文件名為ActionName.properties,在文件中增加一行如下項:
Invald.fieldvalue.屬性名=提示信息
在使用《struts2權威指南》中,犯了兩個錯誤:
1. 在局部與全部類型轉換配置文件中,給整暈了------在局部文件中寫了
包名.復合類型==類型轉換器類 局部類型轉換的配置文件中,紅色部分為屬性名
2. 在寫Action中的一個屬性的getXXX方法,把它的訪問使用private了,然后在結果的視圖頁面中就是無法顯示其結果(能顯示才怪呢),我找了半天找到這個小錯誤。。。