Struts 2的自定義類型轉換器

jopen 8年前發布 | 10K 次閱讀 Struts2 Web框架

          大部分時候,我們使用Struts 2內建的類型轉換器就可以滿足大部分類型轉換需求了。但是在有些特殊的情況下,如:需要把一個字符串轉換成一個復合對象時,這個時候就需要使用自定義類型轉換器了。

          實現自定義類型轉換器一般需要實現以下兩步:

            1、編寫自己的類型轉換器

            2、注冊類型轉換器

 

          1、自定義類型轉換器

          編寫自定義類型轉換器一般都要實現一個類:DefaultTypeConverter。實現自定義轉換器需要重寫該類的convertValue方法。

          convertValue方法負責完成類型的轉換。但是這種轉換是雙向的,即如當需要把字符串轉換成User實例時,是通過該方法實現的;當需要把User實例轉換成字符串是,也是通過該方法實現的。

          為了讓該方法實現雙向轉換,是通過判斷toType的類型即可判斷轉換的方向。toType類型是需要轉換的目標類型,當toType類型是User類型時,表面需要將字符串轉換成User實例;當toType類型是String類型時,表明需要把User實例轉換為字符串類型。

   

         2、注冊類型轉換器

          注冊類型轉換器,就是講類型轉換器注冊在Web應用中,告訴Struts 2如何使用這些類型轉換器。

          Struts 2提供了三種類型轉換器:

           注冊局部類型轉換器:該轉換器僅僅對某個Action的屬性起作用

           注冊全局類型轉換器:該轉換器對所有的Action的特定類型的屬性都會生效。

           使用JDK 的注釋來注冊類型轉換器:通過注釋方式來注冊類型轉換器。

 

          1)、局部類型轉換器

              注冊局部類型轉換器使用局部類型轉換文件指定。只要在該轉換文件中增加一行即可:

              <propName>=<converterClass>

              將<propName>替換成需要進行轉換的屬性。將<converterClass>替換成類型轉換器的實現類即可。

  一般來說,局部類型轉換器具有很大的局限性。所以一般都會將類型轉換器注冊成全局類型轉換器。

 

          2)、全局類型轉換器

              全局類型轉換器不是對指定的Action的指定屬性起作用,而是對指定的類型起作用。 

              注冊全局類型轉換器應該提供一個xwork-conversion.properties文件,該文件時全局類型轉換文件。

              注冊全局類型轉換器只需在全局類型轉換文件中添加一行即可:

             <propType>=<ConvertClass>

             <propType>替換成需要進行類型轉換的類型,將<ConvertClass>替換成類型轉換器的實現類即可。

     

                 例題:

                 類型轉換器:

public class UserConverter extends DefaultTypeConverter{

    //重寫convertvalue方法,該方法需要完成雙向轉換
    public Object convertValue(Map context, Object value,Class toType) {
        //當需要將字符串向User類型轉換時
        if(toType == UserBean.class){
            //系統的請求參數是一個字符串數組
            String[] params = (String[]) value;
            for (int i = 0; i < params.length; i++) {
                System.out.println(params[i]);
            }
            //創建一個User實例
            UserBean user = new UserBean();
            //只處理請求參數數組第一個數組元素,并將該字符串以英文逗號分割成兩個字符串
            String[] userValue = params[0].split(",");
            //為user實例賦值
            user.setName(userValue[0]);
            user.setPassword(userValue[1]);

            return user;
        }
        if(toType == String.class){
            //將需要轉換的值強制類型轉換成User類型
            UserBean user = (UserBean) value;
            return "<" +user.getName()+","+user.getPassword()+">";
        }
        return null;
    }

}


                  注冊類型轉換器:

com.app.entity.UserBean=com.app.converter.UserConverter

        

                 jsp文件:

<s:form action="RegisterLogin">
    <s:textfield name="user.name" label="用戶名"></s:textfield>
    <s:submit value="登陸"></s:submit>
   </s:form>


            當在jsp頁面的文本框中輸入:chenssy,chentmt即可登錄成功

        其實Struts 2提供了一個StrutsTypeConverter抽象類,實現這個抽象類可以簡化類型轉換器的實現。該類實現了DefaultTypeConverterconvertValue方法,實現該方法時,它將兩個不同轉換方法替換成不同方法—當需要把字符串轉換成復合類型時,調用convertFromString抽象方法;當需要把復合類型轉換成字符串時,調用convertToString抽象方法。

       由上面可以知道:我們只需要繼承StrutsTypeConmverter抽象類,并且重寫convertFromString 方法和convertToString方法,我們就可以簡單實現自己的類型轉換器。

 public class UserConverter extends StrutsTypeConverter{
    //實現將字符串類型轉換成復合類型的方法
    public Object convertFormString (Map context,String[] values,Class toClass){
    ......
    } 

    //實現將復合類型轉換成字符串類型的方法
        Public String convertToString (Map context,Object o){
    .........
    }
}   

 

讀 李剛《輕量級Java EE企業應用實戰》
  

來自: http://blog.csdn.net/chenssy/article/details/7322467

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!