jsp提交的数据全部是String类型,Struts2也是通过request.getParameter(name)取得String类型的数据,并通过拦截器将String转换成各种类型的数据,然后通过get、set方法设置到action对应的属性,默认的转换器不能满足需求,需要自定义类型转换。
数据类型转换都需要实现ognl.TypeConverter接口,一般直接继承DefaulrTypeConverter类,并实现convertValue()方法。convertvalue()有3个参数,参数value为待转换的数据,参数toType为要转成的类型,参数context为上下文,参数value为request.getparameter(name)返回的String[]类型的对象,而不是String。类型转换分为两类:局部类型转换器:对某个action转换类型起作用。全局类型转换器:对所有action转换类型起作用.
一、局部类型转换
1.1 普通Action中的类型转换
配置文件存放目录:Action同级目录;
配置文件名:Action名-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:Action属性名=转换器包路径
1.2 基于模型驱动的类型转换
配置文件存放目录:模型同级目录;
配置文件名:模型名-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:模型属性名=转换器包路径
二、全局类型转换
配置文件存放目录:项目根目录;
配置文件名:work-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:要转换的类型包路径=转换器包路径
注意:若在模型驱动情况下,即配置了Action的类型转换器又配置了对应模型的转换器,此时只会选择模型转换器;
三、实现
1.不管是局部还是全局类型转换,转换器都是一样的,只是配置文件不一样,所以先实现转换器,这里还是以MyStruts2为基础。
package com.test.converter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException; public class DateTimeConverter extends DefaultTypeConverter { private DateFormat[] dateFormat={ new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("yyyy/MM/dd"), new SimpleDateFormat("yy-MM-dd") }; private DateFormat[] timeFormat={ new SimpleDateFormat("HH:mm:ss"), new SimpleDateFormat("HH:mm"), }; @Override public Object convertValue(Map<String, Object> context, Object value, Class toType) { if(toType.equals(java.sql.Date.class)) { String[]parameterValues=(String[])value; for(DateFormat format:dateFormat) { try{ return new java.sql.Date(format.parse(parameterValues[0]).getTime()); } catch(ParseException e){} catch (java.text.ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } else if(toType.equals(java.sql.Time.class)) { String[]parameterValues=(String[])value; for(DateFormat format:timeFormat) { try{ return new java.sql.Time(format.parse(parameterValues[0]).getTime()); } catch(ParseException e){} catch (java.text.ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } else if(toType.equals(java.util.Date.class)) { String[]parameterValues=(String[])value; for(DateFormat format:dateFormat) { try{ return format.parse(parameterValues[0]); } catch(ParseException e){} catch (java.text.ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } else if(toType.equals(String.class)) { if(value instanceof java.sql.Date){ return dateFormat[0].format((java.sql.Date)value); } else if(value instanceof java.sql.Time) { return timeFormat[0].format((java.sql.Time)value); } else if(value instanceof java.util.Date) { return dateFormat[0].format((java.util.Date)value); } } return super.convertValue(context, value, toType); } }
2.配置
普通Action中的类型转换:user.birthDay=com.test.converter.DateTimeConverter
基于模型驱动的类型转换:birthDay=com.test.converter.DateTimeConverter
全局类型转换:java.util.Date=com.test.converter.DateTimeConverter
这里还是新增一个User,时间格式是/也是能输出