Tapestry学习笔记(4)

阅读更多
在Tapestry框架运行时,通过反射机制生成一个继承于我们页面类的子类,根据页面规范或组件规范中声明的属性,向这个反射生成的子类中添加标准的JavaBean属性,这就是属性指定的运作过程。在页面规范中声明的数据称为页面属性;在组件规范中声明的属性成为组件属性。其实,不论页面属性还是组件属性,他们都以完全一样的方式进行声明和使用。将Tapestry属性分为页面属性和组件属性,只不过为了方便称呼。
例如,在登录页面Home,为了拥有一个用户名和密码的输入值载体,我们在页面规范Home.page中声明两个页面属性。

 

为了在页面类Home.java中能够获取到这两个页面属性,我们需要定义两个对应于页面属性的JavaBean抽象getter方法。
Public abstract string getUsername();//用户名
Public abstract string getPassword();//密码 

在页面规范或组件规范中声明属性的时候,我们并不需要声明其类型。Tapestry框架根据我们在页面类或组件类中声明的JavaBean抽象的getter/setter方法类型来决定属性的类型。
从反射机制的角度,由于Tapestry框架运行时会生成一个集成于页面类的子类,根据Java的多态性,我们很容易理解,既然子类生成的是标准JavaBean属性,那么当我们在父类(页面类或组件类)中调用JavaBean属性的抽象getter方法,即可以获得子类JavaBean中装载的值。
同样,如果我们需要在页面类中设置属性值,那么可以在页面类中添加对应的JavaBean属性抽象的setter方法。如:
Public abstract void setUsername(String username);//设置用户名
Public abstract voif setPassword(String password);//设置密码
 

现在我们已经理解了页面属性(或组件属性)的概念,因此我们可以通过在页面类中添加JavaBean属性的方式来达到页面属性相同的效果。在Home.java中:
Private string password;
Protected void initialize(){
	This.password = null;
}
Public String getPassword(){
	Return password;
}
Public void setPassword(String password){
	This.password = password;
}
除了标准的JavaBean属性,我们需要注意的是protected void initialize()方法。所有的页面类都继承于org.apache.tapestry.html.BasePage类,而BasePage类继承于AbstractPage类,protected void initialize() 方法是org.apache.tapestry.AbstractPage类中的方法。
实际上,页面属性在运作的时候,Tapestry框架不光为其添加标准的JavaBean属性还在页面表现之前和表现之后,两次对页面属性进行初始化。而protected void initialized() 方法具有同样的初始化作用,在页面表现之前和表现之后,两次对页面类中的成员变量进行初始化。
需要注意的是,org.apache.tapestry.AbstractComponent 类中并没有protected void initialize() 方法,而所有的组件类都继承于AbstractComponent类。因此我们不能用这样方式对组件类中的成员变量进行初始化。
Tapestry框架对页面属性或组件属性的默认初始化值是Java各种类型对象的默认值,如int型为0,String型为NULL等。我们需要对页面属性(或组件属性)进行自定义的初始化事例如下:

如这里对页面属性username的声明所示,我们为该页面属性提供一个初始化值:字符串“我爱Tapestry”。它的作用等同于在页面类中对成员变量username进行以下声明。
Private String username;
Protected void initialize(){
	This.username=” 我爱Tapestry”;
} 
Public String getUsername(){
	Return username;
}
Public void setUsername(String username){
	This.username=username;
}

你可能感兴趣的:(Tapestry,框架,Apache)