我想用ActionForm收集java.util.Data类型的数据时报错了,听人说好像有种方法可以解决,就是用一个监听器监听actionform收集data数据时让它自动完成数据转型的工作,具体如何实现呀?望高手指点

解决方案 »

  1.   

    在默认情况下struts1.X是无法转换java.util.Date类型的,可以自己定义一个转换器来实现转换。
    自定义转换器的实现步骤:
        * 实现converter接口,实现convert方法
        * 将实现的conerter注册,通常情况采用servlet注册
    package com.bjsxt.struts;import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;import org.apache.commons.beanutils.Converter;/**
     * java.util.Date类型转换器
     * @author Administrator
     *
     */
    public class UtilDateConverter implements Converter { public Object convert(Class type, Object value) {
    System.out.println("UtilDateConverter.value=" + value);
    if (value == null) {
    return value;
    }
    if (value instanceof Date) {
    return value;
    }
    Date d = null;
    if (value instanceof String) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    try {
    d = sdf.parse((String)value);
    } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    return d;
    }}
    package com.bjsxt.struts;import java.util.Date;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;import org.apache.commons.beanutils.ConvertUtils;/**
     * 注册java.util.date转换器
     * @author Administrator
     *
     */
    public class UtilDateConverterInitWithServlet extends HttpServlet { @Override
    public void init() throws ServletException {
    System.out.println("UtilDateConverterInitWithServlet.init()");
    ConvertUtils.register(new UtilDateConverter(), Date.class);
    }}
    web.xml:
     <servlet>
       <servlet-name>UtilDateConverterInitWithServlet</servlet-name>
       <servlet-class>com.bjsxt.struts.UtilDateConverterInitWithServlet</servlet-class>
       <load-on-startup>3</load-on-startup>
      </servlet>
      

  2.   

    首先XxxxForm类的属性最好都是String类型的
    最好套个验证框架,然后可以用commons包中BeanUtils.copyProperties拷贝到XxxxxBean类中
      

  3.   

    1.增加类,实现接口Converter 
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;import org.apache.commons.beanutils.Converter;
    /**

    * 日期换对使用换器在BaseForm当中做一下注册系统动地帮助字符的日期示换为java.util.Date对.
    */
    public class DateConverter implements Converter {
        /**
         * 日期格式化对.
         */
        private static SimpleDateFormat df = new SimpleDateFormat();
        
        /**
         * 模式合.
         */
        private static Set patterns = new HashSet();
        //注册一下日期的换格式
        static{
            DateConverter.patterns.add("yyyy-MM-dd");
            DateConverter.patterns.add("yyyy-MM-dd HH:mm");
            DateConverter.patterns.add("yyyy-MM-dd HH:mm:ss");
            DateConverter.patterns.add("yyyy/MM/dd HH:mm:ss");
        }
        
        /**
         * 日期换器.
         * @param type Class
         * @param value Object
         * return Date Object.
         */
        public Object convert(Class type,Object value){
            if(value == null){
                return null;
            }else if(value instanceof String){
                Object dateObj = null;
                Iterator it = patterns.iterator();
                while(it.hasNext()){
                    try{
                        String pattern = (String)it.next();
                        df.applyPattern(pattern);
                        dateObj = df.parse((String)value);
                        break;
                    }catch(ParseException ex){
                        //do iterator continue
                    }
                }
                return dateObj;
            }else{
                return null;
            }
        }2.注册日期转换器,可以在form中增加
        static{
            ConvertUtils.register(new DateConverter(), Date.class);
        }
      

  4.   

    如果有特殊要求必须在java里转换的话,那你就用java.util.Date类型转换器
    如果没有要求,这就是能收到日期类型的数据进行查询什么的话,最好的方法是在sql里转化,这时候在formbean里定义的类型就是string了,这个比java.util.Date类型转换器快捷方便