进程指令

XML处理指令描述了如何处理ZUML页面。这里我们列出了最常见的指令。关于这些指令的完整信息,请参考 Developer's Reference。

page指令

<?page [id="..."] [title="..."] [style="..."] [language="xul/html"] zscriptLanguage="Java"]?>

此指令描述了页面的属性。

[注]:你可以将page指令放置在XML文档的任何地方,但是,language属性只有当指令位于最高层次时才是有意义的,也就是说,处于根组件的层次。

component指令

<?component name=" myName " macroURI=" /mypath/my.zul " [ prop1 =" value1 " ] [ prop2 =" value2 "]... ?>

<?component name=" myName " [class=" myPackage.myClass "] [extends=" existentName "] [moldName=" myMoldName "] [macroURI="/ myMoldUri "] [ prop1 =" value1 " ] [ prop2 =" value2 "]... ?>

为某一页面定义新的组件。使用此指令定义的组件,仅对于使用该指令的页面是可见的。为了定义在所有组件中可以使用的组件,可是使用附加语言插件(language addon),即一个XML文件,用来

定义在Web应用程序[36]中所有页面都可使用的组件。

有两种方式:通过宏和通过类(by-macro and by-class)。

宏格式(The by-macro Format)

<?component name=" myName " macroURI=" /mypath/my.zul " [inline="true| false "] [class=" myPackage.myClass "] [ prop1 =" value1 " ] [ prop2 =" value2 "]... ?>

基于ZUML页面定义一个组件,被称为宏组件(macro component)。换句话说,一旦新组件的一个实例被创建,就会基于指定的ZUML页面(macroURI属性指定)创建子组件。为了更多的细节,参考宏组件一章。

类格式(The by-class Format)

<?component name=" myName " [class=" myPackage.myClass "] [extends=" existentName "] [moldName=" myMoldName "] [moldURI="/ myMoldUri "] [ prop1 =" value1 " ] [ prop2 =" value2 "]... ?>

如果扩展属性被指定,则基于类创建一个新的组件,即主组件(primitive component)。这个类必须实现org.zkoss.zk.ui.Component接口。

为了定义一个新的组件,你至少必须定义class属性。ZK用这个类属性用来实例化组件的一个新实例。

除了定义一个全新的组件,你可以通过指定extends="existentName"来重写已存在组件的属性。换句话说,如果extends被指定,被指定组件的定义会作为默认值被加载,然后,只有在此指令中被指定的属性会被重写。

例如,假定你想使用MyWindow定义一个名字为mywindow的新组件,而不是默认的window(ZUML页面中的org.zkoss.zul.Window)。然后声明如下:

<?component name="mywindow" extends="window" class="MyWindow"?>
...
<mywindow>
...
</mywindow>

等价于下面的代码:

<window use="MyWindow">
...
</window>

同样,在下面的例子中,将使用OK作为按钮(button)默认标签(label),并且按钮的默认边框为蓝色,

当然,在仅在此页面内有效。

<?component name="okbutton" extends="button" label="OK"
  style="border:1px solid blue"?>

注意,新组件的名字可以和已存在组件的名称一样。在这个例子中,所有组件指定类型的实例将会使用指定的初始属性,就好像它隐藏了存在的定义。例如,下列代码会使所有的按钮(button)使用蓝色边框作为默认值。

<?button name="button" extends="button" style="border:1px solid blue"?>
<button/> <!-- with blue border -->

如想获得更多信息,请参考the Developer's Reference.

init指令

<?init class="..." [arg0="..."] [arg1="..."] [arg2="..."] [arg3="..."]?>

<?init zscript="..." [arg0="..."] [arg1="..."] [arg2="..."] [arg3="..."]?>

有两种格式。第一种格式是指定一个类用于处理具体应用(application-specific)的初始化。第二种格式是指定一个zscript文件用于处理具体应用(application-specific)的初始化。

