java 制作属性编辑器_jsp使用javaBean,实现简单的属性编辑器

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、结果显示

421bb9e70117d49185e28a36ac841322.png

在找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所以这里没说

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值