struts2日期在中文环境上提交正确,在英文环境上提交报错
最近开发s2sh项目,在本机测试好了,放到服务器上,保存订单的时候日期出错了,报日期类型转换错误,最后查找资料发现:由于Struts2匹配日期时,使用了Locale,服务器默认的语言环境是英语,就会出现日期类型转换异常,如果把中文设置为默认语言环境,再测试,没问题了。终于知道了原因。
写一个日期类型转换器就行了!
页面日期类型:
开始日期:<s:datetimepicker name="product.startDate" displayFormat="yyyy-MM-dd" />
转换器如下:
package cn.anycall.conversion;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 blocke.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