注释

注释提供了关于一个组件的数据,这些数据并不属于组件本身。它们在所注释组件的操作上并没有直接的影响。而是,它们在运行时被检测(examine),主要由工具或管理者(a tool or a manager)使用。注释的内容和意义完全取决于开发人员使用的工具或管理者。例如,一个数据绑定(data-binding)管理者可以检测注释,以知道组件值要被存储的数据源。

注释ZUML页面

注释可被用于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表达式。

注释属性(Property)声明的标准方式

为注释一个属性声明,你可以将注释放置于属性声明之前,如下所示。

<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属性注释,且注释有一个属性,名称和值分别为valueselected.name

<listitem label="@{selected.name}"/>

换言之,等价于下面的代码片断:

<listitem label="@{default(value='selected.name')}"/>

注:你可以使用多个注释为相同的属性注释,如下所示。

<listitem label="@{ann1(selected.name) ann2(attr2a='attr2a',attr2b)}"/>

注释组件声明的简单方式

类似的,你可以通过为一个名为self的特定属性指定注释表达来注释一个组件。

<listitem self="@{bind(each=person)}"/>

self为一个关键字,表示注释被用于注释组件声明,而不是任何属性。换言之,等价于

<a:bind each="person"/>
<listitem/>

手动注释组件

通过使用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');
   }
}