自定義型別轉換器--區域性和全域性
1、 註冊區域性型別轉換器
區域性型別轉換器的作用範圍為Action範圍。註冊區域性型別轉換器需要建立一個命名規則為ActionName-conversion.properties的屬性檔案,該屬性檔案儲存在與Action類檔案相同的目錄下。ActionName就是使用型別轉換器的Action實現類的類名,而後面的“-conversion.properties”是固定的格式。該檔案是一個標準的屬性檔案,內容為標準的Key-Value格式,該鍵值對定義如下:
propertyName=型別轉換器
例如:RegistProductAction-conversion.properties屬性檔案的內容如下:
userAge=edu.converter.IntegerTypeConverter
product.productId=edu.converter.StrutsTypeConverter
product.createDate=edu.converter.DateTypeConverter
2、 註冊全域性型別轉換器
註冊一個全域性型別轉換器,需要建立一個xwork-conversion.properties屬性檔案,該檔案需要儲存在class路徑的根目錄下,如WEB-INF/classes。該檔案同樣由多個標準的Key-Value鍵值對組成,其內容定義為“複合型別-對應的型別轉換器”,其中複合型別就是Action中需要型別轉換的型別屬性,對應的型別轉換器就是轉換該複合型別的對應轉換器。
示例:xwork-conversion.properties檔案內容如下:
java.util.Date=edu.converter.DateTypeConverter
3. 基於OGNL的型別轉換器
Struts2的型別轉換器都需要實現一個TypeConverter介面,該介面位於ognl.jar包內,也是就Struts2框架的轉換器使用了OGNL技術。該介面定義了一個convertValue()方法,實現該介面的型別轉換器實現類都需要重寫該方法來進行型別轉換。OGNL還提供了一個實現TypeConverter介面的類DefaultTypeConverter,開發者只要繼承該類,就可以開發型別轉換器的實現類。
DefaultTypeConverter類的子類需要重寫convertValue()方法,來實現字串型別與複合型別之間的雙向轉換。convertValue()方法有三個引數:Map context:該引數為型別轉換環境的上下文內容;Object value:該引數為需要轉換的引數;Class toType:該引數指的是轉換目標的型別。
public Object convertValue(Map<String, Object> context, Object value,Class toType);注意這裡的value是一個數組型別的,因為struts2為了相容checkbox型別的引數。
注意:可以看到,convertValue()方法是通過toType的型別判斷來實現雙向轉換的。
4.基於Struts2的型別轉換器
Struts2框架提供了一個型別轉換器的StrutsTypeConverter抽象類,開發者可以繼承該類來開發自定義的型別轉換器實現類。 該抽象類實際上繼承了DefaultTypeConverter類,在該類的基礎上進行了簡化。StrutsTypeConverter抽象類是Struts2框架中型別轉換器的基礎,該類中提供了兩個抽象方法,這兩個抽象方法分別實現“form字串引數-Struts複合型別”之間的雙向轉換。
public Object convertFromString(Map context, String[] values, Class toClass) ;public String convertToString(Map context, Object obj);
5.例子:
RegistProductAction.java
屬性檔案目錄結構:
edu/action/RegistProductAction-conversion.properties
edu/action/Product-conversion.properties
從上面可以看出,對於複合型別接收請求引數的型別轉換,有兩種方式:
(1)RegistProductAction-conversion.properties 中 product.productId=....
(2)Product-conversion.properties 中 productId=...
DateTypeConverter.java
IntegerTypeConverter.java
StrutsTypeConverter.java
全域性型別轉換器:xwork-conversion.properties
注意:最好不要使用全域性型別轉換器,因為這樣定義後,意味著Action中所有java.util.Date型別的屬性,都將按照DateTypeConverter.java中定義的型別轉換。
瀏覽器上輸入:
點選reigst按鈕:
控制檯輸出:
控制檯並沒有輸出返回型別轉換語句,不知道為什麼,並沒有呼叫回撥方法?????????
如果沒有DateTypeConverter.java的話,那麼,createDate="20121208",則控制檯將輸出:
瀏覽器: