javaBean在使用的时候,会将字符串类型转化为对应的Bean中的类型。Java给出的可以自动转换的类型有boolean、byte、short、int、long、float、double、java.lang.String、java.awt.Color、java.awt.Font,这些都对应有各自的属性编辑器。但如果想要添加新的转换类型,即新的属性编辑器。需要了解一个类和一个接口。本篇将记录String-->java.util.Date的转换。
主要思想是,用属性编辑管理器注册属性编辑器。这样,就能自动转换。属性编辑管理器会自动被调用并自动调用属性编辑器。
接口PropertyEditor:这个接口位于java.beans下。这个接口是属性编辑器的接口,实现这个接口就实现了属性编辑器。这样就能够实现不同类型间的转换,比如这里需要的String-->Date的转换。关于接口中的方法这里不再列出,非常简单的方法一看就明白。对于该接口,java还提供了一个实现类ProPertyEditorSupport。这个实现类为了方便JavaGUI的使用,又添加了一些关于JavaGUI的方法。但是不影响我们的使用。笔者在看完IntegerEditor后认为下面的方法需要注意。
getAsText()-->String:以文本形式获得属性值。
getValue-->Object:获得属性值。
setAsText(String text)-->void:通过解析给定的String设置属性值。
setValue(Object value)-->void:设置(或更改)将编辑的对象。
类PropertyEditorManager:这个类也位于java.beans下。通过名字也可以明白这个是管理属性编辑器的类。文档中这样说:该类使用三种技术来查找给定类型的编辑器。首先,它提供一个 registerEditor 方法,允许专门为某一给定类型注册编辑器。其次,它试图通过将 "Editor" 添加到给定类型的完全限定类名中(例如 "foo.bah.FozEditor")来查找合适的类。最后,它使用简单的类名称(没有包名称)添加 "Editor",并在包的搜索路径中查找匹配类。因此,对于输入类 foo.bah.Fred,PropertyEditorManager 首先将查看其表以确定是否已经为 foo.bah.Fred 注册了编辑器,若已注册,则使用它。然后它将查找 foo.bah.FredEditor 类。接着将查找(比如说)standardEditorsPackage.FredEditor 类。该类有四个静态方法和一个公共无参构造。
registerEditor(Class> targetType, Class> editorClass)-->void,注册一个将用来编辑给定目标类的编辑器类。
findEditor(Class> targetType)-->PropertyEditor,查找给定目标类型的值编辑器。
getEditorSearchPaht(Class> targetType, Class> editorClass)-->String [],获得用来搜索属性编辑器的包名称
setEditorSearchPaht(String [] path)-->void,更改将用来查找属性编辑器的包名称的列表。
本文使用第一种方法,即注册属性编辑器的方法,下面记录过程
1、在了解接口后,决定看下默认的属性编辑器是怎样完成的,于是利用反射的到Integer的属性编辑器中的方法和属性。
public static voidmain(String[] args) {
PropertyEditorManager pem= newPropertyEditorManager();
PropertyEditor propertyEditor=pem.findEditor(Integer.class);
Class cls=propertyEditor.getClass();
Field [] fieldList=cls.getDeclaredFields();for(Field f: fieldList) {
System.out.println(f);
}
Method [] methodList=cls.getDeclaredMethods();for(Method m: methodList) {
System.out.println(m);
}//输出的结果为
/*public void com.sun.beans.editors.IntegerEditor.setAsText(java.lang.String)
throws java.lang.IllegalArgumentException*/}
2、由输出的结果可以看出,这个类中只有一个自己的方法为setAsText(),于是找到该类的源码。
public void setAsText(String text) throwsIllegalArgumentException {
setValue((text== null) ? null: Integer.decode(text));
}o
3、这里就可以看出,原来大部分的方法实现都在PropertyEditorSupport中。所以有了下面的实现。
public class DatePropertyEditor extendsPropertyEditorSupport{
@Overridepublic voidsetAsText(String str) {
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");try{
setValue(sdf.parse(str));
}catch(ParseException e) {
e.printStackTrace();
}
}
}
4、注册属性编辑器,为了能够在jsp中使用于是利用servlet的init()来完成此步骤的运行。
public class RegisterEditorServlet extendsHttpServlet{private static final long serialVersionUID = 1L;public void init() throwsServletException{
PropertyEditorManager.registerEditor(Date.class, DatePropertyEditor.class);
}
}
5、servlet的配置。
dateEditorRegister
com.test.utils.RegisterEditorServlet
0
6、验证。两个jsp页面如下
账户:
密码:
时间:
如下是页面2
7、结果显示
在找IntegerEditor时看到,这个类继承自NumberEditor,然后看到NumberEditor中也只有一个方法如下。
publicString getJavaInitializationString() {
Object value=getValue();return (value != null)?value.toString()
:"null";
}
然后又看了String的属性转换器,其中只有两个方法
public java.lang.String com.sun.beans.editors.StringEditor.getJavaInitializationString()
public void com.sun.beans.editors.StringEditor.setAsText(java.lang.String)
与NumberEditor和IntegerEditor中方法对应。还有一个属性转换器,用于GUI所以这里没说