XML处理指令描述了如何处理ZUML页面。这里我们列出了最常见的指令。关于这些指令的完整信息,请参考 Developer's Reference。
<?page [id="..."] [title="..."] [style="..."] [language="xul/html"] zscriptLanguage="Java"]?>
此指令描述了页面的属性。
[注]:你可以将page
指令放置在XML文档的任何地方,但是,language
属性只有当指令位于最高层次时才是有意义的,也就是说,处于根组件的层次。
<?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)。
<?component name="
myName
" macroURI="
/mypath/my.zul
" [inline="true|
false
"] [class="
myPackage.myClass
"]
[
prop1
="
value1
"
] [
prop2
="
value2
"]...
?>
基于ZUML页面定义一个组件,被称为宏组件(macro component)。换句话说,一旦新组件的一个实例被创建,就会基于指定的ZUML页面(macroURI
属性指定)创建子组件。为了更多的细节,参考宏组件一章。
<?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 class="..." [arg0="..."] [arg1="..."] [arg2="..."] [arg3="..."]?>
<?init zscript="..." [arg0="..."] [arg1="..."] [arg2="..."] [arg3="..."]?>
有两种格式。第一种格式是指定一个类用于处理具体应用(application-specific)的初始化。第二种格式是指定一个zscript文件用于处理具体应用(application-specific)的初始化。
初始化发生在页面被赋值(evaluated)前,并且和桌面联系在一起,因此,当初始化时getDesktop
, getId
和getTitle
方法都会返回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 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 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获取更多信息。
<?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>