struts2的自訂類型轉換和異常處理_類型轉換

來源:互聯網
上載者:User

 在web層中,我們使用beanutils直接將表單的資料封裝到JavaBean中。而在struts2中,action得到請求也能直接封裝到Javabean中。struts2中提供了大量的類型轉換器,用來完成資料類型轉換問題。包含以下類型:

        boolean 和 Boolean        char和 Character        int 和 Integer        long 和 Long        float 和 Float        double 和 Double        Date 可以接收 yyyy-MM-dd格式字串        數組  可以將多個同名參數,轉換到數組中        集合  支援將資料儲存到 List 或者 Map 集合

在struts2中的類型轉換器的介面是:com.opensymphony.xwork2.conversion.TypeConverter

1. 為何要自訂類型轉換。
 因為在struts2提供的類型轉換在我們實際需求開發中,會存在不能滿足開發需求的情況,比如將字串2017/6/27裝換成時間資料Data2017年6月27日上就會發生異常,因為struts2並沒有這種類型轉換器,而為瞭解決我們的需求問題,我們必須自己寫一個自訂類型轉換器。

2. 自訂類型轉換器步驟
<1>建立一個自訂類型轉換器。
建立自訂類型轉換器有三種方法:
 (1)實現TypeConverter介面

//重寫這個方法。但是由於參數有六個,參數過多,不建議使用。public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);

(2)繼承DefaultConverter類

//重寫的方法參數並沒有那麼多public Object convertValue(Map<String, Object> context, Object value, Class toType) {    return convertValue(value, toType);}

(3)繼承DefaultTypeConverter類的一個子類:StrutsTypeConverter

//建議使用這個方法,因為在這個類中,將從頁面傳遞的資料怎麼封裝以及action中的資料怎樣在頁面上顯示做了分離。//參數value:表單要轉換的值//參數toClass:要轉換的類型public abstract Object convertFromString(Map context, String[] values, Class toClass);public abstract String convertToString(Map context, Object o);

<2>重寫介面中的方法,實作類別型轉換操作。
<3>註冊類型轉換器。
怎樣註冊一個自訂類型轉換器。
 (1) 局部–針對action
設定檔所在位置以及名稱:在Action類所在包,建立Action類名-conversion.properties
設定檔書寫格式:屬性名稱=類型轉換器的全類名

 (2) 局部–針對model
設定檔所在位置以及名稱:在model類所在包,建立model類名-conversion.properties
設定檔書寫格式:屬性名稱=類型轉換器的全類名
 (3) 全域
設定檔所在位置以及名稱:在src下建立一個xwork-conversion.properties
設定檔書寫格式:要轉換的類型全名=類型轉換器的全類名

3. 類型轉換器異常及其處理
 對於struts2中的類型轉換器,如果表單資料提交時,將資料想model封裝,出現的問題,就會報錯,例如:No result defined for action cn.itcast.action.RegistAction and result input。
將異常資訊翻譯過來的意思為:在RegistAction的配置中沒有配置input結果檢視。

//如果配置以下資訊,那麼出現類型轉換問題,就會跳轉到指定的視圖。<action name="regist" class="cn.itcast.action.RegistAction">        <result name="input">/success.jsp</result>          </action>

那麼為什麼會向input視圖跳轉呢。
 原因是struts2中的攔截器(intercepter)。

//用於記錄類型轉換問題<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>// 用於得到問題,向input視圖跳轉。<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>

因為struts2中引入了預設的攔截器棧。在這個預設的攔截器棧中,有一個攔截器是conversionError,它的作用是當類型轉換出現錯誤的時候,會向action中儲存錯誤資訊。然而在棧尾還有一個攔截器是workflow,它的作用是如果前面的攔截器發現了問題,並將問題儲存到了action中,或者拋出了異常,那麼workflow攔截器就會直接跳轉的到input視圖。

4. 關於錯誤資訊展示
通過分析攔截器作用,得知當類型轉換出錯時,自動跳轉input視圖 ,在input視圖頁面中 顯示錯誤資訊。
* 在Action所在包中,建立 ActionName.properties,在局部資源檔中配置提示資訊 : invalid.fieldvalue.屬性名稱= 錯誤資訊

如果是自訂類型轉換器,出現類型轉換問題,要跳轉到input視圖,在類型轉換器中,必須拋出異常才可以。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.