在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类型,因而报错。
解决办法:
1、编写一个类去继承ognl.DefaultTypeConverter然后重写里面的public Object convertValue(Map context, Object value, Class toType)方法,
下面是例子:
package innovation.model;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import ognl.DefaultTypeConverter;
public class DateConverter extends DefaultTypeConverter {
public Object convertValue(Map context, Object value, Class toType) {
try {
if (toType == Date.class) { // 如果想转换的是Date类型时将做以下操作
// 因为在Struts2里会表单传过来的非字符串数据转换为String[],所以这里得取第一个值
String dataStr = ((String[]) value)[0];
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); // 转换为自己想要日期格式
return f.parse(dataStr);
} else if (toType == String.class) {
String dataStr = ((Date) value).toString();
return dataStr;
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
2、在/WEB-INF/classes文件夹下创建一个叫:xwork-conversion.properties的文件(把该文件放在src目录下即可,运行完成后系统会自动放到
/WEB-INF/classes下
)
3、在里面添加一句话 java.util.Date=innovation.model.DateConverter(指上面新建的类)。
然后重启系统就OK了。 那么在将数据提交到后台时,便后自动的将对应的String类型的数据转换成Date类型了。