自定义类型转换器

本文探讨了Struts2框架中类型转换器的作用、定义方法及注册过程。解释了为何需要类型转换器,如何自定义转换器实现日期格式转换,并介绍了局部与全局注册的区别。

类型转换器根据目前我个人的学习阶段,还不是了解的很深,因为暂时只接触到了日期的类型转换,但是这个类型转化,其实也是没什么必要,拿日期转换器来做例子,只是为了了解转换器的定义还有注册而已。
在struts2里面,用户表单输入的生日日期,默认能接受的格式是:yyyy-MM-dd,所以如果要用户输入的话,直接让用户输入该种类型的日期即可,大可不必自定义类型转化器,上面说到了,这里只是为了了解其定义还有注册,还有其他很多种类的转换器只是目前还没有接触到而已。下面我们围绕如下的3个问题来展开讨论:
1、为什么要用类型转换器?
2、如何定义类型转换器?
3、定义了就可以使用?

1、为什么要用类型转换器?
在用户表单输入的数据中,struts2框架默认的格式就是yyyy-MM-dd,如果有其他需求,则要用户自定义类型转换器,否则,就不能获取到用户输入的数据,并且会抛出异常:Encapsulated exception。同时,框架会返回该action的结果为input所指向的处理方式

2、如何定义类型转换器?
在了解了为何要定义类型转换器之后,接下来就是如何使用了,首先定义一个类并继承defaultTypeConvertor类(com,ognl开头的都可以,只不过,推荐使用框架自己的com,ognl是另外一个公司的),并覆写convertValue方法。

@Override
public Object convertValue(Map<String, Object> context, Object value,Class toType) {
    try {
        DateFormat d=new SimpleDateFormat("yyyy/MM/dd");
        if(toType==Date.class){
        //如果要保存用户输入的数据,那么先把传进来的value转成字符串格式
            String sValue=((String[])value)[0];
        //然后再格式化成date类型,存储到数据库中
            return d.parse(sValue);
         }else{
        //如果要读取数据,那么先从数据库中取出数据,强转成date类型
            Date date=(Date)value;
        //然后再格式化成指定的格式输出
            return d.format(date);
            }
        } catch (ParseException e) {
            throw new RuntimeException();
        }
    }

其中参数Map<String, Object> context, Object value,Class toType
context:指的是OGNL表达式的上下文(后面会讲到,这里不错深入)
value:指的是用户输入的数据,或者是字段的属性(因为转换有2种可能,一种是保存数据的时候,另外一种是读取数据的时候)
toType:指的是目标类型

大家可能会疑问,为什么value要强转成字符串数组?不是说好的用户输入的数据都是String类型么?拿起石头砸自己脚么?
其实不是这样的,用户输入的确是是字符串没有错,但是框架这里定义的时候,考虑到它的功能性,并不只是单单用在1个功能上面,或许这个值还有重名现象呢?就拿出生日期来说,如果有阳历和阴历呢?不也是可以么?所以要设置成字符串数组的形式,然后考虑到有同名的情况,数组可以解决,如果只要取一位,取就是;如果只定义了String类型,那么有同名情况就不能解决了。

3、定义了转化器就万事大吉了么?
要经过注册之后,才能使用,但是现在问题来了,有两种注册转换器的方法:一种是注册局部的转换器,另外一种是全局的转换器。至于那种好,各取所需吧,只不过,如果两者同时存在,当然是全局的优先级高!为什么?通过下面的阅读你就可以解决!

3.1、注册局部转换器:
1、首先找到表单中action指明的动作类所在的包
2、在包中创建名为动作类-conversion.properties的文件(这里我拿订单(order)来做例子):Order-conversion.properties
3、在新建的文件里面写上键值对:字段名=转换器的全名

birthday=cn.asnsel.convertor.dateConvertor

即可。

3.2、注册全局转换器:
1、在web-inf的classes目录下创建xwork-conversion.properties文件
2、在里面写上键值对:目标类全名=转换器全名

java.util.Date=cn.asnsel.convertor.dateConvertor

即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值