Struts2(十一)---類型轉換

(1)概述
· 從一個HTML表單到一個Action對象,類型轉換是從字符串到非字符串.
· HTTP沒有”類型”的概念,每一項表單輸入只可能是一個字符串或者字符串數組.在服務端,必須把String轉換爲特定的數據類型.
.在Struts2中把請求參數映射到action屬性的工作由ParametersInterceptor負責,它是默認的defaultStack攔截器中的一員.ParametersInterceptor可以自動完成字符串到基本數據類型之間的轉換.
(2)類型轉換錯誤
~~若Action類沒有實現ValidationAware接口:Struts2在遇到類型轉換錯誤時,仍會繼續調用其Action方法,就好像什麼也沒有發生過一樣.
~~若Action類實現了 ValidationAware接口:Struts2在遇到類型轉換錯誤時將不會繼續調用其Action方法,Struts2將檢查相關action元素的聲明是否包含着一個name=”input”的result,如果有,struts2將把控制權轉交給那個result元素,若沒有result結果,Struts2將拋出一個異常.如下圖所示:
這裏寫圖片描述
(3)如何覆蓋默認的錯誤消息
①在對應的Action類或JavaBean所在的包中新建[ActionClassName].properties文件,ActionClassName即爲包含着輸入字段的Action類的類名.
②在屬性文件中添加如下鍵值對:invalid.fieldvalue.fieldName=XXX,例invalid.fieldvalue.age=非法值
注:若是自定義的類型轉換器需要把類型轉換失敗的異常拋出,才能夠使頁面正常顯示錯誤消息

(4)如果是simple主題,不會自動顯示錯誤消息,若想顯示,應操作如下步驟:
①通過debug標籤可知若轉換出錯,則在值棧的Action(實現了ValidateAware接口)對象中有一個fieldErrors屬性,該屬性的類型爲Map<String,List<String>>,鍵:字段(屬性名),值:錯誤消息組成的List,所以可用EL或OGNL的方式來顯示錯誤消息:${fieldErrors.age[0]}
(5)如何自定義類型轉換器
1,Why?因爲Struts2不能自動完成字符串到引用類型的轉換
2,How?
①開發類型轉換器的類:擴展StrutsTypeConverter類,如下例子

    public class DateConversion extends StrutsTypeConverter {
    private DateFormat dateFormat;

    public DateConversion(){
        System.out.println("DateConversion...");
    }
    public DateFormat getDateFormat(){
        if(dateFormat == null){
            ServletContext servletContext = ServletActionContext.getServletContext();
            String pattern = servletContext.getInitParameter("pattern");
            System.out.println("pattern:"+pattern);
            dateFormat = new SimpleDateFormat(pattern);
        }
        return dateFormat;
    }


    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        System.out.println("convertFromString...");
        if(toClass == Date.class){
            if(values != null & values.length > 0){
            String value = values[0];
            System.out.println("value:"+value);
            try {
                Date date = getDateFormat().parse(value);
                return date;
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                System.out.println("轉換失敗");
                throw new XWorkException("Could not parse date", e);
             }
            }
        }


        return values;
    }

    @Override
    public String convertToString(Map context, Object o) {
        System.out.println("converToString...");
        if(o instanceof Date){
            Date date = (Date)o;
            String value = getDateFormat().format(date);
            return value;
        }
        return null;
    }

}

②配置類型轉換器:
有兩種方式:
1)基於字段的配置

·在字段所在的Model(可能是Action,可能是一個JavaBean)的包下,新建一個[ModelClassName]-conversion.properties文件.
·在該文件中輸入鍵值對:fieldName = 類型轉換器的全類名.例:birth=com.ty.exer1.converters.DateConversion
注:–>第一次使用該轉換器時才創建實例; –>類型轉換器是單實例的;
2)基於類型的配置
·在src下新建xwork-conversion.properties.
·在該文件中輸入鍵值對:待轉換的類型 = 類型轉換器的全類名.
例:java.util.Date=com.ty.exer1.converters.DateConversion
com.ty.model.Address=com.ty.exer1.converters.AddressConversion
注:在當前Struts2應用被加載時創建實例.
(6)類型轉換與複雜屬性配合使用
這裏寫圖片描述

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章