随笔-35  评论-97  文章-0  trackbacks-0

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, ""falsefalse);
        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]

 

 

posted on 2007-06-26 16:46 三告习习 阅读(6676) 评论(0)  编辑  收藏 所属分类: java/jdk

只有注册用户登录后才能发表评论。


网站导航: