参数封装过程当中,数据类型转换问题
一、 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配置校验(主流) 和 注解配置校验接口