ZK程序员开发指南(三)

 

第三章    基础

本章描述的ZK的基础知识,ZK使用了XUL来描述ZK的特性,当然,它也能够被用于ZK支持的其他标记语言。

 

架构概览

ZK包含了一个基于AJAX的机制,可以动态的实现交互,以及一个基于XUL的组件丰富应用的可用性,还有一个标记语言集来简化系统开发。

基于AJAX的机制由下述的三个部分组成:ZK LoaderZK AU 引擎和ZK客户端引擎。

基于用户的请求,ZK Loader会装载不同的ZK页面,然后对其进行解释,最后将结果渲染成HTML页面通过URL返回给客户端。一个ZK页面是由ZUML标记语言书写而成。与HTML一样,ZUML用于描述需要创建什么样的组件以及如何将其用用户可见的方式表现出来。这些组件一旦创建,除非会话超时,否则不会失效。

ZK AU 引擎和ZK客户端引擎共同协作实现诸如分配器(pitcher)和捕获器(catcher)的功能。它们将浏览器中发生的事件传递给服务器上运行的应用程序,同时更新浏览器端的DOM树,更新的结果是基于服务器端应用程序对组件的操作。这就是所谓的事件驱动开发模型。

执行流程

1.当用户在地址栏中输入URL或是在浏览器中点击了一个超链接时,请求会被发送到Web服务器。此时,如果URLZK配置的要求匹配,ZK Loader会被调用以处理客户端的请求。

2ZK Loader 将特定的页面载入,并对其进行解释,根据相应代码创建正确的组件。

3.在将整个页面解释完后,ZK Loader将结果渲染成HTML页面。然后该HTML页面与ZK客户端引擎会一并被发送回客户端的浏览器。

4ZK客户端引擎会在浏览器中常驻,检测用户活动在浏览器中触发的任何事件,如鼠标移动事件或值改变事件。一旦事件被检测到,ZK客户端会通过一个请求提醒ZK AU 引擎事件的发生。

5.在接到客户端引擎发送过来的ZK请求后,如果必要,AU引擎会更新相应的组件的内容。然后,如果以定义了事件处理函数,AU引擎会通过调用相应的事件处理函数提醒应用程序。

6.如果应用程序选择改变组件的内容、增加或移动组件,AU引擎会通过使用ZK响应将组件改变后的新的内容发送给客户端引擎。

7.这些所谓的ZK响应其实是一些命令,用于告诉客户端引擎如何根据消息更新客户端的DOM数而已。

 

组件、页面和桌面的概念

组件

一个组件是一个UI对象,可以是一个标签、一个按钮或是一棵树。它定义了一个特定的用户界面的可视化表现形式及行为。通过操作组件,开发人员来控制如何在客户端展现相应的用用。

一个组件必须实现 org.zkoss.zk.ui.Component 接口。

页面

一个页面(org.zkoss.zk.ui.Component)是组件的集合。一个页面包含了属于它的所有组件,各个组件会在浏览器的特定部分显示出来。当ZK Loader在解释一个ZUML页面时,页面会被自动的创建。

页面标题

每个页面可以拥有一个标题(title),将会成为浏览器窗口标题栏内容的一部分。详细信息请参看《ZK 用户接口标记语言》一章的处理指令部分。

 

桌面

一个ZUML页面可以直接或间接的包含另一个ZUML页面。由于这些页面都是为了同一个URL请求而创建,我们就把它们的集合称为一个桌面(org.zkoss.zk.ui.Desktop)。换句话说,一个桌面就是响应同一个URL请求的页面的集合。

随着ZK应用程序与用户的持续交互,更多的页面会被加入到桌面,同时,一些页面也会从桌面中被移除。类似的,组件也会被加入页面或是被从页面中移除。

createComponents方法

需要注意的是,页面和桌面的创建和移除都是用户/程序员不可见的。没有相应的API来实现这样的功能。每次ZUML载入一个页面时,页面就被创建。当ZK发现页面不再被引用时,页面就会被移除。在第一个ZUML页面被载入时,桌面就被创建。当特定的会话里有太多的桌面时,之前创建的桌面就会被移除。

org.zkoss.zk.ui.Executions中的方法createComponents只是创建组件,而不是页面,虽然它会载入一个ZUML文件。

 

组件树和组件森林

一个组件最多能有一个父亲,而一个组件可以拥有多个孩子。一些组件只接受特定的组件作为其孩子,而一些组件必须成为某些类型组件的孩子。一些组件甚至不允许有孩子组件。比如,ListBox 组件在XUL中只接受ListcolsListitem两种孩子组件。详细细节参见Javadoc或是XUL指引手册。

没有任何父亲的组件叫根组件。一个页面可以拥有多个根组件,程序员可以通过getRoots方法获取各个根组件。

组件:是一个可视化的表现形式和一个Java对象

除了在服务器端表现为一个Java对象外,当且仅当组件属于某个页面时,它才是浏览器中的一个用户可见的组成部分。如果组件被关联到一个页面,它的用户可见部分就会被创建,一旦它被从页面中移除,它的用户可见部分也同样被移除。

有两种方法将一个组件关联到一个页面。第一种方法是调用setPage方法,将组件设置为特定页面内的根组件。另一种方法是调用setParentinsertBefore或是appendChild方法将组件设置为另一个组件的孩子。这样,被设置为孩子的组件就与其父亲一样属于同一个页面了。

类似的,你也可以通过调用setPage方法将组件从页面中移除,只要在调用时使用参数null即可。一个孩子组件如果被从它的父亲移除,或是被从页面中移除,它就会从页面中消失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值