地址:http://blog.csdn.net/liuzhenfeng/article/details/6605045
在使用Struts2进行开发的过程中,我们经常会使用Struts2自带的类型转换器,这些类型转换器也实在简化了我们的开发,但是,有时它们也会出现一些问题。例如,
value="${startTime }">(日期格式设置为“yyyy-MM-dd”)
Action的属性定义为: private Date startTime ;
这样在中文环境(locale)的系统中使用并没有什么问题,但是,在英文环境的系统中就会有异常抛出。原因是在英文环境中没有“yyyy-MM-dd”格式的日期,所以转换过程就会抛出异常。
既然知道了产生异常的原因,就有办法解决了,写一个日期转换器就行了。
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import ognl.DefaultTypeConverter; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateUtils; import org.apache.log4j.Logger; public class DateConverter extends DefaultTypeConverter { private static final Logger logger = Logger.getLogger(DateConverter.class); private static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; private static final String DATE_PATTERN = "yyyy-MM-dd"; private static final String MONTH_PATTERN = "yyyy-MM"; /** * Convert value between types */ @SuppressWarnings("unchecked") public Object convertValue(Map ognlContext, Object value, Class toType) { Object result = null; if (toType == Date.class) { try { result = doConvertToDate(value); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if (toType == String.class) { result = doConvertToString(value); } return result; } /** * Convert String to Date * * @param value * @return * @throws ParseException */ private Date doConvertToDate(Object value) throws ParseException { Date result = null; if (value instanceof String) { result = DateUtils.parseDate((String) value, new String[] { DATE_PATTERN, DATETIME_PATTERN, MONTH_PATTERN }); // all patterns failed, try a milliseconds constructor if (result == null && StringUtils.isNotEmpty((String) value)) { try { result = new Date(new Long((String) value).longValue()); } catch (Exception e) { logger.error("Converting from milliseconds to Date fails!"); e.printStackTrace(); } } } else if (value instanceof Object[]) { // let's try to convert the first element only Object[] array = (Object[]) value; if ((array != null) && (array.length >= 1)) { value = array[0]; result = doConvertToDate(value); } } else if (Date.class.isAssignableFrom(value.getClass())) { result = (Date) value; } return result; } /** * Convert Date to String * * @param value * @return */ private String doConvertToString(Object value) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat( DATETIME_PATTERN); String result = null; if (value instanceof Date) { result = simpleDateFormat.format(value); } return result; } }
可以将该转换器注册为全局的:在classpath下建立xwork-conversion.properties文件,内容为:java.util.Date=cn.anycall.conversion.DateConverter
另外,有人说直接在struts.xml 中定义常量,将locale设置为"zh_CN"也能解决该问题。
补充说明:
项目中,有碰到其他同事,用"yyyy-MM-dd HH:mm:ss "来做格式化的,提交的时候总是异常。
后来在做转化的时候,需要用string的trim来删去前后空格。