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>
原文地址:https://www.cnblogs.com/wen12128/p/2054117.html