`

JavaBean中的绑定属性与限制属性

    博客分类:
  • Java
阅读更多

JavaBean 中的属性

 

JavaBean 的属性与一般Java 程序中所指的属性,或者说与所有面向对象的程序设计语言中对象的属性是一个概念,在程序中的具体体现就是类中的变量。在JavaBean 的设计中,按照属性的不同作用又细分为四类:

  •          单值属性
  •          索引属性
  •          关联属性
  •          限制属性

 

一、 单值属性

 

它表示一个伴随有一对get/set 方法的变量。属性名与和该属性相关的get/set 方法名对应。例如:如果有setXgetX 方法,则暗指有一个名为"X" 的属性。如果有一个方法名为isX ,则通常暗指"X" 是一个布尔属性(即X 的值为truefalse )。

 

二、 索引属性

 

表示一个数组值。使用与该属性对应的set/get 方法可取得数组中的成员数据值(需要有一个整数 索引参数 )或者一次设置或取得整个数组的值。 索引属性的设计模式如下:

 

访问整个索引属性 数组的方法

 

public <propertyType>[]get();

public void set<propertyName>([]value);

 

访问整个索引属性 中的单个值的方法

public <propertyType> get(int index);

public void set<propertyName>(int index,int value);

 

三、 关联属性

 

关联属性,也称之为束缚属性(Bound, 它是 指当该种属性的值发生变化时,要通知其它的对象。每次的属性值改变时,这种属性就点火一个PropertyChange 事件。事件中封装了属性名、属性的原值、属性变化后的新值。这种事件是传递到其它的Bean ,至于接收事件的Bean 应做什么动作由其自己定义。

 

 

包含 关联 属性的Bean 必须具有以下的功能:

1 )允许事件监听器注册和注销与其有关的属性修改事件;

2 )当修改一个 关联 属性时,可以在相关的监听器上触发属性修改事件。

java.beans 包中提供有PropertyChangeSupport 类,利用它创建出PropertyChangeSupport 类的对象,从而可以用于管理注册的监听器列表和属性修改事件通知的发送。

 

关联属性Bean的实现:

1、 产生变化的源需要增加 PropertyChangeSupport 的实例,传入 this 作为参数。

2、   在属性变化处进行点火。

3、   增加 addListener(),removeListener() 的方法

 

Listener 类操作的要点:

1、 继承 PropertyChangeListener 接口,实现 void propertyChange(PropertyChangeEvent e) 方法。

2、 创建Bean 实例。因为要监听 source ,所以 source 类的实例必须在 Listener 类中定义。

3、 调用 Bean 实例方法 addPropertyChangeListener(this) ,将 Listener 类加入成为监听者。

 

四、限制属性  

 

限制属性( constrained )是指当这个属性的值要发生变化时,与这个属性已建立了某种连接的其它外部Java 对象可否决该属性值的改变(限制 属性的监听者通过抛出PropertyVetoException 来阻止该属性值的改变);当然Bean 本身也可以否决该Bean 属性值的改变。

 

注意:

限制属性实际上是一种特殊的关联 属性,只是它的值的变化可以被监听者否决掉。

 

一个 限制 属性有两种监听者:属性变化监听者和否决属性改变的监听者。否决属性改变的监听者在自己的对象代码中有相应的控制语句,在监听到有 限制 属性要发生变化时,在控制语句中判断是否应否决这个属性值的改变。

总之,某个 Bean

限制 属性值可否改变取决于其它的Bean 或者是其它外部Java 对象是否允许这种改变。允许与否的条件由其它的BeanJava 对象在自己的类中进行定义。

 

注意:

由于限制属性使用了错误处理,编程的时候要特别注意异常的处理方式。

package bean;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.beans.VetoableChangeSupport;

/*
 * Bean类似观察者模式里的主题角色或者是被观察者角色(Observable)
 */
public class SomeBean {

	protected PropertyChangeSupport propertySupport; //属性改变通知支持
	protected VetoableChangeSupport vetoableChangeSupport; //反对属性改变支持
	private String changableValue;

	public SomeBean() {
		//这里添加支持与像使用observer模式的实现接有口异曲同工之效
		propertySupport = new PropertyChangeSupport(this);//使本对象有属性改变通知监听器的能力
		vetoableChangeSupport = new VetoableChangeSupport(this);//使监听器有反对本对象属性改变的能力
	}

	public void setChangableValue(String newValue) throws PropertyVetoException {

		//如果值发生了修改
		if (!newValue.equals(changableValue)) {
			String oldValue = changableValue;

			//这个一定要在前调用,如果监听器拒绝会抛出异常
			vetoableChangeSupport
					.fireVetoableChange("changableValue", oldValue, newValue);

			//如果未拒绝,则修改Bean属性
			changableValue = newValue;
			//这个在后调用,属性修改后通知监听器
			propertySupport.firePropertyChange("changableValue", oldValue, newValue);
			//如果两个监听器的次序调过来,你想想会有什么问题?你期待的效果没有达到哦~~~~~~~~~~~~~~~
		}
	}

	public void addPropertyChangeListener(PropertyChangeListener listener) {
		propertySupport.addPropertyChangeListener(listener);
	}

	public void removePropertyChangeListener(PropertyChangeListener listener) {
		propertySupport.removePropertyChangeListener(listener);
	}

	public void addVetoableChangeListener(VetoableChangeListener listener) {
		vetoableChangeSupport.addVetoableChangeListener(listener);
	}

	public void removeVetoableChangeListener(VetoableChangeListener listener) {
		vetoableChangeSupport.removeVetoableChangeListener(listener);

	}

	public String getChangableValue() {
		return changableValue;
	}

}
 
package bean;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;

/*
 * 监听器,用来监听Bean属性值的变化与拒绝属性的修改
 * 监听器类似观察者模式观察者角色(Observer)
 */
public class SomeBeanPropertyListener implements PropertyChangeListener,
		VetoableChangeListener {
	public void propertyChange(PropertyChangeEvent evt) {
		//在这里处理监听到的事件
		System.out.println("\"" + evt.getNewValue()
				+ "\" is setted to replace the old value \"" + evt.getOldValue() + "\"");
	}

	public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
		//如果设置的值为某个特殊值(这里为 invalidValue ),拒绝修改
		if (evt.getNewValue().equals("invalidValue")) {
			System.out.println("\"" + evt.getNewValue()
					+ "\" is try to replace the old value \"" + evt.getOldValue() + "\"");
			//抛出异常表示拒绝修改属性
			throw new PropertyVetoException(
					"What you set \"invalidValue\" is a invalid value! operate fail!",
					evt);
		}
	}
}
 
package bean;

import java.beans.PropertyVetoException;
/*
 * 测试类
 */
public class TestBean {
	public static void main(String[] args) {
		SomeBean someBean = new SomeBean();
		//添加观察者监听器
		someBean.addPropertyChangeListener(new SomeBeanPropertyListener());
		someBean.addVetoableChangeListener(new SomeBeanPropertyListener());
		try {
			someBean.setChangableValue("someValue");//设置
			someBean.setChangableValue("anotherValue");//修改
			someBean.setChangableValue("invalidValue");//尝试修改成特殊值
		} catch (PropertyVetoException e) {
			System.err.println(e.getMessage());
		}
	}

}
 

 

 

运行结果:

"someValue" is setted to replace the old value "null"
"anotherValue" is setted to replace the old value "someValue"
"invalidValue" is try to replace the old value "anotherValue"
What you set "invalidValue" is a invalid value! operate fail!

分享到:
评论
2 楼 Roger111 2011-11-11  
谢谢了,写的真好
1 楼 sornor 2011-09-03  
不错哟!谢谢了!

相关推荐

    javafx之属性与绑定

    "javafx之属性与绑定" JavaFX 是一种新的 Java 技术,用于处理动态画面,画面精美令人赞叹。了解 JavaFX 的属性和绑定是非常重要的。 JavaFX 的属性是基于 JavaBean 的模式,但做了扩展和改进。JavaFX 的属性经常...

    基于javabean的物流信息

    每个界面组件(如文本框、下拉菜单)都可以绑定到相应的JavaBean属性,实现数据的双向绑定。 7. **事件处理**:JavaBean支持事件驱动编程,当用户在界面上触发某个操作(如点击按钮),相关的JavaBean可以通过监听...

    jsp+javabean分页显示

    - **JSP页面**: 负责展示分页界面,使用EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)来绑定PageBean的属性并处理用户交互。 **5. 实现步骤** 1. 用户请求指定页码。 2. JSP页面通过...

    Javabean与DTO的区别.docx

    POJO,Plain Old Java Object,是一种简单的Java类,没有特定的框架或概念限制,它只是包含一些属性和对应的getter、setter方法。POJO的概念出现是为了区别于EJB(Enterprise JavaBeans)等复杂的企业级组件。虽然...

    POJO javaBean EJB JNDI 理解及区别

    在使用Hibernate框架时,POJO经常被用来映射数据库表,使得对象属性与表字段一一对应。 #### JavaBean JavaBean是一种遵循特定编码规范的POJO,用于组件化和模块化Java应用程序。JavaBean必须是具体的、公共的类,...

    第14章 JavaBeans组件模型.ppt

    4. 限制属性:有特定限制条件的属性,可能同时是绑定属性。 14.5 API支持 JavaBeans API提供了一系列的类和接口,如Introspector、PropertyDescriptor、EventSetDescriptor等,用于创建、操作和理解JavaBean的属性...

    JAVA项目源代码的笔记

    在这个例子中,`&lt;bean:define&gt;`定义了一个名为`myName`的变量,该变量与名为`user`的JavaBean对象的`userName`属性关联,并将其作用域限制为请求范围。这意味着`myName`变量只在当前HTTP请求内有效。然后,`...

    青鸟s2-jsp课件

    属性分为简单、索引、绑定和限制属性。 - **方法**:访问方法(Accessor)如getXxx()和setXxx(),以及操作方法(Mutator)用于操作属性。 - **事件**:通过事件监听器,JavaBean可以触发或响应特定事件。 ### 3. ...

    个人简历管理系统

    JSP中的EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)可以简化页面与后台数据的绑定和处理,提高开发效率。 3. JavaBean:JavaBean是符合特定规范的Java类,通常用于封装业务逻辑或...

    jsp开发的信息管理系统

    4. **EL(Expression Language)**:EL用于在JSP页面中简洁地访问JavaBean的属性。例如,`${teacher.name}`可以获取名为`teacher`的JavaBean的`name`属性。EL表达式可以插入到HTML标签的属性中,或者在脚本元素内...

    java BeanUtils

    这个方法是BeanUtils库的核心功能之一,它允许我们轻松地将一个JavaBean对象的属性值复制到另一个JavaBean对象中。只需要两个对象的属性名相同,无需关心它们的实例是否相同。这对于数据绑定和对象复制非常有用。 ...

    struts2面试题1.pdf

    Struts2 面试题精要 Struts1 和 Struts2 是两个不同的 Web 应用程序框架,它们之间存在着许多区别。...在 Struts2 中,也可以使用标准 JSP 机制,但是也支持一个更强大和灵活的表达式语言来绑定值到页面中。

    JEE2实现文件上传

    在上面的示例代码中,我们使用了 UpBean 这个 JavaBean 来处理文件上传。UpBean 中的 doUpload 方法将 HttpServletRequest 对象的表单原始数据写入到 test.txt 文件中。 在 Struts 2 框架中,我们可以使用 Commons ...

    spring技术

    在处理用户输入时,Spring MVC支持数据绑定,能够自动将表单数据绑定到对应的JavaBean属性上。然而,对于特殊的数据类型,如日期,Spring MVC可能无法自动处理非标准格式的日期字符串。在这种情况下,我们需要自定义...

    Structs1.x与Structs2.0的区别

    Structs1.x与Structs2.0的区别 本文对Structs1.x和Structs2.0进行了详细的对比,从Action类、线程模式、Servlet依赖、可测试性、捕获输入、表达式语言、绑定值到页面和类型转换等方面进行了分析,帮助读者了解两者...

    j2ee笔记

    - `jsp:useBean`:实例化或查找JavaBean并将其绑定到页面作用域。 - `jsp:setProperty`:设置JavaBean的属性值。 - `jsp:getProperty`:获取JavaBean的属性值。 - `jsp:param`:向请求参数中添加值。 - `jsp:...

    《Web应用开发》练习题

    - `&lt;%@page%&gt;`指令用于设置JSP页面的全局属性,它可以多次出现在同一个JSP页面中,但每个属性只能出现一次。 - `&lt;%@page%&gt;`指令可以放在JSP文件的任何位置,不过为了增强代码的可读性,通常建议将其放置在文件的...

    交友系统实现

    EL是一种轻量级的脚本语言,它简化了JSP中的数据绑定,使得开发者能够更方便地访问和显示JavaBean中的属性。例如,我们可以用${user.name}来获取并显示用户的名字。 在交友系统中,用户可能需要查看其他用户的详细...

Global site tag (gtag.js) - Google Analytics