天天看点

Spring属性编辑PropertyEditorSuppor转换器Converter

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

PropertyEditorSupport : Spring 3.0之前使用的架构

Spring属性编辑PropertyEditorSuppor转换器Converter

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

Spring属性编辑PropertyEditorSuppor转换器Converter

两者的区别详细可看这篇文章: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属性编辑PropertyEditorSuppor转换器Converter

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