Tapestry开发者指南(5)

来源:百度文库 编辑:神马文学网 时间:2024/06/03 13:31:57
第二章 JavaBeans 和属性
Tapestry框架基于JavaBeans 和JavaBeans 属性的使用。这个章节将对这些概念作简短的回顾。更加深入的讨论是可参阅Java Tutorial。
2.1 JavaBeans
当Java对象确切的类型是未知的时候,JavaBeans 框架是操纵Java对象的一个方式。这种当Java对象确切的类型未知时,却能使他们一起工作的能力, 是非常强有力的。这体现了Java作为一种高度动态语言的灵活性,这样的例子在底层语言, 譬如C++ 中是不可能的。
许多基于组件的框架是以JavaBeans 框架为基础,包括Java 的AWT 和Swing 的GUI库, 还有Tapestry。 想法是这样的, 遵照几种命名规则和编码习惯, 将新类"插入"一个框架中是可能的, 当框架被创建时, 这些类甚至还没写。按Tapestry术语的说法, 这被用来允许创建新的Tapestry组件。
任一个Java 对象可以作为JavaBean运作; 它只是必须遵循某些命名惯例(在下个部分讨论)。对于框架需要在何处创建一个类的新实例的情况,譬如,当Tapestry创建组件的一个新实例时, Java 类必须实现一个公共的, 无参量的构造器(它也可以实现另外的构造器)。JavaReflection API 允许Tapestry访问一个类的方法、属性和构造器。
2.2 JavaBeans 属性
对于Tapestry, JavaBeans的中心概念为属性。JavaBeans框架允许Tapestry把任一个对象作为若干已命名属性的一个集合来对待。Tapestry频繁地从这些已命名属性中读取值,并且偶尔地值将写入这些已命名属性中。这里指的属性(property)不同于性质(attribute)... 虽然, 经常,每个属性(property)是由一个性质(attribute)支持。对于Tapestry, 和Reflection API,属性是对象中一套公共的方法。访问属性涉及调用这些方法当中的一个。
例子2.1 JavaBeans getter方法
public type getName()
{
...
}
例子2.2 JavaBeans setter方法
public void setName(type value)
{
...
}
属性可以是只读或只写的 (也就是说,它也许实现二个方法当中的一个)。类型可以是标量型(布尔, 整型, 等) 或任何Java 类。
注意命名; 属性名称的第一字母在get或set后面是大写的。JavaBeans属性对于方法名称和属性名称是大小写敏感的。当名称是只取首字母的缩写词时,一种特殊情况存在;这是通过二个或更多的大写字母(以后得到或设置)来标识; 在这种情况下, 属性名称没有第一字母来转换成小写。
作为一种特殊情况, 一个布尔属性可以为getter方法使用一个别名:
例子2.3。JavaBeans getter方法(布尔)
public boolean isName()
{
...
}
虽然正常实现是得到或设置实例变量, 但是更加复杂的选择是可能的。一个方式是延迟求值, 即, 昂贵的演算被推迟直到实际值是需要的时候,
例如: 例子2.4。JavaBeans 属性的延迟求值
public List userNames = null;
/**
* Returns a List of user names obtained from the database.
*
**/
public List getUserNames()
{
if (userNames == null)
userNames = fetchUserNamesFromDatabase();
return userNames;
}
这里,方法第一次被调用时, 昂贵的数据库“取”指令发生。值从数据库返回,然后被存于缓存中以备最新调用。另一种普遍的样式是综合的属性。这里, 根本没有真正的性质(attribute), 值总在进行中计算。其一个频繁用途是避免在遭遇空指针时出错。
例子2.5。综合的JavaBeans 属性
/**
* Returns the name of the company‘s account representative, if
* if the company has one, or null otherwise.
*
**/
public String getAccountRepName()
{
AccountRep rep = company.getAccountRep();
if (rep == null)
return null;
return rep.getName();
}
这个例子创建一个综合属性, accountRepName 。