java.beans.PropertyEditor的从字义来看是一个属性编辑器,但总觉得它的作用更像一个转换器--从字符串转换为类对象的属性。
java.beans.PropertyEditor接口定义的方法有好几个,但是最重要为下面两个:
void setValue(Object value)
void setAsText(String text) throws java.lang.IllegalArgumentException;
一般地,我们要使用PropertyEditor时,并不直接实现此接口,而是通过继承实现此接口的java.beans.PropertyEditorSupport来简化我们的工作,在子类覆盖setAsText方法就可以了,setValue方法一般不直接使用,在setAsText方法中将字符串进行转换并产生目标对象以后,由调setAsText调用setValue来把目标对象注入到编辑器中。当然,你可用覆盖更多的方法来满足你的特殊要求。JavaBean的类和接口,被大部分spring包使用,可以从spring中学习更成熟的JavaBean使用方法。
简单的例子:
实体类Person:
public class Person
{
private String name;
private String sex;
private int age;
public Person(String name, String sex, int age)
{
this.name = name;
this.sex = sex;
this.age = age;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getSex()
{
return sex;
}
public void setSex(String sex)
{
this.sex = sex;
}
@Override
public String toString()
{
return "Person["+name+", "+sex+", "+age+"]";
}
}
Person的属性编辑器:
public class PersonPropertyEditor extends PropertyEditorSupport
{
public void setAsText(String text)
{
setValue(parseString(text));
}
private Object parseString(String text)
{
String[] parts = tokenizeToStringArray(text, ", ", false, false);
String name = (parts.length > 0 ? parts[0] : "undefine");
String sex = (parts.length > 1 ? parts[1] : "undefine");
int age = (parts.length > 2 ? Integer.valueOf(parts[2]) : 0);
return (text.length() > 0 ? new Person(name, sex, age) : null);
}
private String[] tokenizeToStringArray(String str, String delimiters, boolean trimTokens,
boolean ignoreEmptyTokens)
{
StringTokenizer st = new StringTokenizer(str, delimiters);
List tokens = new ArrayList();
while(st.hasMoreTokens())
{
String token = st.nextToken();
if(trimTokens)
{
token = token.trim();
}
if(!ignoreEmptyTokens || token.length() > 0)
{
tokens.add(token);
}
}
return toStringArray(tokens);
}
private String[] toStringArray(Collection collection)
{
if(collection == null)
{
return null;
}
return (String[])collection.toArray(new String[collection.size()]);
}
}
测试代码:
public static void main(String[] args)
{
PersonPropertyEditor editor = new PersonPropertyEditor();
editor.setAsText("aSam,man,22");
System.out.println(editor.getValue());
}
结果输出:
Person[aSam, man, 22]
没什么JAVA BEAN基础,看了看spring的beanwrapper
大概了解了propertyEditor的工作方式,主要关注convert string to object
记下来,省得用到时再乱找
步聚:
1,写出你要转换的bean及对应的propertyEditor(如:Person=>PersonEditor)
2,用PropertyEditorManager注册: java代码:
PropertyEditorManager.registerEditor(Person. class ,PersonEditor. class )
3,你得到一个要转换的string,查出想转换成的bean对映的propertyEditor
如:
java代码:
PropertyEditorManager.findEditor(Person. class )
4,你知道啦,调用你找到的editor的setAsText(String)
如:
java代码:
editor.setAsText( " 23,liunix " );
5,在你属性宿主bean上调用setter
如:
java代码:
personManager.setPerson((Person)editor.getValue())
ok!
另外,可以省去PropertyEditorManager.registerEditor注册方法有
1,
你要转换的bean及对应的propertyEditor在同一个包内,而且名字形如:Person=>Person+Editor来定义两个类的名字,
2,名称对应,不在一个包内
调用PropertyEditorManager.setEditorSearchPath(String[])
其中string[]指定你editor的包名即可