从表单提交的数据全是字符串,在数据到达Action类前会有拦截器先对表单请求进行处理,其中参数拦截器完成表单数的类型转换,但struts2在提供简单的数据转换功能,并不能完全满足实际需求。比方说日期数据转换只支持"yyyy-mm-dd"方式,而实际web应用中不可能只用这种日期表示方式。提交不支持的转换数据类型,会出现类型转换错误。因此需要自定义类型转换器。
<!--参数拦截器 -->
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
如果类型转换失败,有两种情况:
- Action 类没有实现 ValidationAware 接口: Struts 即使在遇到类型转换错误时仍会继续调用目标Action 方法。
- Action 类实现了 ValidationAware 接口:Struts 在遇到类型转换错误时将不会继续调用目标Action 方法:,直接返回字符串"input"。
自定义类型转换器步骤
1.创建类型转换器类
继承StrutsTypeConverter类,重写convertFromString方法
示例:
MyTypeConverter.java
package cn.iborder.interceptor;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class MyTypeConverter extends StrutsTypeConverter{
/**
* 自定义类型转换器
* @param context 上下文环境
* @param values 表单提交的数据(字符串数组)
* @param toClass 要转换的目标类型
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
// TODO Auto-generated method stub
if (values == null && values.length == 0) {
return null;
}
if (Date.class != toClass) {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyymmdd");
try {
return sdf.parse(values[0]);
} catch (ParseException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
@Override
public String convertToString(Map arg0, Object arg1) {
// TODO Auto-generated method stub
return null;
}
}
2.配置类型转换器
有两种方式
(1)基于字段的配置(局部类型转换器)
在字段所在的Action类的包下, 新建一个 Action类名-conversion.properties 文件。
内容格式如下:
字段名=类型转换器类名
示例:
UserAction-conversion.properties
user.birth =cn.iborder.interceptor.MyTypeConverter
(2)基于类型的配置(全局类型转换器)
在src路径下新建 xwork-conversion.properties 文件
内容格式如如下:
目标转换类型=类型转换器类名
示例
xwork-conversion.properties
java.util.Date = cn.iborder.interceptor.MyTypeConverter
注意:如果局部类型转换和全局类型转换同时存在的话,局部类型转换具有较高的优先级。