Spring属性编辑PropertyEditorSuppor转换器Converter

这两者的功能都是为了对我们前台请求数据的转换,使程序能够正常接收

PropertyEditorSupport : Spring 3.0之前使用的架构


Converter:Spring 3.0之后的类型转换系统


两者的区别详细可看这篇文章:http://jinnianshilongnian.iteye.com/blog/1723270

一:属性编辑PropertyEditorSuppor

首先编写自己的类型
DatePropertyEditor 日期类型
public class DatePropertyEditor extends PropertyEditorSupport {
	
	@Override
	public Object getValue() {
		return super.getValue();
	}

	@Override
	public String getAsText() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(getValue());
	}

	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		Date date = null;
		try {
			//这里的text一定是 2015-9-03 这样类型和下面的格式一样
			//这就是为什么spring不提供转换器的原意不知道你是什么格式的调用setAsText对属性值进行转换类型
			date = new SimpleDateFormat("yyyy-MM-dd").parse(text);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		setValue(date);//类型转换
		
	}
}
SEXPropertyEditor自定义枚举类型
public class SEXPropertyEditor extends PropertyEditorSupport {
	
	@Override
	public Object getValue() {
		return super.getValue();
	}
	
	@Override
	public String getAsText() {
		return super.getAsText();
	}

	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		if(!StringUtils.isEmpty(text)){
			setValue(SEX.get(text)); 
		}else{
			setValue(null);
		}
	}
	
}
SEX枚举类
public enum SEX {

    Male("1", "男"),
    
    Female("-1", "女"),
    
    Unknown("0", "保密");
    
    private final String value;
    
    private final String description;

    SEX(String v, String desc) {
        this.value = v;
        this.description = desc;
    }

    public String getValue() {
        return value;
    }

    public String getDescription() {
        return description;
    }

    public static SEX get(String strValue) {
        for (SEX e : values()) {
            if (e.getValue().equals(strValue)) {
                return e;
            }
        }
        return null;
    }

    @Override
    public String toString() {
        return this.value;
    }

}

控制器接收数据如下
@Controller
public class DataController {
	
		@RequestMapping("/binder")
		public void data(Date date,SEX sex/*参数里面也可以放对象*/){
			System.out.println(date);
			System.out.println(sex.getDescription());
			System.out.println("=======");
		}
		/**
		 * 这个在数据传到控制器方法前会执行,这里对对象属性进行编辑
		 * 如果没有这步操作,请求将报 400错误
		 * @param binder
		 */
		@InitBinder
		public void initBinder(ServletRequestDataBinder binder){
			binder.registerCustomEditor(Date.class, new DatePropertyEditor());
			binder.registerCustomEditor(SEX.class, new SEXPropertyEditor());
		}
}

这个不是全局的,哪个控制器里面需要转换就必须用@InitBinder进行属性编辑

二:转换器Converter

通过implements Converter实现类型转换

DateConverter日期格式的转换器
/**
 * Converter<原类型,模板类型> 
 */
public class DateConverter implements Converter<String,Date> {

	@Override
	public Date convert(String arg) {
		Date date = null;
		try {
			date = new SimpleDateFormat("yyyy-MM-dd").parse(arg); 
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
}

SexEnumConverter自定义枚举类型的转换器

public class SexEnumConverter implements Converter<String,SEX> {

	@Override
	public SEX convert(String str) {
		String value = str.trim();
        if (value.isEmpty()) {
            return null;
        }
        return SEX.get(str); //这里就是将String类型转换为自定义的枚举
	}

}

然后我们需要修改一下配置文件
<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="converters">
			<set>
				<bean class="com.lwp.converter.DateConverter" />
				<bean class="com.lwp.converter.SexEnumConverter" />
			</set>
		</property>
	</bean>

	<mvc:annotation-driven conversion-service="conversionService"/>

此时这两个转换器就是全局可以不再使用属性编辑器,控制器中的代码删除InitBinder方法和注解
@Controller
public class DataController {
	
		@RequestMapping("/binder")
		public void data(Date date,SEX sex/*参数里面也可以放对象*/){
			System.out.println(date);
			System.out.println(sex.getDescription());
			System.out.println("=======");
		}
		
}

访问http://localhost:8080/sw/binder?date=2013-9-12%2023:2:23&sex=-1后台结果表示转换成功


注: 如果转换器和属性编辑器同时作用上,spring会先使用编辑器的方法,而不会再进入转换器的操作.两者不冲突.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值