Struts2對資料的類型轉換
一、Struts2中自帶類型轉換攔截器
Struts2内部提供了大量轉換器,用來完成資料類型轉換的問題,有如下
* boolean 和 Boolean
* char和 Character
* int 和 Integer
* long 和 Long
* float 和 Float
* double 和 Double
* Date 可以接收 yyyy-MM-dd 格式字元串
* 數組 可以将多個同名參數,轉換到數組中
* 集合 支援将資料儲存到 List 或者 Map 集合
當發生類型轉換錯誤的時候,根據報錯的資訊提示,跳轉input類型的結果視圖。
* 說明如果程式出現異常,會跳轉到input結果視圖,那可以在<action>标簽中配置input結果視圖
在跳轉的頁面中也可以通過一個固定的标簽來顯示錯誤的資訊:
* 可以先需要先引入Struts2的标簽庫,然後使用标簽顯示錯誤!
<%@ taglib prefix="s" uri="/struts-tags" %>
* <s:fielderror>,這是Struts2提供的标簽,使用它顯示錯誤的提示資訊。
如果類型轉換的攔截器中發生了錯誤,那麼會把錯誤資訊放在Struts2錯誤區域中(Struts2的錯誤區域分成兩部分,一部分是字段錯誤,一部分是Actionc錯誤)
* 等執行到最後一個攔截器(workflow)時,workflow攔截器會去Struts2的錯誤區域中找是否存在錯誤。
* 如果存在錯誤,就跳轉到input視圖。
* 如果不存在錯誤,執行目标Action類中具體的方法。
二、自定義類型轉換器
如果一些特殊的資料類型不能轉換,那麼需要自定義資料類型的轉換器。
開發自定義類型轉換的具體方法有三個:
1、實作TypeConverter接口,并實作一個方法
Object convertValue(Map<String,Object> context,Object target, Member member,String propertyName,Object value,Class toType);
因為這個方法太複雜,是以一般不會直接去實作這個接口,而采用下面繼承的方法。
2、繼承DefaultTypeConverter類,重寫一個方法
Object convertValue(Map<String,Object> context,Object value,Class toType)
>可以完成雙向轉換
>context 類型轉換環境的上下文
>value 需要轉換的參數
>toType 目标類型
3、繼承StrutsTypeConverter類,重寫兩個方法
* Object convertFromString(Map context,String[] values,Class toClass)
> 從字元串轉換成具體類型
> values數組,存入的值就是使用者輸入的值
> toClass 要轉換的資料的類型 如Date.class
* String convertToString(Map context,Object o)
> 把具體的類型轉換成字元串
> o 代表的要轉換的資料
類型轉換的代碼,以 1990/10/10 為例,自定義日期轉換器,完成轉換,下面這段代碼是第二種方法,也就是繼承了DefaultTypeConverter類。
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
// 根據toType判斷 是請求封裝 還是 資料回顯
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
if (toType == Date.class) {
// 請求參數封裝 (value是字元串)
String[] params = (String[]) value;
String strVal = params[0]; // 轉換為 日期類型
try {
return dateFormat.parse(strVal);
} catch (ParseException e) {
e.printStackTrace();
}
} else {
// 回顯(value是 Date)
Date date = (Date) value;
return dateFormat.format(date);
}
return null;
}
三、類型轉換器的注冊
如果僅僅編寫了類型轉換器,strus2并不知道何時使用它,需要進行注冊。
1、局部注冊:針對某個表單中的某個字段生效的!
* 屬性驅動的方式:使用set方法接收資料
> 配置方法:在Action所在的包下建立一個檔案,檔案名的格式是:Action類名-conversion.properties檔案,該檔案中配置要轉換資料的字段和對應的轉換器全路徑
例如:birthday=cn.cxk.demo3.MyDateConverter
*模型驅動的方式:實作ModelDriven接口的方式
> 配置方法:在實體類所在的包下建立一個檔案,檔案名的格式是:實體類名-conversion.properties檔案,該檔案中配置要轉換資料的字段和對應的轉換器全路徑
例如:birthday=cn.cxk.demo3.MyDateConverter
2、全局注冊:針對整個項目的所有的日期類型都會生效的!
* 在src的目錄下,建立一個xwork-conversion.properties(名稱是固定的)。内容格式是:類型轉換中的原類型名=類型轉換中的目标類型名
> 例如:java.util.Date=cn.zlq.demo3.MyDateConverter