WebDataBinder跟PropertyEditorSupport
PropertyEditorSupport
通过继承JDK 中的 java.beans.PropertyEditorSupport 类来实现自己的编辑器类 ,该类用于实现将String 类型转换成您需要的数据类型。然后我们只需要在Spring 的容器中对这个编辑器进行有效的“注册”便可以实现Spring 在装配Bean 时自动的将String 类型转换成我们自定义的类型。
如何编辑自己的PropertyEditor,其实需要了解一点java.beans包的知识,在该包中,有一个 java.beans.PropertyEditor的接口,它定义了一套接口方法(12个),即通过这些方法如何将一个String变成内部的一个对 象,这两个方法是比较重要的:
a)setValue(Object value) 直接设置一个对象
b)setAsText(String text) 通过一个字符串来构造对象,一般在此方法中解析字符串,将构造一个类对象,调用setValue(Object)来完成属性对象设置操作。
c)getValue() 获取该对象
d)getAsText(String text) 通过对象来构造字符串,一般在此方法中转换成字符串,将构造的对象转换为字符串,调用getValue()来获取对象。
实现所有的接口方法是麻烦的,java.beans.PropertyEditorSupport 适时登场,一般情况下,我们通过扩展这个方便类即可。
WebDataBinder
开发的时候前台将参数传到后台,可是经常会遇到的一种情况就是传过来的数据到后台要组装成一种对象的格式,这时候spring提供的@initBinder这个annotation 就发挥了很大的作用。
众所周知spring可以自动将request中的数据对应到对象的每个property,会自动的bind 一些simple data (Strings, int, float, etc.) 对应到 你所要求的Object中,可是如果面对复杂的对象,那就需要借助于PropertyEditor 来帮助你完成复杂对象的对应关系,这个接口提供了两个方法,将一个property 转成string getAsText(), 另外一个方法是将string类型的值转成property对应的类型。而PropertyEditor实现了PropertyEditor这个接口,我们也可以重写相应的方法来构造自己的对象。
@InitBinder protected void initBinder(WebDataBinder binder) { // String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击 binder.registerCustomEditor(String.class, new PropertyEditorSupport() { @Override public void setAsText(String text) { // setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim())); if(text == null){ setValue(null); }else{ setValue(StringEscapeUtils.escapeHtml4(text.trim())); System.out.println("=========escapeHtml4=========="+StringEscapeUtils.escapeHtml4(text.trim())); } } @Override public String getAsText() { Object value = getValue(); return value != null ? value.toString() : ""; } }); // Date 类型转换 binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { @Override public void setAsText(String text) { setValue(DateUtils.parseDate(text)); } // @Override // public String getAsText() { // Object value = getValue(); // return value != null ? DateUtils.formatDateTime((Date)value) : ""; // } }); }
参考文献/博客地址:对技术大牛表示感谢~
http://uule.iteye.com/blog/869060
http://www.cnblogs.com/AloneSword/p/3998943.html
http://blog.****.net/hongxingxiaonan/article/details/50282001