java Bean规范中有这样一个接口,PropertyEditor,从这个接口的名字来看,是用来进行编辑属性的,那自然是编辑对象的属性。
1.为什么需要属性编辑器呢
我们通常会在类型定义各种类型的属性,通常我们自己通过new创建对象,并且设置属性的时候,我们知道每个字段是什么类型,我们就会设置一个对应类型的值给指定的字段。但是有的时候我们需要将一个字符串,转换为某个字段的类型,因为有些类型,如果是从字符串转换为该类型,比较复杂,所以我们就需要一个工具类来抽取转换的代码,将字符串转换为指定的类型。所以java.beans中定义了PropertyEditor,该接口中定义的void setAsText(String text) 就是将传入的字符串text转换为指定类型的对象,为了方便使用,java为这个接口定义了一个默认的实现类PropertyEditorSupport类,它帮助我们实现了所有的方法,我们只需要继承它就可以使用了。在PropertyEditorSupport定义了一个value的字段,setAsText()中 将字符串转化为指定类型的对象以后,通过setValue() 把该对象赋值给 value字段,这样我们就可以通过getValue()方法获取到我们想要的对象
2.属性编辑器能完成什么样的功能
(1) 一个PropertyEditor的实现类,可以帮我们完成把一个字符串转换为一个我们想要的对象
(2)该类还定义了一个 String getAsText() ,主要就是返回一个能代表指定类型的对象,并且我们看得懂的字符串
3.在Spring中我们有大量的这种场景,比如我们在一个类中定义了一个URL类型的字段,但是我们在xml文件中通过Property标签配置该字段是只能配置字符串类型,所以就需要一个PropertyEditor 将我们配置的 字符串转换为 URL类型的对象。比如在SpringMvc中,我们定义的接收参数的Model中可能有各种各样类型的字段,有时候还可能定义一个数组类型的字段,但是前端传过来的参数都是字符串,所以就需要有对应的PropertyEditor将字符串转换为想要的类型的对象
我们自定义一个PropertyEditor来测试一下
public class PersonEditor extends PropertyEditorSupport {@Overridepublic void setAsText(String text) throws IllegalArgumentException {String[] split = text.split("#");Person person = new Person();person.setName(split[0]);person.setAge(Integer.parseInt(split[1]));this.setValue(person);}@Overridepublic String getAsText() {return ((Person)this.getValue()).getName() + "#" + ((Person)this.getValue()).getAge();}public static void main(String[] args) {PersonEditor personEditor = new PersonEditor();personEditor.setAsText("孙悟空#30");System.out.println(personEditor.getValue());System.out.println(personEditor.getAsText());}
}运行结果:
Person{name='孙悟空', age=30}
孙悟空#30
可以看到我们成功将字符串 孙悟空#30 转换为一个Person对象,这样如果我们在接收参数的Model中定义了Person类型的字段,前端传了 孙悟空#30 ,我们就可以用PersonEditor来将
孙悟空#30 转换为一个Person对象