strut2 自定义类型转换器

描述:假设用户请求地址:http://xxx.action?date=2015-01-01.  假设action中已经存在了date属性,且类型为Date。当用户请求的参数格式为xxxx-xx-xx或者xxxx-x-x的时候,action可以正常的接收到日期类型,即string字符串可以自动转换为Date类型。但是当用户的请求为xxxxxxxx(20150101)的时候,action不能够转换为日期类型,且报错。这时候就需要自定义类型转换器来实现日期的转换。

问题解决:自定义类型转换器

  1. 新建立一个类,DateTypeConverter.java,并继承系统类DefaultTypeConverter,重写convertValue(Map<String, Object> context, Object value, Class toType)方法。参数介绍,value表示客户端地址请求的值,toType表示需要转换的类型。该方法支持双向转换,即客户端请求----->action------>jsp页面回显值。该类的具体代码如下所示:
    package cn.itcast.type.converter;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
    
    public class DateTypeConverter extends DefaultTypeConverter {
    
        @Override
        public Object convertValue(Map<String, Object> context, Object value, Class toType) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
            try { 
                if(toType == Date.class){//当字符串向Date类型转换时
                    String[] params = (String[]) value;// request.getParameterValues() 值是一个数组,因为要考虑到复选框的情况
                    return dateFormat.parse(params[0]);
                }else if(toType == String.class){//当Date转换成字符串时
                    Date date = (Date) value;
                    return dateFormat.format(date);
                }
            } catch (ParseException e) {}
            return null;
        }
    }
  2. action中的代码如下:HelloWorldAction.java
    package cn.itcast.action;
    
    import java.util.Date;
    
    public class HelloWorldAction {//?birthday=2008-10-10
        private Date birthday;
        
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            System.out.println(birthday);
            this.birthday = birthday;
        }
    
        public String addUI(){
            return "success";
        }
    
        public String execute() throws Exception{
            return "success";
        }
    }
  3. 注册局部类型转换器,局部类型转换器只对某个action中的的属性起作用,因为不是全局转换器。规则:Action的简单类名-conversion.properties,这个文件要跟Action放在同一个包中。在该文件中,采用的事键值对的配置方式:属性名=自定义类型转换器的完整类名。具体配置如下:birthday=cn.itcast.type.converter.DateTypeConverter。cn.itcast.type.converter代表包名。
原文地址:https://www.cnblogs.com/kailing-con/p/4197301.html