JavaBean就是一个可生用的构件,并可在开发工具中,如Netbeans中进行可视化的操作,与VB的可视化拖拽操作类似.有时候我们也会在jsp中使用简化的JavaBean.在Netbeans中使用时, 一般需要打包成Jar文件,并在清单中注明,尽量不要使用缺省包名.有时空格换行什么的会影响Bean的加载.
Name: com/qp/Abean.class
java-Bean: True
JSP中就是最常见的<jsp:useBean>
JavaBean有一些规范,如存在缺省的构造函数,对属性使用get/set方法,定义事件/动作方法.
对于Javabean而言并没有必须的特殊技术,接口.对于可视化组件需要继承(J)Component, 非可视化bean则不需要.
属性的设置与读取命名方法为setXXX/getXXX/isXXX.
事件为(add|remove)EventNameListener(EventNameListener e), awt/Swing的组件大多为Javabean.
属性可以分为四类:
简单属性(如基本类型/字符串)
索引属性(数组),命名规范为
Type[] getPropertyName();
void
setPropertyName(Type[] nv)
Type
getPropertyName(int i);
void
setPropertyName(int i,Type nv)
绑定属性.当属性值变化时,通知所有相关的监听器.实现方法
1.属性发生了变化,发送一个PropertyChange事件,经常是在setXX方法中.
2.为了使感兴趣的监听器能够注册,Bean需要实现以下两个方法.
(add|remove)PropertyChangeListener(PropertyChangeListener l)方法.
java.beans包中有一个实用类,PropertyChangeSupport可以帮助管理监听器.
如果是可视化bean,由于Component已经存在注册监听器的方法,所以不必在自己实现了.
约束属性,即任何监听器都可以否决所提出的改变.强迫其还原旧的值. 实现方法:
bean中包含两个方法add|removeVetoableChangeList
ener(VetoableChangeListener); 还有getVetoxxxx().
为了管理器,VetoableChangeSupport可以方便功能.
public void setValue(Type newValue) throws PropertyVetoException{
Type oldValue=getValue();
vetoSupport.fireVetoableChange("value",oldValue,newValue);
//survived,no veto
value=newValue;
changeSupport.firePropertyChange("value",oldValue,newValue);
}
开发工具缺省通过反射确定bean的属性和事件,所以bean的实现需要符合规范. 当然也可以提供一个信息类,以明确告诉开发工具自身的属性和事件.
如果需要更灵活的方式来描述有送Bean的信息,可以定义定义一个实现BeanInfo接口的对象,信息类的名字必须是BeanName+BeanInfo. 与BeanInfo接口对应的有一个抽象类,SimpleBeanInfo.其中的getIcon方法可以定义出现在可视化开发工具中显示的图标.
并不是一旦有了BeanInfo就不会自动反射以获得bean属性即事件了,BeanInfo有对应的获取属性和事件的方法,如果返回为null,那么标准命名模式的反射将会派上用场. 具体可参见Introspector源码.集成开发工具即使用此类获得beaninfo.
Introspector可以用于得到javabean的元数据.
BeanInfo info = Introspector.getBeanInfo( SimpleBean.class ); 此方法会缓存beaninfo,以在下次调用中, 不再执行反射方法.
属性编辑器,这是指在开发工具中如何指定属性,如Color属性,当然我们可以指定的rgb值,但更好的方法是调用一个颜色选择面板.
属性编辑器必须提供缺省的构造器,并实现PropertyEditor接口.但通常我们会使用PropertyEditorSupport抽象类.
getAsText/setAsText方法定义了以字符串形式设置或读取属性的方法.
如果需要图形化处理属性,可以让isPaintable()返回true,使用 paintValue 显示属性值.
指定PropertyEditor可以使用以下方法.
1.BeanInfo. PropertyDescriptor.setPropertyEditorClass(TitleEditor.class);
2.java.beans.PropertyEditorManager.registerEditor(..)
3.PropertyEditorManager
自动查找CustomPropertyClassEdito
r作为CustomPropertyClass类型属性的编辑器.
JavaBean的序列化, 使用Java中普通的对象序列化,但是普通对象序列化由于版本问题是不适合长期存储的.使用此方法的javabean必须实现Serialiable或Externaliable接口.
java.beans.Beans.getInstanceOf(...)就是得到给定类的一个实例.但与new,反射等方法不同的是, 它会先查找给定类名.ser资源文件,如果有的话, 则直接反序列化它而生成实例,如果没有,则通过反射生成实例.
这个ser文件则是对javabean实例的序列化得到的原型bean(prototype bean).
这种机制常用于自定义类,
如一个标签Label, 以此可以序列化为红色的,黄色的ser文件, 则此后可直接生成对应的实例,由此getInstanceOf()方法并不一定是传入类名, 故声明中叫做beanName.
JavaBean也可以通过xml来存储的,其一般只是用于记录bean的属性. 可由此保存和重建开发工具中设计的UI界面.此适合长期化存储,而不必担心javaBean的版本变化.
如new XMLEncoder(new FileOutputStream(..)).writeObject(new JFrame);
XMLDecoder.readObject();
由于XMLEncoder无法处理内部类,所以必须使用EventHandler构建动作.
loadButton.addActionListener(EventHandler.create(ActionListener.class,this,"load"));
XML序列器缺省情况下并不能处理不太规范的bean,如没有对应的set方法的bean.
Name: com/qp/Abean.class
java-Bean: True
JSP中就是最常见的<jsp:useBean>
JavaBean有一些规范,如存在缺省的构造函数,对属性使用get/set方法,定义事件/动作方法.
对于Javabean而言并没有必须的特殊技术,接口.对于可视化组件需要继承(J)Component, 非可视化bean则不需要.
属性的设置与读取命名方法为setXXX/getXXX/isXXX.
事件为(add|remove)EventNameListener(EventNameListener e), awt/Swing的组件大多为Javabean.
属性可以分为四类:
简单属性(如基本类型/字符串)
索引属性(数组),命名规范为
绑定属性.当属性值变化时,通知所有相关的监听器.实现方法
1.属性发生了变化,发送一个PropertyChange事件,经常是在setXX方法中.
2.为了使感兴趣的监听器能够注册,Bean需要实现以下两个方法.
java.beans包中有一个实用类,PropertyChangeSupport可以帮助管理监听器.
如果是可视化bean,由于Component已经存在注册监听器的方法,所以不必在自己实现了.
约束属性,即任何监听器都可以否决所提出的改变.强迫其还原旧的值. 实现方法:
为了管理器,VetoableChangeSupport可以方便功能.
public void setValue(Type newValue) throws PropertyVetoException{
}
开发工具缺省通过反射确定bean的属性和事件,所以bean的实现需要符合规范. 当然也可以提供一个信息类,以明确告诉开发工具自身的属性和事件.
如果需要更灵活的方式来描述有送Bean的信息,可以定义定义一个实现BeanInfo接口的对象,信息类的名字必须是BeanName+BeanInfo. 与BeanInfo接口对应的有一个抽象类,SimpleBeanInfo.其中的getIcon方法可以定义出现在可视化开发工具中显示的图标.
并不是一旦有了BeanInfo就不会自动反射以获得bean属性即事件了,BeanInfo有对应的获取属性和事件的方法,如果返回为null,那么标准命名模式的反射将会派上用场. 具体可参见Introspector源码.集成开发工具即使用此类获得beaninfo.
Introspector可以用于得到javabean的元数据.
属性编辑器,这是指在开发工具中如何指定属性,如Color属性,当然我们可以指定的rgb值,但更好的方法是调用一个颜色选择面板.
属性编辑器必须提供缺省的构造器,并实现PropertyEditor接口.但通常我们会使用PropertyEditorSupport抽象类.
getAsText/setAsText方法定义了以字符串形式设置或读取属性的方法.
如果需要图形化处理属性,可以让isPaintable()返回true,使用 paintValue 显示属性值.
指定PropertyEditor可以使用以下方法.
1.BeanInfo. PropertyDescriptor.setPropertyEditorClass(TitleEditor.class);
2.java.beans.PropertyEditorManager.registerEditor(..)
3.PropertyEditorManager
JavaBean的序列化, 使用Java中普通的对象序列化,但是普通对象序列化由于版本问题是不适合长期存储的.使用此方法的javabean必须实现Serialiable或Externaliable接口.
java.beans.Beans.getInstanceOf(...)就是得到给定类的一个实例.但与new,反射等方法不同的是, 它会先查找给定类名.ser资源文件,如果有的话, 则直接反序列化它而生成实例,如果没有,则通过反射生成实例.
JavaBean也可以通过xml来存储的,其一般只是用于记录bean的属性. 可由此保存和重建开发工具中设计的UI界面.此适合长期化存储,而不必担心javaBean的版本变化.
如new XMLEncoder(new FileOutputStream(..)).writeObject(new JFrame);
XMLDecoder.readObject();
由于XMLEncoder无法处理内部类,所以必须使用EventHandler构建动作.
loadButton.addActionListener(EventHandler.create(ActionListener.class,this,"load"));
XML序列器缺省情况下并不能处理不太规范的bean,如没有对应的set方法的bean.