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.属性名= 错误信息
新闻热点
疑难解答