1.zuml页面的生命周期
①页面初始化
页面初始化阶段
在这个阶段,zk会执行一个init处理指示,如果没有定义这个处理指示,就会跳过这个初始化阶段. 对于每个init指示而言,都会有一个class属性,在其中创建一个指定类的实例,并调用他的doinit方法,比如,<? init class="Myinit" ?>制定了Myinit类作为页面初始化得类.这个类的处理更依赖于你程序的需求.
还有另一种方式传递init方法,就是指定zscript文件,<? init zscript="/my/init.zs"?> 那么在这个页面初始化的时候会对init.zs这个文件进行解析.
②组件创建
组件创建阶段
在组件创建阶段,zk加载器解析zuml页面,它会根据页面所指定的内容创建并初始化组件主要包括以下七个部分:
①对于每个元素而言,zk加载器检查if和unless属性,判断它们是否为true,如果不是,就会忽略这个元素及其子元素.
②对于一个集合而言,如果指定了foreach属性,zk将为集合每个元素依次执行③-⑦这几个步骤
③zk加载器根据元素名称或类中指定的use属性,创建一个组件.
④按照顺序一个个地初始化组件类的成员,并在zuml中指定属性.
⑤zk加载器加载到任意嵌套的元素,就会重复整个过程.
⑥如果组件实现了org.zkoss.zk.ui.ext.AfterCompose接口,加载器将调用afterCompose()方法
⑦创建完所有的子元素后,将发送onCreate事件给该组件,这样应用程序就能初始化剩下的元素内容,子组件首先提交onCreate事件.
③事件处理
在事件处理阶段中,zk依次调用桌面队列中的每个事件监听器,每次调用监听器,都会使用一个独立的线程,因为它能够进行自动悬挂式运行,而不影响其他事件的处理.
注意: 在处理时,一个事件的监听器,可能会触发另外的事件.
④回填
处理完所有的事件后,zk将所有的组件回填到有规则的html页面中,并将该页面发送给浏览器,要回填组件,需要调用redraw()方法.
2.更新页面
zk异步更新引擎处理来自客户端的zk请求,共分为三个阶段
①请求处理
②事件处理
③回传
ZK异步更新引擎将请求以管道的形势添加到队列中,并为每个队列创建一个队列,因此同一桌面的处理会按顺序进行处理,不同桌面的请求会按并发进行处理.
请求处理阶段
zk异步更新引擎可能会根据请求中的要求来更新相关组件的内容,这样,这样这些组件和客户端的内容将保持一致,然后,zk更新引擎将相关的时间添加到队列中.
事件处理阶段
这个阶段采用和加载zuml页面的事件处理阶段采用相同的放式,它依次处理事件,并且对每个事件的处理都采用独立的线程.
回填
处理完所有的事件后,zk传送已经更新的组件,生成相应的zk响应,并将这些响应信息发送给客户端,然后,客户端引擎会根据这些响应信息更新浏览器中的Dom树.
3.zk组件的垃圾回收
和许多基于组件的GUI不一样,zk的每个组件并没有destroy()和close()方法,正如W3C和DOM规范指出,只要从页面卸载了组件,就应该从浏览器中删除该组件,只要将组件加载到页面上,就应该从页面上显示该组件.
更加准确地说,一个页面一旦卸载了一个组件,如果应用程序中没有任何指向它的引用,那么zk将不再对其负责,而组件分配的内存通过java虚拟机(JVM)垃圾回收装置进行回收释放,但是,如果应用程序仍持有该组件的引用,垃圾回收装置将不会进行回收.