[转] struts2日期在中文环境上提交正确,在英文环境上提交报错

由于Struts2匹配日期时,使用了Locale,服务器默认的语言环境是英语,就会出现日期类型转换异常,如果把中文设置为默认语言环境,再测试,没问题了。终于知道了原因。 
写一个日期类型转换器就行了! 
页面日期类型: 
Jsp代码   收藏代码
  1. 开始日期:<s:datetimepicker name="product.startDate"   displayFormat="yyyy-MM-dd"  />  

转换器如下:  
Java代码   收藏代码
  1. package cn.anycall.conversion;  
  2.   
  3. import java.text.ParseException;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.Date;  
  6. import java.util.Map;  
  7.   
  8. import ognl.DefaultTypeConverter;  
  9.   
  10. import org.apache.commons.lang.StringUtils;  
  11. import org.apache.commons.lang.time.DateUtils;  
  12. import org.apache.log4j.Logger;  
  13.   
  14.   
  15.   
  16.   
  17. public class DateConverter extends DefaultTypeConverter {  
  18.   
  19.     private static final Logger logger = Logger.getLogger(DateConverter.class);  
  20.   
  21.     private static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";  
  22.   
  23.     private static final String DATE_PATTERN = "yyyy-MM-dd";  
  24.       
  25.     private static final String MONTH_PATTERN = "yyyy-MM";  
  26.   
  27.     /** 
  28.      * Convert value between types 
  29.      */  
  30.     @SuppressWarnings("unchecked")  
  31.     public Object convertValue(Map ognlContext, Object value, Class toType) {  
  32.             Object result = null;  
  33.             if (toType == Date.class) {  
  34.                     try {  
  35.                         result = doConvertToDate(value);  
  36.                     } catch (ParseException e) {  
  37.                         // TODO Auto-generated catch block  
  38.                         e.printStackTrace();  
  39.                     }  
  40.             } else if (toType == String.class) {  
  41.                     result = doConvertToString(value);  
  42.             }  
  43.             return result;  
  44.     }  
  45.   
  46.     /** 
  47.      * Convert String to Date 
  48.      * 
  49.      * @param value 
  50.      * @return 
  51.      * @throws ParseException  
  52.      */  
  53.     private Date doConvertToDate(Object value) throws ParseException {  
  54.             Date result = null;  
  55.   
  56.             if (value instanceof String) {  
  57.                     result = DateUtils.parseDate((String) value, new String[] { DATE_PATTERN, DATETIME_PATTERN, MONTH_PATTERN });  
  58.   
  59.                     // all patterns failed, try a milliseconds constructor  
  60.                     if (result == null && StringUtils.isNotEmpty((String)value)) {  
  61.   
  62.                             try {  
  63.                                     result = new Date(new Long((String) value).longValue());  
  64.                             } catch (Exception e) {  
  65.                                     logger.error("Converting from milliseconds to Date fails!");  
  66.                                     e.printStackTrace();  
  67.                             }  
  68.   
  69.                     }  
  70.   
  71.             } else if (value instanceof Object[]) {  
  72.                     // let's try to convert the first element only  
  73.                     Object[] array = (Object[]) value;  
  74.   
  75.                     if ((array != null) && (array.length >= 1)) {  
  76.                             value = array[0];  
  77.                             result = doConvertToDate(value);  
  78.                     }  
  79.   
  80.             } else if (Date.class.isAssignableFrom(value.getClass())) {  
  81.                     result = (Date) value;  
  82.             }  
  83.             return result;  
  84.     }  
  85.   
  86.     /** 
  87.      * Convert Date to String 
  88.      * 
  89.      * @param value 
  90.      * @return 
  91.      */  
  92.     private String doConvertToString(Object value) {  
  93.             SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATETIME_PATTERN);  
  94.             String result = null;  
  95.             if (value instanceof Date) {  
  96.                     result = simpleDateFormat.format(value);  
  97.             }  
  98.             return result;  
  99.     }  
  100. }  


可以将该转换器注册为全局的:在classpath下建立xwork-conversion.properties文件,内容为:java.util.Date=cn.anycall.conversion.DateConverter

猜你喜欢

转载自wutheringsea.iteye.com/blog/1054583