1. 程式人生 > >自定義型別轉換器--區域性和全域性

自定義型別轉換器--區域性和全域性

 在Struts2框架中使用自定義型別轉換器需要註冊,這樣在處理使用者請求的時候系統才知道使用哪個型別轉換器進行轉換。

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

  

   Product.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",則控制檯將輸出:


瀏覽器: