`
yiminghe
  • 浏览: 1435033 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

javabean与attribute

    博客分类:
  • java
阅读更多

以前很忽视 javabean ,除了写写简单的 get,set 很少用到其他,近来探索 attribute 中,回头再看 javabean 突然觉得很相似,或许 yui3 attribute正是受到了 javabean component model 的影响而产生?


PS : 这里说的不是 EJB ,from core java 2:


We'd like to address a common confusion before going any further: The JavaBeans that we discuss in this chapter have little in common with "Enterprise JavaBeans " or EJB. Enterprise JavaBeans are server-side components with support for transactions, persistence, replication, and security. At a very basic level, they too are components that can be manipulated in builder tools. However, the Enterprise JavaBeans technology is quite a bit more complex than the "Standard Edition" JavaBeans technology.

That does not mean that standard JavaBeans components are limited to client-side programming. Web technologies such as JavaServer Faces (JSF) and JavaServer Pages (JSP) rely heavily on the JavaBeans component model.



1.getter ? setter?


不像 C# 可以对属性定义 getter,setter 后以后就可以直接对属性访问进行控制,java 中还是传统的使用属性访问方法,没有提供直接访问属性控制的机制,同目前广泛实现的 ecmascript3 类似,所以 yui3 attribute 也等于是模拟了 java ,提供了 getter ,setter 用方法来控制属性访问,并类似java,c#将属性元定义定义在了 javascript 类(构造器)中,javabean getter,setter则是语言级别提供了:

 

public class TestAttr extends Attribute {
	private String test = "5";

	public String getTest() {
		System.out.println("i am reading ...");
		return test;
	}

	public void setTest(String test) {
		System.out.println("i am writing");
		this.test = test;
	}
}

 

另一方面当使用继承时,java 语言层次保证了继承链上的属性初始化,而 yui3 attribute 则通过 Base 模拟了该初始化。


2. 属性变化事件的触发


yui3 attribute 通过set 封装,在设置内部属性值前后,要触发before以及after事件,并且可以通过before事件来阻止属性的真正有效写入,而javabean component model 则直接提供了 PropertyChangeSupport (用于写后通知) 与 VetoableChangeSupport (用于阻止),只不过需要在setter中手动调用,其实由于java存在反射机制,我们也可以很容易的模拟 yui3 attribute 的 set 封装:(用 beanutils 更方便)

 

public class Attribute {
        private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
	private VetoableChangeSupport vetoSupport = new VetoableChangeSupport(this);

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

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


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

	public void removeVetoableChangeListener(VetoableChangeListener listener) {
		vetoSupport.removeVetoableChangeListener(listener);
	}

	public void set(String name, Object newValue) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, PropertyVetoException {
		Object oldValue = BeanUtils.getProperty(this, name);
		vetoSupport.fireVetoableChange(name, oldValue, newValue);
		BeanUtils.setProperty(this, name, newValue);
		changeSupport.firePropertyChange(name, oldValue, newValue);
	}
}
 

3.测试

 

一个很简单的例子即可验证该模式同 yui3 attribute 的相似性:

 

	public static void main(String[] args) throws InvocationTargetException,
			PropertyVetoException, NoSuchMethodException, IllegalAccessException {
		TestAttr t = new TestAttr();

		t.addVetoableChangeListener(new VetoableChangeListener() {
			//属性真正设置前调用
			public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
				System.out.println(evt.getNewValue());
				System.out.println(evt.getOldValue());
				//如果验证失败,就throw
				//throw new PropertyVetoException("",null);
			}
		});

		t.addPropertyChangeListener(new PropertyChangeListener() {
			//属性设置后通知
			public void propertyChange(PropertyChangeEvent evt) {
				System.out.println(evt.getNewValue());
				System.out.println(evt.getOldValue());
			}
		});
		//System.out.println(t.getTest());
		t.set("test", 2);
		//System.out.println(t.getTest());
	}

 

 

PS:


IE9 不再支持 __defineGetter__,转而支持 ES5 API , Link   MSDN

 

 

 

 

 

分享到:
评论

相关推荐

    xmlbean&xmlstream

    用xmlbean和xmlstream进行xml和javabean的转换案例

    JavaWeb开发技术-JSP动作元素.pptx

    jsp:attribute 设置动态定义的XML元素属性 jsp:body 设置动态定义的XML元素内容 jsp:text 在JSP页面和文档中使用写入文本的模板 在JSP页面中,为了把其他资源的输出内容插入到当前JSP页面的输出内容中,JSP技术提供...

    JSP2.0技术手册pdf(带示例源码).zip

    5-1 属性( Attribute ) 与范围( Scope ) 5-2 与 Servlet 有关的隐含对象 5-3 与 Input / Output 有关的隐含对象 5-4 与 Context 有关的隐含对象 5-5 与 Error 有关的隐含对象 第六章 Expression Language 6-1 EL ...

    JSP/Servlet

    JavaBean是一個純綷的Java類別,它遵守一些規則與命名方式,它是一個公開(public)的類別,具有公開的setter與getter方法,在JSP中可以使用它將程式的邏輯處理與呈現部份分離。 簡介 JavaBean 深入 JavaBean ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    第13章 jsp与javabean 409 13.1 javabean简介 409 13.1.1 属性的命名 409 13.1.2 属性的类型 411 13.2 在jsp中使用javabean 412 13.2.1 [jsp:usebean] 412 13.2.2 [jsp:setproperty] 413 13.2.3 [jsp:...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    第13章 jsp与javabean 409 13.1 javabean简介 409 13.1.1 属性的命名 409 13.1.2 属性的类型 411 13.2 在jsp中使用javabean 412 13.2.1 [jsp:usebean] 412 13.2.2 [jsp:setproperty] 413 13.2.3 [jsp:...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    第13章 jsp与javabean 409 13.1 javabean简介 409 13.1.1 属性的命名 409 13.1.2 属性的类型 411 13.2 在jsp中使用javabean 412 13.2.1 [jsp:usebean] 412 13.2.2 [jsp:setproperty] 413 13.2.3 [jsp:...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    第13章 jsp与javabean 409 13.1 javabean简介 409 13.1.1 属性的命名 409 13.1.2 属性的类型 411 13.2 在jsp中使用javabean 412 13.2.1 [jsp:usebean] 412 13.2.2 [jsp:setproperty] 413 13.2.3 [jsp:...

    java 面试题 总结

    抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。...

    超级有影响力霸气的Java面试题大全文档

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...

    Struts原理、开发及项目实施

    RegUserForm "/> </form-beans> <br/><action-mappings><br/><action path="/regUserAction"<br/> type=" org.cjea.Struts.example.RegUserAction " attribute=" regUserForm " scope="request...

    Struts in Action中文版

    1. 介绍.........................................................................................................18 1.1. 关于本书..........................................................................

    struts in Action

    1. 介绍.........................................................................................................18 1.1. 关于本书...........................................................................

Global site tag (gtag.js) - Google Analytics