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/>