Struts2类型转换
1、 struts2内部提供大量类型转换器,用来完成数据类型转换问题
boolean 和 Boolean
char和 Character
int 和 Integer
long 和 Long
float 和 Float
double 和Double
Date 可以接收yyyy-MM-dd格式字符串
数组 可以将多个同名参数,转换到数组中
集合 支持将数据保存到 List或者 Map集合
案例: 输入合法年龄和生日可以自动转换
当输入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 ,格式 : 属性名称=类型转换器的全类名
全局注册 :在src下创建 xwork-conversion.properties,格式 : 待转换的类型=类型转换器的全类名
类型转换错误处理
通过分析拦截器作用,得知当类型转换出错时,自动跳转input视图 ,在input视图页面中<s:fieldError/> 显示错误信息
在Action所在包中,创建ActionName.properties,在局部资源文件中配置提示信息 :invalid.fieldvalue.属性名=错误信息