`
yiminghe
  • 浏览: 1465388 次
  • 性别: 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

 

 

 

 

 

分享到:
评论

相关推荐

    xml与javabean的相互转换

    这篇博客将深入探讨XML与JavaBean之间的相互转换方法。 首先,理解XML的基本结构和语法规则至关重要。XML文档由元素(Element)、属性(Attribute)、文本内容(Text Content)等组成,每个元素都由开始标签和结束...

    一个关于递归读取xml 并返回到javaBean的小例子

    对于JavaBean,我们需要预先定义一个类,该类的字段与XML元素相对应,且设置方法用于接收解析出的数据。 例如,假设我们有一个XML文件,内容如下: ```xml <name>John Doe <age>30 <name>Jane Doe ...

    jsp5课件

    6. **JavaBean的生命周期**:理解JavaBean的创建、初始化、使用和销毁的过程,以及如何通过`<jsp:attribute>`和`<jsp:setProperty>`控制这些过程。 7. **实例化和管理JavaBean**:何时在JSP页面中实例化JavaBean,...

    jsp登陆,分页技术讲解,实例源码

    如果匹配,设置会话属性(session attribute)表示用户已登录;否则,返回错误信息。 4. **错误处理和重定向** 登录失败时,可以通过`<jsp:forward>`标签将用户重定向回登录页面,并显示错误消息。登录成功后,...

    castor入门说明

    1. **配置映射**:通过 `<classname>` 标签和 `auto-complete` 属性来配置 XML 与 JavaBean 的映射关系。 2. **属性映射**:使用 `<bind-xml>` 标签指定 XML 属性与 JavaBean 属性之间的对应关系。 3. **属性...

    jsp程序设计-复习重点.doc

    - `<%@ page attribute1="value1" attribute2="value2" ...>`:设置页面属性,如`language`(默认Java)、`import`(导入包)、`session`(控制session支持)和`errorPage`(指定错误处理页面)。 在实际应用中,...

    DOM4J创建XML是一个实例

    以下是关于DOM4J创建XML以及与JSP、JavaBean结合使用的详细知识点: 1. DOM4J简介:DOM4J是一个开源的Java库,基于DOM、SAX和JDOM设计,它提供了一种灵活且高效的API来处理XML文档。DOM4J支持XPath和XSLT,可以方便...

    JBOSS端口配置

    - **说明**:EJB服务端口用于支持企业级JavaBean的部署与运行,具体配置细节需参照JBoss文档或具体应用场景。 #### 四、总结 通过上述内容,我们了解了JBoss端口配置的主要方面及其具体配置方法。正确配置这些...

    精通Struts书中讲解beantaglibs的例子

    - `<jsp:attribute>`:在自定义标签中用于设置属性值。 - `<jsp:include>`:包含另一个资源,如JSP页面或静态HTML文件,可以传递参数。 3. **`<jsp:useBean>`的使用** `<jsp:useBean>`标签通常用于初始化...

    JSP期末考试试卷(A卷).doc

    6. 关于 JavaBean 的描述中正确的是,JavaBean 本质上就是一个 Java 类。 这道题考察了 JavaBean 的基础知识,JavaBean 本质上就是一个 Java 类。 7. Java Web 应用程序的配置文件 web.xml 存放在哪个位置?答曰:...

    jsp计算三角形的面积

    <%@ attribute name="height" required="true" type="java.lang.Double" %> ! public double calculateArea(double base, double height) { return base * height / 2; } %> (base, height) %> ``` 这里,我们...

    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标准动作文档 java

    - `<jsp:attribute>`、`<jsp:body>`、`<jsp:invoke>`等,主要用于标记文件内部。 #### 四、具体动作详解 1. **** - **定义**:使用此标签可以在JSP页面中定义一个JavaBean实例。 - **使用格式**: ```jsp |...

    项目课程复习题.doc

    【项目课程复习题.doc】文档涉及了多个Java Web开发中的关键知识点,主要涵盖Servlet、JSP、Web层技术、HTML标签、JSP动作指令、请求与会话对象、PageContext以及JavaBean等方面。以下是这些知识点的详细解释: 1. ...

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

    - `id` 属性定义了JavaBean在JSP页面中的引用名称,`class` 指定Bean的完整类名,而`scope` 则定义了Bean的作用范围。 3. **jsp:setProperty** 和 **jsp:getProperty**: - `jsp:setProperty` 用于设置JavaBean的...

    JSP/Servlet

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

    JSP程序设计精彩实例

    - **page指令**(<%@ page attribute="value" %>):配置JSP页面属性,如导入类、设置字符编码等。 - **include指令**():静态地合并一个文件到JSP页面。 - **taglib指令**():引入自定义标签库。 4. **JSP...

    JavaWeb_标签大全

    - `<tiles:insertAttribute>`:插入组件到定义的布局中。 这些标签在实际开发中起到简化代码、提高可维护性和复用性的作用。例如,`<jsp:include>`和`<jsp:forward>`可以实现页面间的跳转和资源的重用;JSTL标签则...

    blogjsp经典代码

    这些代码可能涉及到页面的渲染、数据的处理、用户交互以及与后端Servlet的通信等方面。下面我们将详细探讨一些JSP中的经典代码和它们的应用场景。 1. **JSP表达式(Expression Language, EL)** EL是JSP 2.0引入...

Global site tag (gtag.js) - Google Analytics