1. 程式人生 > >struts2框架之類型轉換(參考第二天學習筆記)

struts2框架之類型轉換(參考第二天學習筆記)

例如 源文件 com sym rop 字段名 找到 攔截 from

類型轉換

1. 什麽是類型轉換

剛才學習了封裝請求參數,把表單數據封裝到Action(模型)的屬性中。表單中的數據都是String類型,但Action(模型)的屬性不一定什麽類型。
將來我們還需要數據的回顯,即把Action的屬性值顯示到表單中。把Actoin的屬性顯示在表單中。

類型轉換是雙向的

String[] --> Object,從表單到Action
Object --> String,從Action到表單

默認情況下,Struts會幫我們轉換如下類型:
1. Date
2. 基本類型:int、float ....
3. String類型
4. 基本類型對應包裝類型:Integer、Double....


<input type="checkbox" name="hobby" value="上網"/>
<input type="checkbox" name="hobby" value="看書"/>
<input type="checkbox" name="hobby" value="再上網"/>
<input type="checkbox" name="hobby" value="還是看書"/>
class MyAction {
private int age;
private Date birthday;
}


=====================

自定義類型轉換

1. 目標

在表單給出如下數據:
張三,23,男

把這個字符串轉換成Person,封裝到Action的一個類型為Person的屬性中。

2. 自定義類型轉換
  當Struts自動類型轉換失敗時,它會使用最原始的類型完成封裝,即使用String[]類型。
  例如要把字符串數組轉換成Person類型時,自動類型轉換會失敗,這時Struts會去尋找setPerson(String[])方法。
  如果找不到這個方法,會拋出NoSuchMethodException異常,說明類型轉換失敗。

1). 編寫類型轉換器
2). 配置自定義的類型轉換器類。

3. 編寫類型轉換器
1). 實現com.opensymphony.xwork2.conversion.TypeConverter(不方便)
2). 繼承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter(不方便)
3). 繼承org.apache.struts2.util.StrutsTypeConverter(就用它)

SturtsTypeConverter
* Object convertFromString(Map context, String[] values, Class toClass):String --> Object,從表單到Action
* String convertToString(Map context, Object o):Object --> String, 從Action到表單

4. 配置自定義類型轉換器
局部部署:當前轉換器只對當前Action的指定屬性有效

1) 配置文件的位置:Action同包下,即PersonAction同包下
2) 配置文件的名稱:Action名稱-conversion.properties,PersonAction-conversion.properties,
3) 配置文件的內容:要處理的屬性名稱=類型轉換器的全名,即:person=cn.itcast.converter.PersonConverter

全局部署:對某一類型指定類型轉換器,例如Person類型都使用同一類型轉換器

1) 配置文件的位置:src下
2) 配置文件的名稱:xwork-conversion.properties
3) 配置文件的內容:要處理的類型=類型轉換器名稱,即:cn.itcast.action.Person=cn.itcastion.converter.PersonConverter

5. 類型轉換錯誤

HTTP Status 404 - No result defined for action cn.itcast.action.PersonAction and result input
說明:已經找到了類型轉換器,但類型轉換失敗。這時struts要求跳轉到input結果,但我們沒有為當前Action配置input結果。

在input結果頁面中給出<s:fielderror/>來顯示錯誤信息。
但錯誤信息是英文的,這需要使用國際化。

國際化key:invalid.fieldvalue.當前字段名,即:invalid.fieldvalue.person
處理這一問題:
1. 在當前Action同包下創建資源文件,名稱為:Action類名.properties

6. 原理
params:完成封裝請求數據,它會做類型轉換工作。
converterError:如果出現類型轉換錯誤,會向當前Action中添加fielderror。
workflow:查看當前Action中是否存在fielderror或actionerror,只要存在錯誤,攔截請求,轉發到input結果,不會在執行Action的請求處理方法。當然,如果沒有錯誤,放行!

struts2框架之類型轉換(參考第二天學習筆記)