Tapestry学习笔记(4)
2007-05-31 15:46
在Tapestry框架运行时,通过反射机制生成一个继承于我们页面类的子类,根据页面规范或组件规范中声明的属性,向这个反射生成的子类中添加标准的JavaBean属性,这就是属性指定的运作过程。在页面规范中声明的数据称为页面属性;在组件规范中声明的属性成为组件属性。其实,不论页面属性还是组件属性,他们都以完全一样的方式进行声明和使用。将Tapestry属性分为页面属性和组件属性,只不过为了方便称呼。
代码
为了在页面类Home.java中能够获取到这两个页面属性,我们需要定义两个对应于页面属性的JavaBean抽象getter方法。
代码
在页面规范或组件规范中声明属性的时候,我们并不需要声明其类型。Tapestry框架根据我们在页面类或组件类中声明的JavaBean抽象的getter/setter方法类型来决定属性的类型。 从反射机制的角度,由于Tapestry框架运行时会生成一个集成于页面类的子类,根据Java的多态性,我们很容易理解,既然子类生成的是标准JavaBean属性,那么当我们在父类(页面类或组件类)中调用JavaBean属性的抽象getter方法,即可以获得子类JavaBean中装载的值。 同样,如果我们需要在页面类中设置属性值,那么可以在页面类中添加对应的JavaBean属性抽象的setter方法。如:
代码
现在我们已经理解了页面属性(或组件属性)的概念,因此我们可以通过在页面类中添加JavaBean属性的方式来达到页面属性相同的效果。在Home.java中:
代码
实际上,页面属性在运作的时候,Tapestry框架不光为其添加标准的JavaBean属性还在页面表现之前和表现之后,两次对页面属性进行初始化。而protected void initialized() 方法具有同样的初始化作用,在页面表现之前和表现之后,两次对页面类中的成员变量进行初始化。 需要注意的是,org.apache.tapestry.AbstractComponent 类中并没有protected void initialize() 方法,而所有的组件类都继承于AbstractComponent类。因此我们不能用这样方式对组件类中的成员变量进行初始化。 Tapestry框架对页面属性或组件属性的默认初始化值是Java各种类型对象的默认值,如int型为0,String型为NULL等。我们需要对页面属性(或组件属性)进行自定义的初始化事例如下:
代码
如这里对页面属性username的声明所示,我们为该页面属性提供一个初始化值:字符串“我爱Tapestry”。它的作用等同于在页面类中对成员变量username进行以下声明。
代码
|