自定义类型转换器,转换过程中的错误处理

 参数封装过程中,数据类型转换问题
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) ----- 报错方法不存在异常

2、 自定义类型转换器 (了解)
 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=类型转换器全名

 
3、 类型转换中错误处理
1引入struts标签:
<%@ taglib uri="/struts-tags" prefix="s"%>
2通过分析拦截器作用,得知当类型转换出错时,自动跳转input视图 ,在input视图页面中 <s:fieldError/> 显示错误信息 
3* 在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息 : invalid.fieldvalue.属性名= 错误信息(在name和value里配置,可配置中文错误信息)

4. 请求数据有效性校验
1、 校验的分类 : 客户端数据校验 和 服务器端数据校验
客户端数据校验 ,通过JavaScript 完成校验 (改善用户体验,使用户减少出错 )
服务器数据校验 ,使用框架内置校验功能 (struts2 内置校验功能 ) ----- 必须的

2、 struts2 支持校验方式
代码校验 :在服务器端通过编写java代码,完成数据校验
配置校验 :XML配置校验(主流) 和 注解配置校验

转载于:https://my.oschina.net/u/1589656/blog/294015

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值