第 6 章 ZK用户界面标记语言

目录

XML
元素必须格式良好
特殊字符必须被替换
属性值必须被指定且用引号包围
注释
字符编码
命名空间
条件式流程
If 和Unless
Switch和Case
Choose 和 When
反复式流程
each变量
forEachStatus变量
如何在事件监听器中使用 eachforEachStatus 变量
随机存取(Load on Demand)
使用fulfill属性的随机存取
使用事件监听器的随机存取
隐含对象
隐含对像列表
关于Request和Execution的信息
进程指令
page指令
component指令
init指令
variable-resolver指令
import指令
linkmeta指令
ZK属性
apply属性
use属性
if属性
unless属性
forEach属性
forEachBegin属性
forEachEnd属性
fulfill属性
forward 属性
ZK元素
zk 元素
zscript元素
attribute元素
variables元素
custom-attributes元素
组件集及XML命名空间
标准的命名空间
ZK用户界面标记语言

ZK 用户界面标记语言(ZUML)是基于XML的。每一个XML元素描述了要创建的组件。一个XML属性描述了被创建组件的初始值。一个XML处理指令(processing instruction)如何处理整个页面,如页面的标题。

不同的组件集通过XML命名空间来区分。例如,XUL的命名空间为 http://www.zkoss.org/2005/zul [34],而XHTML的命名空间为 http://www.w3.org/1999/xhtml

XML

这一章节提供了和ZK一起工作的XML的最基本概念,如果内很熟悉XML,可以跳过这一章节。如果你想学习更多,在网络上有很多资源,如 http://www.w3schools.com/xml/xml_whatis.asphttp://www.xml.com/pub/a/98/10/guide0.html

XML是一种标记语言,就像HTML,但是有更严格和简洁(cleaner)的语法,有几点需要特别注意。

元素必须格式良好

首先,每个元素必须关闭。有两种元素来关闭一元素,就像下面描述的一样,它们是等价的。

描述

代码

通过一个结束标签关闭:

<window><window/>

不通过一个结束标签关闭:

<window/>

其次, 元素要被正确的嵌套(nested)。

结果

代码

正确:

<window>
   <groupbox>
      Hello World!
   </groupbox>
</window>

错误:

<window>
   <groupbox>
      Hello World!
   </window>
</groupbox>

特殊字符必须被替换

XML使用<element-name>来表示一个元素,所以你必须替换特殊的字符。

例如,你必须使用&lt;表示<

特殊字符

替换字符

<

&lt;

>

&gt;

&

&amp;

"

&quot;

'

&apos;

另外,你可以使用CDATA来使XML解析器不要解释其内的文本,如下:

<zscript>
<![CDATA[
void myfunc(int a, int b) {
   if (a < 0 && b > 0) {
      //do something
   }
]]>
</zscript>

有意思的是反斜杠(\)不是特殊字符,所以你不需要担心。

属性值必须被指定且用引号包围

结果

代码

正确:

width="100%"
checked="true"

错误:

width=100%
checked

注释

注释通常被用于留下一个说明或暂时便基出一部分XML源码(leave a note or to temporarily edit out a portion of XML code)。

<window>
<!-- this is a comment and ignored by ZK -->
</window>

字符编码

尽管是可选定的,但在你的XML中指定编码是个好主意,这样XML解析器可以正确的解释文本。

注意:它必须被放置在文件的第一行。

<?xml version="1.0" encoding="UTF-8"?>

除了指定正确的编码,同时也要确保你的XML编辑器支持这种编码。

命名空间

命名空间是区分XML文档中用到名字的一个简单易懂的办法。ZK使用XML命名空间来区分组件名称。这样,只要不在同一个命名空间,两个组件有相同的名字是可以的。ZK使用XML命名空间来表现一个组件集。这样,开发人员可以在同一个页面内混合使用两个或多个组件集,如下所示

<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 的元素。

使用Schema 自动完成

许多IDE,如Ecipse,支持自动完成,如果XML schema被按如下方式指定。

<window xmlns="http://www.zkoss.org/2005/zul"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd">

除了可以从http://www.zkoss.org/2005/zul/zul.xsd 下载到,可以在ZK的binary 发行版中的dist/xsd目录找到zul.xsd



[34] 被称为 http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul。但是,添加了许多非XUL特性,所以最好使用独立的命名空间。