关闭

Struts2——Data类型转换出错

标签: struts2.0
94人阅读 评论(0) 收藏 举报
分类:

Struts2 Date类型转换出错问题

参考:http://blog.csdn.net/ljl961890233bear/article/details/8108358

最近在学Struts2,学到类型转换的时候发现一个问题。当Action有一个属性类型为Date时,转换总是报错。各种尝试(google)之后发现是Struts2自身的问题,于是我找到Struts2自身的DateConverter,发现它其中有一段是这样写的:

 if (java.util.Date.class == toType) {
            Date check;
            DateFormat[] dfs = getDateFormats(locale);
            for (DateFormat df1 : dfs) {
                try {
                    check = df1.parse(sa);
                    df = df1;
                    if (check != null) {
                        break;
                    }
                } catch (ParseException ignore) {
          }
 }

getDateFormats方法:

 private DateFormat[] getDateFormats(Locale locale) {
    DateFormat dt1 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG, locale);
    DateFormat dt2 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, locale);
    DateFormat dt3 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale);

    DateFormat d1 = DateFormat.getDateInstance(DateFormat.SHORT, locale);
    DateFormat d2 = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
    DateFormat d3 = DateFormat.getDateInstance(DateFormat.LONG, locale);

    DateFormat rfc3339         = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    DateFormat rfc3339dateOnly = new SimpleDateFormat("yyyy-MM-dd");

    return new DateFormat[]{dt1, dt2, dt3, rfc3339, d1, d2, d3, rfc3339dateOnly};
}

DateFormat rfc3339 = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss”);
DateFormat rfc3339dateOnly = new SimpleDateFormat(“yyyy-MM-dd”);

这两句固定了日期的格式,你必须按照它规定的格式输入,如:http://localhost:8080/project/test?date=1997-08-08

其他的看不懂,就不献丑了~

但是,我TM的格式没错啊,还是报错。无奈网上继续google,发现有大神自己定义了一个类型转换器解决,于是我也自己照猫画虎地写了一个:

public class DateConverter extends DefaultTypeConverter{
//接受的日期格式
public static final DateFormat[] ACCEPT_DATE_FORMATS = {
    new SimpleDateFormat("yyyy-MM-dd"),
    new SimpleDateFormat("yyyy/MM/dd")
};

public Object convertValue(Object value, Class toType){
    //浏览器接收 String 转换为 Date
    if(toType == Date.class){
        Date date = null;
        String dateString = null;
        String[] params = (String[])value;
        dateString = params[0];
        for(DateFormat format:ACCEPT_DATE_FORMATS){
            try {
                date = format.parse(dateString);
                return date;
            } catch (ParseException e) {
                continue;
            }
        }
        return null;
    }
    //服务器将 Date 转换为 String 传回浏览器
    else if(toType == String.class){
        Date date = (Date)value;
        return new SimpleDateFormat("yyyy/MM/dd").format(date);
    }
    //如果这个转换器无法处理便交由Struts2处理
    return super.convertValue(value, toType);
}

顺道学习一下自定义类型转换器的配置:

1.在src目录下新建配置文件 xwork-conversion.properties(src目录下必须这样命名)

ps:如果在包内的话,文件名为xxxAction-conversion.properties

2.在配置文件中写入所需要转换的类型和转换器
java.util.Date=com.javaweb.DateConverter

配置好后再重新部署一下,大功告成~

name:<s:property value="name"/><br>
age:<s:property value="age"/><br>
date:<s:property value="date"/><br>
<s:date name="date" format="YYYY-MM-dd"/><br>
interests:<s:property value="interests"/><br>
users:<s:property value="users"/><br>
<s:debug/>

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:376次
    • 积分:62
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档