struts2页面到action中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类型,因而报错。


解决办法:

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类型了。

你可能感兴趣的:(java,web框架,class,struts2.0,java,web)