參數封裝過程當中,數據類型轉換問題
一、 struts2 內部提供大量類型轉換器,用來完成數據類型轉換問題
boolean 和 Boolean
char和 Character
int 和 Integer
long 和 Long
float 和 Float
double 和 Double
Date 能夠接收 yyyy-MM-dd格式字符串
數組 能夠將多個同名參數,轉換到數組中
集合 支持將數據保存到 List 或者 Map 集合java
案例: 輸入合法年齡和生日能夠自動轉換
當輸入abc 轉換爲 int類型 age時
Caused by: java.lang.NoSuchMethodException: cn.itcast.struts2.demo3.CustomerAction.setAge([Ljava.lang.String;
分析: 輸入20 ,轉換 int類型20 --- setAge(int)
輸入abc,轉換int 出錯 ---- setAge(String) ----- 報錯方法不存在異常數組
二、 自定義類型轉換器 (瞭解)
1) 自定義類型轉換器
第一種 實現TypeConverter接口
convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object target, java.lang.reflect.Member member, java.lang.String propertyName, java.lang.Object value, java.lang.Class toType)
第二種 繼承 DefaultTypeConverter
convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object value, java.lang.Class toType)
第三種 繼承 StrutsTypeConverter
convertFromString(java.util.Map context, java.lang.String[] values, java.lang.Class toClass) --- 請求封裝
convertToString(java.util.Map context, java.lang.Object o) --- 數據回顯
* 類型轉換器 一直都是雙向轉換
頁面提交請求參數,封裝到model --- 須要轉換
model數據 須要在頁面 回顯 ---- 須要轉換
2) 以 1990/10/10 爲例,自定義日期轉換器,完成轉換
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;
}
3) 註冊類型轉換器
局部註冊 : 只對當前Action有效 (針對屬性)
全局註冊 : 針對全部Action的日期類型有效 (針對類型 )
局部註冊 : 在Action類所在包 建立 Action類名-conversion.properties , 格式 : 屬性名稱=類型轉換器的全類名
代碼體現:Login-conversion.properties:birthday=類型轉換器全名
全局註冊 : 在src下建立 xwork-conversion.properties ,格式 : 待轉換的類型=類型轉換器的全類名
代碼體現:xwork-conversion.properties:java.util.Date=類型轉換器全名框架
三、 類型轉換中錯誤處理
1引入struts標籤:
<%@ taglib uri="/struts-tags" prefix="s"%>
2經過分析攔截器做用,得知當類型轉換出錯時,自動跳轉input視圖 ,在input視圖頁面中 <s:fieldError/> 顯示錯誤信息
3* 在Action所在包中,建立 ActionName.properties,在局部資源文件中配置提示信息 : invalid.fieldvalue.屬性名= 錯誤信息(在name和value裏配置,可配置中文錯誤信息)orm
4. 請求數據有效性校驗
一、 校驗的分類 : 客戶端數據校驗 和 服務器端數據校驗
客戶端數據校驗 ,經過JavaScript 完成校驗 (改善用戶體驗,使用戶減小出錯 )
服務器數據校驗 ,使用框架內置校驗功能 (struts2 內置校驗功能 ) ----- 必須的繼承
二、 struts2 支持校驗方式
代碼校驗 :在服務器端經過編寫java代碼,完成數據校驗
配置校驗 :XML配置校驗(主流) 和 註解配置校驗接口