Struts2 数据类型转换

转 http://blog.csdn.net/liuzhenfeng/article/details/6605045

 

在使用Struts2进行开发的过程中,我们经常会使用Struts2自带的类型转换器,这些类型转换器也实在简化了我们的开发,但是,有时它们也会出现一些问题。例如,

 

<input id="startTime
" name="startTime
"  readonly
 onfocus="WdatePicker()
"
      value
="${startTime }
"></input>(日期格式设置为“yyyy-MM-dd”)

 

Action的属性定义为: private Date startTime ;

这样在中文环境(locale)的系统中使用并没有什么问题,但是,在英文环境的系统中就会有异常抛出。原因是在英文环境中没有“yyyy-MM-dd”格式的日期,所以转换过程就会抛出异常。

既然知道了产生异常的原因,就有办法解决了,写一个日期转换器就行了。

  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

你可能感兴趣的:(struts2,conversion)