初始化发生在页面被赋值(evaluated)前,并且和桌面联系在一起,因此,当初始化时getDesktop, getIdgetTitle方法都会返回null。可以使用org.zkoss.zk.ui.Execution接口获取当前桌面。

你可以指定许多init指令。如果你选择了第一种格式,所指定的类必须实现org.zkoss.zk.ui.util.Initator接口。一旦指定,在页面被赋值(evaluated)前,此类的实例会被创建,并且其doInit方法会被调用。

另外,页面被赋值(evaluated)完毕后,doFinally方法会被调用。当例外发生时,doCatch方法会被调用。因此,init指令并不限于初始化,你可以将其用于清理及错误处理。

如果你选择了第二种格式,zscript文件会被赋值(evaluated),且参数(参数0,参数1,......)会作为类型为Object[]args调用的一个变量被传递。

更多信息请参考the Developer's Reference。

variable-resolver指令

<?variable-resolver class="..."?>

为zscript解释器指定一个变量分解器(variable resolver )用以分解未知变量。被指定的类必须实现 org.zkoss.xel.VariableResolver接口。

你可以使用多个variable-resolver指令以指定多个变量分解器。声明靠后的分解器有更高的优先级。

下面是一个ZK结合Spring框架的例子,它分解了在Spring框架中声明的Java Beans,这样我们可以直接访问到它们。

<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>

参考 Small Talk:ZK with Spring DAO and JDBC, Part II 获取更多细节。

关于此属性的详细信息,请参考 the Developer's Reference。

import指令

<?import uri="..."?>

<?import uri="..." directives="..."?>

引入定义在另一个ZUML页面的指令,例如组件定义(<?component?>)和初始器(<?init?>),若省略directives属性,则只会引入component指令和init指令。

若你想引入特定的指令,则可以指定一个指令名称的列表,以逗号分隔。例如,

		<?import uri="/template/taglibs.zul" directives="taglib, xel-method"?>
	

可以被引入的指令包括component, init, meta, taglib, variable-resolver, 和 xel-method。若你想引入所有的指令,可以为directives属性指定*。注意meta 暗含着 meta 和 link指令。

一个典型的应用时将一套组件定义防置在一个ZUML页面中,然后在另外的ZUML页面引入,这样除了系统默认的外(additional to the system default),可以共享一套相同的组件定义。

<!-- special.zul: Common Definitions -->
<?init zscript="/WEB-INF/macros/special.zs"?>
<?component name="special" macroURI="/macros/special.zuml" class="Special"?>
<?component name="another" macroURI="/WEB-INF/macros/another.zuml"?>

假定Special类定义在 /WEB-INF/macros/special.zs文件内。

然后,其他的ZUML页面可以按如下方式共享一套组件定义:

<?import uri="special.zul"?>
...
<special/><!-- you can use the component defined in special.zul -->

不同与其他指令, import 指令必须位于最高层次,也就是说,处于根组件的层次。

参考the Developer's Reference获取更多信息。

linkmeta指令

<?link [href="uri"] [name0="value0"] [name1="value1"] [name2="value2"]?>

<?meta [name0="value0"] [name1="value1"] [name2="value2"]?>

这些即HTML里所谓的头元素(header elements)。目前仅基于HTML的客户端(即浏览器)支持他们。

开发人员可以为这些头指令指定任何属性。ZK仅会翻译href属性的URI(使用Executions类的encodeURL方法)。ZK为客户端直接产生其他的所有属性。

注意,这些头指令只对于主ZUL页面是有效的。也就是说,如果页面是被另其他页面或servlet包含的话,这些头指令会被忽略。当然,若一个页面为zhtml文件,这些指令也会被忽略。

<?link rel="alternate" type="application/rss+xml" title="RSS feed"
 href="/rssfeed.php"?>
<?link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"?>
<?link  rel="stylesheet" type="text/css" href="~./zul/css/ext.css.dsp"?>

<window title="My App">
    My content
</window>


[36] 语言插件在 the Component Development Guide中有描述。