**问题起源:**在学习Struts2框架 的时候,运行一个小demo,出现下述异常
经检查得知是form表单提交的数据中数据类型转换出错,具体就是form表单中有各种格式的日期数据,而在Action用Date类型变量去接收(上述异常也可能因其他问题导致,本例是日期转换问题)
解决方案:
**方案一:**如果form表单的日期数据是固定值,且之后不用于其他操作,可以在Action类中用String类型变量去接收
**方案二:**自定义类型转换器,将表单提交的日期数据转换成Date类型的数据
步骤:
1、自定义一个类去继承StrutsTypeConverter类
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
//自定义一个类去继承StrutsTypeConverter类,并重写StrutsTypeConverter类的两个方法
public class MyConverter extends StrutsTypeConverter{
//定义项目中支持的日期格式
DateFormat[] df = { new SimpleDateFormat("yyyy年MM月dd日"),
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy.MM.dd"),
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yyyyMMdd") };
@Override
public Object convertFromString(Map map, String[] values, Class clazz) {
// 判断表单提交的内容不能为空
if(values.length == 0 || values == null){
return null;
}
// 判断类型必须为Date
if(Date.class != clazz){
return null;
}
// 循环转换,转换失败继续下一种格式的转换; 转换成功则直接返回
for (int i = 0; i < df.length; i++) {
try {
return df[i].parse(values[0]);
} catch (Exception e) {
continue;
}
}
return null;//不能转换项目中支持的所有日期格式
}
@Override
public String convertToString(Map arg0, Object arg1) {
return null;
}
}
2、配置自定义类型转换器
方式一:配置局部类型转换器
命名格式:Action类名称-conversion.properties
Action类名称是当前需要进行日期转换的Action类的名称
配置文件内容:form表单的name属性值=自定义转换器类的全路径
例如:birthday=com.lzy.user.MyConverter
注意: 这种方式只对当前的Action有效,以及自定义转换器类、配置文件和目标Action类三者都在同一个包下
方式二:配置全局类型转换器
在src下创建xwork-conversion.properties配置文件(名字固定)
配置文件内容:java.util.Date=自定义转换器类的全路径
例如:java.util.Date=com.lzy.user.MyConverter