类型转换器根据目前我个人的学习阶段,还不是了解的很深,因为暂时只接触到了日期的类型转换,但是这个类型转化,其实也是没什么必要,拿日期转换器来做例子,只是为了了解转换器的定义还有注册而已。
在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
即可
本文探讨了Struts2框架中类型转换器的作用、定义方法及注册过程。解释了为何需要类型转换器,如何自定义转换器实现日期格式转换,并介绍了局部与全局注册的区别。
1854

被折叠的 条评论
为什么被折叠?



