1.JavaBean的分类:可视化JavaBean和非可视化JavaBean。
2.JavaBean属性的分类:
JavaBean是可复用的平台独立的软件组件,开发者可以在软件构造器工具中其直接进行可视化操作。
1)简单属性(简单属性的JavaBean只是负责设置或获取单个的属性值)
2)绑定属性
3)约束属性
4)索引属性(获取和设置数组时使用的属性,要运用索引属性,需要提供两对get/set方法,一对用于数组另一对用于数组中的元素)
private String[] arr;
public String[] getArr(){return arr;}
public void setArr(String[] arrs){this.arr=arrs;}
public String getArr(int i){return arr[i];}
public void setArr(int i,String new){arr[i]=new;}
3.如果是可视化的JavaBean,就必须扩展java.awt.Component类。
软件构造器工具可以是Web页面构造器、可视化应用程序构造器、CUI设计构造器或服务器应用程序构造器。有时,构造器工具也可以是一个包含子一些bean的复合文档的文档编辑器。JavaBean可以是简单的CUI要素,如按钮或滚动条;也可以是复杂的可视化软件组件,如数据库视图,有些JavaBean是没有GUI表现形式的,但这些JavaBean仍然可以使用应用程序构造器可视化地进行组合。 一个JavaBean和一个Javaapplet相似,是一个非常简单的遵循某种严格协议的Java类。每个JavaBean的功能都可能不一样,但它们都必须支持以下特征。
一个bean没有必须继承的特定的基类或接口。可视化的bean必须继承的类是java.awt.Component,这样它们才能添加到可视化容器中去,非可视化bean则不需要继承这个类。有许多bean,无论是在应用程序构造器工具中,还是在最后创建好的应用程序中,都具有很强的可视化特征,但这并非每个bean必须的特征。
在使用Java编程时,并不是所有软件模块都需要转换成bean。Bean比较适合于那些具有可视化操作和定制特性的软件组件。
从基本上说,JavaBean可以看成是一个黑盒子,即只需要知道其功能而不必管其内部结构的软件设备。黑盒子只介绍和定义其外部特征和与其他部分的接口,如按钮、窗口、颜色、形状、句柄等。
Bean主体类
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.VetoableChangeListener;
import java.beans.VetoableChangeSupport;
public class MyJavaBean {
private String sex="male";
//支持绑定 (bound) 属性的 bean 可以使用该类。可以使用此类的实例作为 bean 的成员字段,并将各种工作委托给它。
PropertyChangeSupport propertySupport;
//支持约束 (constrained) 属性的 bean 可以使用此类。可以使用此类的实例作为 bean 的成员字段,并将各种工作委托给它。
VetoableChangeSupport vetoableSupport;
public MyJavaBean() {
//绑定本bean
propertySupport = new PropertyChangeSupport(this);
//约束本bean
vetoableSupport = new VetoableChangeSupport(this);
}
public void setSex(String newSex) {
if (!newSex.equals(sex)) {
String oldValue = sex;
// 属性验证֤
try {
//向所有已注册的侦听器报告 vetoable属性更新。如果任何人禁止更改,则触发一个新的事件,
//该事件将每个人的属性还原为旧值,然后再次抛出 PropertyVetoException。
//如果新属性和旧属性相等并且是非 null 的,则不会触发事件。
vetoableSupport.fireVetoableChange("changesex", sex, newSex);
// 没被阻止
sex = newSex;
} catch (Exception e) {
System .out.println("禁止修改");
}
//报告所有已注册侦听器的绑定属性更新。如果新属性和旧属性相同并且是非 null 的,则不会触发事件。
propertySupport.firePropertyChange("changesex", oldValue, newSex);
}
}
public String getSex()
{
return this.sex;
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertySupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertySupport.removePropertyChangeListener(listener);
}
public void addVetoableChangeListener(VetoableChangeListener listener) {
vetoableSupport.addVetoableChangeListener(listener);
}
public void removeVetoableChangeListener(VetoableChangeListener listener) {
vetoableSupport.removeVetoableChangeListener(listener);
}
}
事件类
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
public class MyJavaBeanPropertyListener implements PropertyChangeListener,VetoableChangeListener{
@Override
public void vetoableChange(PropertyChangeEvent evt)throws PropertyVetoException {
if (evt.getNewValue().equals("female")){
// 处理监听到的事件
System.out.println("\"NewValue:\"" + evt.getNewValue() + "\"OldValue:\"" + evt.getOldValue() + "\"");
throw new PropertyVetoException("禁止变性", evt);
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("\"NewValue:\"" + evt.getNewValue() + "\"OldValue:\"" + evt.getOldValue() + "\"");
}
}
JSP文件
Insert title heremyBean.addPropertyChangeListener(new MyJavaBeanPropertyListener());
myBean.addVetoableChangeListener(new MyJavaBeanPropertyListener());
%>