注释提供了关于一个组件的数据,这些数据并不属于组件本身。它们在所注释组件的操作上并没有直接的影响。而是,它们在运行时被检测(examine),主要由工具或管理者(a tool or a manager)使用。注释的内容和意义完全取决于开发人员使用的工具或管理者。例如,一个数据绑定(data-binding)管理者可以检测注释,以知道组件值要被存储的数据源。
注释可被用于ZUML页面中组件和属性的声明。有两种注释方式:标准的方式和简单的方式(the classic way and the simple way)。选择娜种看你的喜好。若喜欢的话可以在同一页面内混合使用它们。
注释要放在你想注释的元素声明之前:
<window xmlns:a="http://www.zkoss.org/2005/zk/annotation"> <vbox> <a:author name="John Magic" date="3/17/2006"/> <listbox> </listbox> ...
annotation为http://www.zkoss.org/2005/zk/annotation空间内的一个元素。元素的名字和属性可以是依赖于你所使用工具的一切。你可以使用几个注释为相同的组件声明注释:
<a:author name="John Magic"/> <a:editor name="Mary White" date="4/11/2006"/> <listbox/>
author和editor为注释的名称,而name和date为属性名称。换言之,注释由名称和属性映射组成。
若两个注释有相同的名称,则它们会被合并为一个注释。例如,
<a:define var1="auto"/> <a:define var2="123"/> <listbox/>
等价于
<a:define var1="auto" var2="123"/> <listbox/>
[注]: 注释不支持EL表达式。
为注释一个属性声明,你可以将注释放置于属性声明之前,如下所示。
<listitem a:bind="datasource='author',name='name'" value="${author.name}"/>
或者,你可以使用attribute
元素,然后简单的注释属性声明,类似于为组件声明注释。换言之,上面的注释等价于下面的注释:
<listitem> <a:bind datasource="author" name="name"/> <attribute name="value">${author.name}</attribute> </listitem>
注:若忽略了属性名称,则名称为value
。例如,
<listitem a:bind="value='selected'" value=""/>
等价于
<listitem a:bind="selected" value=""/>
除了如上描述的使用特定XMl命名空间进行注释,有一种简单的注释属性的方法:为要注释的属性使用注释表达式指定一个值,如下所示。
<listitem label="@{bind(datasource='author',selected)}"/>
注释表达式的格式为@{
annot-name
(
attr-name1
=
attr-value1,attr-name2=attr-value2
)}
。换言之,若属性值为一个注释表达式,则会被认为是为相应属性的注释,而不是其值。在上面的例子中,名为bind
的注释为label
属性注释。因此,其等价于
<listitem a:bind=" datasource='author',selected" label=""/>
若没有指定注释名称,则假定名称为default
。例如,下面的代码片断使用了default
作为注释名称为label
属性注释,且注释有一个属性,名称和值分别为value
和selected.name
。
<listitem label="@{selected.name}"/>
换言之,等价于下面的代码片断:
<listitem label="@{default(value='selected.name')}"/>
注:你可以使用多个注释为相同的属性注释,如下所示。
<listitem label="@{ann1(selected.name) ann2(attr2a='attr2a',attr2b)}"/>
通过使用org.zkoss.zk.ui.sys.ComponentCtrl
接口的addAnnotation
方法,你可以在运行时注释一个组件。
Listbox listbox = new Listbox(); listbox.addAnnotation("some", null);
可以在运行时取回(retrieved back)注释。通常由工具获取,例如数据绑定管理者,而不是应用程序。换言之,为某一特定目的,应用程序注释ZUML页面以告诉工具如何处理组件。
下面为转储(dump)一个组件所有注释的例子:
void dump(StringBuffer sb, Component comp) { ComponentCtrl compCtrl = (ComponentCtrl)comp; sb.append(comp.getId()).append(": ") .append(compCtrl .getAnnotations()).append('\n'); for (Iterator it = compCtrl.getAnnotatedProperties().iterator(); it.hasNext();) { String prop = it.next(); sb.append(" with ").append(prop).append(": ") .append(compCtrl .getAnnotations(prop)).append('\n'); } }