一、标识符
每个组件都有一个标识符(getId()方法可获得),当组件被创建时标识符被自动创建,开发人员可以在任何时候改变它,对于标识符的命名规则也没有限制。但如果有序的标识符被标识后,Java开发人员就可以在嵌套在ZUML页面的Java代码或者EL表达式中直接访问它。
二、ID空间
一个ID空间是一个桌面的组件的子集,唯一性只在ID空间只能得到保障。如果X、Y都是ID空间,且X是Y的后代,那么X的空间所有者是Y的一部分,但是X的后代并不是Y的一部分。
例如:
在上图中定义了三个空间:P、A、C,其中P空间包括P、A、F、和G;A空间包括A、B、C和D;C空间包括C和E。
属于同一个ID空间的组件被成为伙伴:如A、B、C和D。
需要注意的是,尽管P、A、F和G同属于空间P,但是它们的空间所有者是不一样的,P、F、G的空间所有者是P,而A的空间所有者是它自己本身,原因在于A本身也是一个ID空间。
下面是ZK官方文档中的一段描述(也就是IdSpace的Javadoc):
在同一个ID空间中,每个组件的ID(Component.getId())都必须是唯一的,并且通过调用对实现了IdSapce的组件调用getFellow(java.lang.String)方法,我们可以找回在同一个ID空间里的任意一个组件。
为了便于描述,在同一个ID空间里的组件互相被成为伙伴,如果组件有一个实现了IdSpace的祖先,我们就说这个组件属于它的这个祖先所拥有的ID空间。如果没有这样的祖先存在,那么这个组件就属于它所在的页面所拥有的ID空间,因为页面本身就实现了IdSpace,并且如前所述的祖先和页面被称作空间所有者(Component.getSpaceOwner())。
为了便于描述,如果组件X或者页面X是空间所有者,我们就把它们标识的空间称作X空间。在这种情况下,如果组件Y是X的孩子并且组件Y也实现了IdSpace(另一个空间所有者),那么空间X包含组件Y但是不包含Y的后代。换句话说,Y属于空间X和空间Y,因而为了得到Y空间的孩子Z,我们应该这样:X.getFellow('Y').getFellow('Z')。
三、在zscript中定义变量和函数
在zscript中定义的变量和函数被存储在相应脚本语言的解释器中。
关于解释器:解释器分为单域解释器和多域解释器,Java解释器(BeanShell)是一个典型的多范围解释器,它为每个ID空间创建一个独立的解释范围。故而在下面的例子中var2只对B窗口可见,var1对A、B窗口均可见。
<window id="A"> <zscript>var1="abc";</zscript> <window id="B"> <zscript>var2="efg";</zscript> </window> </window>
单域解释器,Ruby、Groovy、Javascript解释器目前不支持多域,下一个版本将支持。这就意味着在这种类型的解释器中,在一个窗口中定义的变量会覆盖在同一个页面中另一个窗口中定义的同名变量,当然我们应该避免出现这种情况。
四、zk中的事件
为了响应事件,应用程序必须注册一个或者多个事件监听器,这有两种方式:其一是通过在标记语言中通过onXxx属性指定;其二是调用要监听组件或者页面的addEcentListener方法。另外,除了在浏览器端由客户活动触发的事件,应用程序也可以通过org.zkoss.zk.ui.event.Events类中的sendEvent或者postEvent方法来触发事件。这两种方法的区别在这里暂不讨论。
由于桌面是服务于同一URL请求的页面的集合,所以桌面也是事件监听器可以访问的范围。正是由于事件是与桌面绑定在一起的,所以同一桌面产生的事件会被按顺序处理,而不同桌面产生的事件会被并行处理,这样便在并发与复杂度之间得到了很好的权衡。
当一个组件被一个线程而不是任何的事件监听器创建时,它不属于任何桌面。在这种情况下,我们可以把它放在任何一个桌面上,只要把它与适当的事件监听器关联即可。当然一旦组件属于某个桌面,它就永远属于这个桌面了。不过对大多数应用程序来说很少遇到需要使用线程而不是事件监听器来创建组件的情况。
五、ZUML和XML命名空间
在ZUML中用XML命名空间是可选的,仅当需要在同一页面中使用两种或者以上组件时才有必要这样做(例如混合使用XUL和XHTML组件)。例如:
<html xmlns:="http://www.w3.org/1999/xhtml" xmlns:x="http://www.zkoss.org/2005/zul" xmlns:zk="http://www.zkoss.org/2005/zk"> <head> <title>ZHTMLDemo</title> </head> <body> <h1>ZHTML Demo</h1> <table> <tr> <td><x:textbox/></td> <td><x:button label="Now" zk:onClick="addItem()"/></td> </tr> </table> <zk:zscript> void addItem() {} </zk:zscript> </body> </html>
1. xmlns:x=" http://www.zkoss.org/2005/zul " 指定一个称为ttp://www.zkoss.org/2005/zul的命名空间,并且使用x来呈现这个命名空间。2. xmlns:="http://www.w3.org/1999/xhtml" 指定一个称为http://www.w3.org/1999/xhtml 的命名空间,且使用它作为默认的命名空间。3. <html> 从默认的命名空间中指定一个称为 html 的元素,在这个例子中也就是http://www.w3.org/1999/xhtml 。4. < x:textbox/> 从 http://www.zkoss.org/2005/zul命名空间中指定一个称为textbox 的元素。
The End