Struts2的類型轉換器

jopen 11年前發布 | 18K 次閱讀 Struts2 Android開發 移動開發

一、概述 
    在B/S應用中,將字符串請求參數轉換為相應的數據類型,是MVC框架提供的功能,而Struts2是很好的MVC框架實現者,理所當然,提供了類型轉換機制。 

    Struts2的類型轉換是基于OGNL表達式的,只要我們把HTML輸入項(表單元素和其他GET/POET的參數)命名為合法的OGNL表達式,就可以充分利用Struts2的轉換機制。 

    除此之外,Struts2提供了很好的擴展性,開發者可以非常簡單的開發自己的類型轉換器,完成字符串和自定義復合類型之間的轉換。總之,Struts2 的類型轉換器提供了非常強大的表現層數據處理機制,開發者可以利用Struts2的類型轉換機制來完成任意的類型轉換。 

二、實現自定義類型轉換器 
    實現TypeCoverter接口,或者繼承DefaultTypeConverter實現類(該類實現了TypeCoverter接口),通過繼承該實現類來實現自己的類型轉換器。重寫convertValue方法即可。 

    為了簡化類型轉換器的實現,Struts2提供了一個StrutsTypeConverter抽象類,這個抽象類是DefaultConverter的子類。實現了方法,并提供了2個不同轉換方向的方法:Object 
convertToString(Map context,String[] values,Class toClass)和String convertFromString(Map context,Object o)。 

三、注冊應用 
    實現了自定義類型轉換器之后,將該類型轉換器注冊在Web應用中,Struts2框架才可以正常使用該類型轉換器。 
關于類型轉換器的注冊方式,主要有3中: 
A、注冊局部類型轉換器:僅僅對某個Action的屬性起作用。 
B、注冊全局類型轉換器:對所有Action的特定類型的屬性都會生效。 
C、使用JDK1.5的注釋來注冊類型轉換器:通過注釋方式來生成類型轉換器。 
1、局部類型轉換器 
    提供如下格式的文件 
文件名:  ActionName-conversion.properties  
內容:多個propertyName(屬性名)=類型轉換器類(含包名),如  date=com.aumy.DateConverter 
存放位置:和ActionName類相同路徑。 

2、全局類型轉換器 
    提供如下格式的文件 
文件名:  xwork-conversion.properties 
內容:   多個“復合類型=對應類型轉換器”項組成,如  java.Util.Date=com.aumy.DateConverter 
存放位置:WEB-INF/classes/目錄下。 


四、應用示例 
    由于Struts2對日期轉換顯示時,會顯示日期和時間,現在項目只需要顯示日期,所以采用自定義的類型轉換器來實現日期顯示。 

1、類型轉換類

    public class DateConverter extends StrutsTypeConverter {

    private static String DATE_TIME_FOMART_IE = "yyyy-MM-dd HH:mm:ss";   

    private static String DATE_TIME_FOMART_FF = "yy/MM/dd hh:mm:ss";   

    @Override  
    public Object convertFromString(Map context, String[] values, Class toClass) {   
        Date date = null;   
        String dateString = null;   
        if (values != null && values.length > 0) {   
            dateString = values[0];   
            if (dateString != null) {   
                // 匹配IE瀏覽器   
                SimpleDateFormat format = new SimpleDateFormat(DATE_FOMART_IE);   
                try {   
                    date = format.parse(dateString);   
                } catch (ParseException e) {   
                    date = null;   
                }   
                // 匹配Firefox瀏覽器   
                if (date == null) {   
                    format = new SimpleDateFormat(DATE_FOMART_FF);   
                    try {   
                        date = format.parse(dateString);   
                    } catch (ParseException e) {   
                        date = null;   
                    }   
                }   
            }   
        }   
        return date;   
    }   

    @Override  
    public String convertToString(Map context, Object o) {   
        // 格式化為date格式的字符串   
        Date date = (Date) o;   
        String dateTimeString=DateUtils.formatDate(date);   
    }   

}  </pre><pre class="brush:java; toolbar: true; auto-links: false;">    public class DateConverter extends StrutsTypeConverter {  

    private static String DATE_TIME_FOMART_IE = "yyyy-MM-dd HH:mm:ss";  

    private static String DATE_TIME_FOMART_FF = "yy/MM/dd hh:mm:ss";  

    @Override  
    public Object convertFromString(Map context, String[] values, Class toClass) {  
        Date date = null;  
        String dateString = null;  
        if (values != null && values.length > 0) {  
            dateString = values[0];  
            if (dateString != null) {  
                // 匹配IE瀏覽器  
                SimpleDateFormat format = new SimpleDateFormat(DATE_FOMART_IE);  
                try {  
                    date = format.parse(dateString);  
                } catch (ParseException e) {  
                    date = null;  
                }  
                // 匹配Firefox瀏覽器  
                if (date == null) {  
                    format = new SimpleDateFormat(DATE_FOMART_FF);  
                    try {  
                        date = format.parse(dateString);  
                    } catch (ParseException e) {  
                        date = null;  
                    }  
                }  
            }  
        }  
        return date;  
    }  

    @Override  
    public String convertToString(Map context, Object o) {  
        // 格式化為date格式的字符串  
        Date date = (Date) o;  
        String dateTimeString=DateUtils.formatDate(date);  
    }  

}  </pre>注:DateUtils.formatDate(date);是調用該項目一個基礎包的公用方法,如果單獨使用,直接用日期格式化代碼代替。<span> </span><br style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;padding-top:0px;" />


2、xwork-conversion.properties配置文件

java.util.Date=com.aumy2008.converter.DateConverter  

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