从表单提交的数据全是字符串,在数据到达Action类前会有拦截器先对表单请求进行处理,其中参数拦截器完成表单数的类型转换,但struts2在提供简单的数据转换功能,并不能彻底知足实际需求。比方说日期数据转换只支持"yyyy-mm-dd"方式,而实际web应用中不可能只用这种日期表示方式。提交不支持的转换数据类型,会出现类型转换错误。所以须要自定义类型转换器。java
<!--参数拦截器 --> <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
若是类型转换失败,有两种状况:web
继承StrutsTypeConverter类,重写convertFromString方法apache
示例:数组
MyTypeConverter.javaide
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; } }
有两种方式spa
(1)基于字段的配置(局部类型转换器)code
在字段所在的Action类的包下, 新建一个 Action类名-conversion.properties 文件。orm
内容格式以下:xml
字段名=类型转换器类名
示例:继承
UserAction-conversion.properties
user.birth =cn.iborder.interceptor.MyTypeConverter
(2)基于类型的配置(全局类型转换器)
在src路径下新建 xwork-conversion.properties 文件
内容格式如以下:
目标转换类型=类型转换器类名
示例
xwork-conversion.properties
java.util.Date = cn.iborder.interceptor.MyTypeConverter
注意:若是局部类型转换和全局类型转换同时存在的话,局部类型转换具备较高的优先级。