JavaBean的绑定属性及约束属性[转]
转自:http://www.cnblogs.com/abllyboy/archive/2010/12/19/1910543.html
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文件
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@page import="com.myservlet.bean.MyJavaBeanPropertyListener"%> <jsp:useBean id="myBean" class="com.myservlet.bean.MyJavaBean" scope="page"></jsp:useBean> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <% myBean.addPropertyChangeListener(new MyJavaBeanPropertyListener()); myBean.addVetoableChangeListener(new MyJavaBeanPropertyListener()); %> <jsp:getProperty property="sex" name="myBean"/> <jsp:setProperty property="sex" name="myBean" value="female"/> <br/> <jsp:getProperty property="sex" name="myBean"/> </body> </html>