zk之旅系列文章导航
- zk之旅之--------- 开始ZK: install and hello world.
- zk之旅之--------- 认识ZK(1):zk的基础构架和基本机制
- zk之旅之--------- 认识ZK(2):zk的组件
- zk之旅之--------- 认识ZK(2):zk的事件
- zk之旅之--------- 认识ZK(2):zk的高级特性
- zk之旅之--------- 认识ZK(2):zk与流行框架(jsp,spring,hibernate)集成
上一章跟大家分享了zk之旅之--------- 开始ZK: install and hello world. 今天跟大家讲下zk的基础构架和基本机制。
引言ZK官方文档如下说:
--------------------------------------------------------------------------
ZK是一个事件驱动(event-driven)的,基于组件(component-based)的,用以丰富网络程序中用户界面的框架。ZK包括 一个基于AJAX事件驱动的引擎(engine),一套丰富的XUL和XHTML,以及一种被称为ZUML(ZK User Interface Markup Language,ZK用户界面标记语言)的标记语言。
有了ZK,您可以利用XUL和XHTML的丰富特性来呈现您的Web 应用,操纵它们来处理因用户活动而引发的事件,就像在桌面应用程序中那样。不同于大多数其它框架,就ZK而言,AJAX是一种幕后(behind- the-scene)技术,组件内容的同步和流水线事件(pipelining of events)都由ZK引擎自动完成。
您的用户获得了如同桌面程序的互动性和反应能力,而您的开发仍然像开发桌面应用程序那样简单。
为了方便快速模型开发(prototyping)和定制,ZK允许开发人员嵌入EL表达式,以及您喜欢的脚本语言,包括但不限于 Java , JavaScript , Ruby and Groovy . 开发人员可以选择不嵌入任何脚本语言,如果他们喜欢更严格的要求(discipline)。不同于JavaScript嵌入在HTML,ZK在服务器端执行所有的嵌入脚本。
注意一切运行在服务器端是从应用程序开发者的角度出发的。组件开发人员必须平衡互动性与简单性来决定什么任务由浏览器来完成,而什么任务由服务器来完成。
-----------------------------------------------------------------------
上面的这段话是台湾式的中文翻译,可能有些拗口,不过从其中的话语中我们能大致的了解到 zk 是一个事件驱动的,基于组件的AJAX框架。 这个是zk的最简单单最精确的描述。
下面说下zk的基础构架:
一个zk页面执行流程如下
-
当用户在浏览器中输入一个URL或点击一个超链接时,一个请求便被送到了Web服务器,如果URI符合ZK的配置 ,ZK 加载器开始解析这一请求。
-
ZK 加载器(ZK loader)加载指定的页面然后解释它,以据此创建相对应的组件。
-
当解释完整个页面后,ZK 加载器(ZK loader)将结果送到一个HTML页面。然后这个HTML页面被送回浏览器和ZK客户端引擎(ZK Client Engine) 一起。
-
ZK客户端引擎(ZK Client Engine)在浏览器中,可以理解成JS代码,以监视由客户的活动而触发的事件,例如移动鼠标,或改变某个值。一旦客户端有变化,它就通知ZK AU引擎通过发送一个ZK请求 。
-
当从客户端引擎接到ZK请求后,如果有需要的话AU引擎就更新相应组件的内容。然后,AU引擎通过调用相关的事件处理程序(如果有的话)来通知应用程序。
-
如果应用程序选择改变组件的内容,添加或移动组件,AU引擎通过ZK响应(ZK responses)将更新后组件的新内容送至客户端引擎。
-
这些ZK响应实际上是一些命令,这些命令指示客户端引擎如何更新DOM树的内容。
组件,页面和桌面的关系
组件即一个用户界面(UI)对象,如标签,按钮和树。它用来定义 一个特定用户界面的视觉表现和行为。通过操纵他们, 开发 人员来控制如何在客户端展示一个应用程序。
组件必须实现 org.zkoss.zk.ui.Component
接口。
页面(org.zkoss.zk.ui.Page
)是一系列组件的集合,一个页面限制属于它的组件,这样它们会被展示在浏览器的特定部分。一个页面被自动创建当ZK 加载器(ZK loader)解释完一个ZUML页面时。
UUID
一个组件有另外一个称为UUID的标识,但应用程序开发人员很少用到它。
UUID是被组件和客户端引擎用来操纵浏览器端的DOM以及和服务器进行通信的。更确切地说,客户端DOM元素的id属性就是UUID。
当一个组件被创建时,UUID会自动产生。除了用以呈现HTML标签的组件标识,它是一成不变的。
相关的HTML组件处理UUID的方式不同于其他的一套组件:UUID就像ID一样。如果你改变一个HTML相关组件的ID,UUID就会跟着改变。因此原来的JavaScript 代码和servlets 将会继续工作,而无需任何修改。