Struts2---类型转换

来源:互联网 发布:ipcam监控软件下载 编辑:程序博客网 时间:2024/06/02 01:58

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.属性名= 错误信息

0 0