ZK程序员开发指南(三)

来源:互联网 发布:dos下运行java 编辑:程序博客网 时间:2024/06/05 19:20
 

第三章    基础

本章描述的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即可。一个孩子组件如果被从它的父亲移除,或是被从页面中移除,它就会从页面中消失。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在菲律宾黑了博彩老板的钱怎么办 九阴真经3d先遣服更新失败怎么办 公司核名通过不想用了怎么办 公司核名下来了不想注册了怎么办 家人受到小贷公司催款威胁怎么办 商标抽签资料提交上去有问题怎么办 花椒直播助手苹果版下载不了怎么办 在香港酒店住把床单弄上血了怎么办 综英美我能怎么办我也很绝望百度云 护照的名字中间有个空格怎么办 开车不小心压死黄鼠狼了怎么办 三户联保贷款一方不还怎么办 因为隔断中介违约…我该怎么办 上海居住证没下来换住址了怎么办 工商注册后大股东不注资怎么办 公司不给去办理变更股东信息怎么办 滴滴车主注册没有自己的车型怎么办 代办用虚假地址注册的公司怎么办? 写字楼注册公司租户不租了怎么办 租户没把公司迁出我该怎么办 租户不肯把户口迁出了业主怎么办 同片区个体户营业场所搬迁怎么办 个体领发票的本丢了怎么办 领房产证发票和合同丢了怎么办 税务登记证5年没有办怎么办 二证合一后税务登记证怎么办? 微信漂流瓶打招呼对方收不到怎么办 添加不上徽信好友的微信帐号怎么办 手机号码不用了微信密码忘了怎么办 别人用我的手机号码注册微信怎么办 电脑此网站的安全证书有问题怎么办 起诉离婚开庭时被告不到场怎么办 商标35类被别人注册了怎么办 商标被注销后被别人注册怎么办 电商35类商标被抢注怎么办 血小板太低怎么办可以吃水果吗? 微信好友删除了只记得昵称怎么办 优酷会员1080p很卡怎么办 电脑最下面的任务栏不显示怎么办 ea账号保留的问题忘了怎么办 微博超级话题账号被屏蔽怎么办