youling 发表于 2016-10-30 22:59

Struts日期类型转换问题

      昨天遇到一个很奇怪的问题,一个同事用谷歌浏览器测试时在提交订单时报错:no result defined for action forresult input.但是我用我的谷歌浏览器又没有问题,然后又让其他同事试试,结果有个同事的猎豹浏览器也报错。这是个很奇怪的问题,百度了一下,找了一堆结果都没有解决我的问题,然后无意间看到一个Struts2日期转换的问题的帖子,这个贴子说是由于页面的日期String类型转换成java类中的Date类型时,由于没有找到 "YYYY-MM-dd"这种格式的日期,所有转换成日期对象失败,但是为什么会没有"YYYY-MM-dd"这种格式的日期呢。Struts2 在转换日期的时候会使用浏览器设置的日期格式去找,而且在浏览器的语言是英语的时候,日期格式是没有"YYYY-MM-dd"这种格式的。我又去看了出问题的浏览器的语言的设置,果然是英语,改成中文就好了。       但是我们不能强制要求客户去改浏览器的语言设置,因而我们可以对Date类型自定义转换方式,以下是http://www.javaeye.com/wiki/struts2/1365-passing-parameters-in-struts2 中的一个类型转换器定义(不适合国际化的环境),如需要,你可以定义自己的转换器:

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) {
                        result = doConvertToDate(value);
                } else if (toType == String.class) {
                        result = doConvertToString(value);
                }
                return result;
      }

      /**
         * Convert String to Date
         *
         * @param value
         * @return
         */
      private Date doConvertToDate(Object value) {
                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;
                              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=你的类型转换器的完整限定类名

懐惗 发表于 2016-10-30 23:15

虽然看不懂,感谢分享{:301_1003:}

czq牛牛 发表于 2017-3-21 14:48

跟我们考试讲的一样,想必您也是一位大神

youling 发表于 2017-3-25 23:50

相互学习而已O(∩_∩)O哈哈~
页: [1]
查看完整版本: Struts日期类型转换问题