在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視圖,在類型轉換器中,必須拋出異常才可以。