天天看點

Struts2中的資料類型轉換

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