Struts2 中 Date 日期 类型转换 问题

在Java Web开发中,进行上述转换一般有以下几种:
1、在Servlet中,这一切的转换我们得自己写代码完成;
2、在Struts1.x中,我们通过apachecommons-beanutils中的converters来帮助完成这些事情;
3、在Struts2中,使用的则是基于ongl的类型转换;

……由于类型转换的通用性,因而Web框架都会实现大多数类型的转换功能,而不需要程序员编码实现。然而,对于java.util.Date这种类型的转换,各大框架似乎做得都不尽如人意。如:在Struts1.x中,该类型的转换就会有问题,很多人建议使用java.sql.Date这种类型来解决日期转换的问题(实际上可以自定义一个类型转换器来解决该问题)。在Struts2中,这个问题似乎依然存在,也许你从来没有遇到过。

在开发的过程中,也许就像你一样,我没有对日期类型的转换做任何特殊的处理,而且Struts2也很好的帮我完成了转换。然而同事测试的时候却出现了一个“莫名其妙”的问题:输入一个常用格式的日期类型yyyy-MM-dd,到后台却报错:找不到对应的set方法——setEffDate(Ljava.lang.String)。的确,程序中只有setEffDate(java.util.Date)这个方法,没有setEffDate(Ljava.lang.String)这个方法。从Ljava.lang.String可以看出,传到后台的String类型并没有转换成Date类型,因而报错。

查看struts2的源码:

在XWorkBasicConverter类中
private Object doConvertToDate(Map context, Object value, Class toType) {

   。。。。。

发现使用 locale 来进行日期的格式化。而日期格式YYYY-MM-DD 只有在中文的语言环境才会有。

查看DateFormat中关于SHORT、MEDIUM、LONG的说明,可以知道,对于yyyy-MM-dd这种日期类型,在英语语言中是没法匹配的,由于Struts2匹配日期时,使用了Locale,可见,IE浏览器默认的语言环境是英语。一经查看,果然如此,把中文设置为默认语言环境,再测试,没问题了。

 针对这个问题,我们没法要求客户一定设置中文为默认浏览器的语言环境。因而对于Date类型的转换,可以自己定义一个转换器。

因而对于Date类型的转换,可以自己定义一个转换器。

参考http://www.javaeye.com/wiki/struts2/1365-passing-parameters-in-struts2

中的一个类型转换器定义(不适合国际化的环境),如需要,你可以定义自己的转换器

可以将该转换器注册为全局的:在classpath下建立xwork-conversion.properties文件,内容为:java.util.Date=你的类型转换器的完整限定类名

猜你喜欢

转载自ollevere.iteye.com/blog/1431947