第 12 章 性能提示

目录

使用编译过的Java代码
使用deferred 属性
deferred属性和onCreate事件
使用forward属性
使用Servlet 线程处理事件
模态窗口
消息框
文件上传
使用本地命名空间代替XHTML命名空间
延长时期(Prolong the Period)检查文件是否被修改
延迟子组件的创建
为大型Listbox使用实况数据和分页
使用ZK JSP标签或ZK JSF 组件代替ZK Filter

本章将要讲述使你的ZK应用程序运行的更快的提示。

使用编译过的Java代码

在ZUML中使用zscript很方便,但是这需要付出代价:性能较低。降级随应用程序不同而不同(The degradation varies from one application from another)。对于大型的网站,建议尽可能的不使用zscript。

使用deferred 属性

若你仍然需要编写zscript 代码,可以指定deferred 属性来延迟zscript 代码的赋值(evaluated),如下。

<zscript deferred="true">
...

通过指定deferred属性,它包含的zscript 代码在ZK提交(render)一个页面时不会被赋值(evaluated)。这意味着当ZK提交一个页面时,解释其不会被加载。这节省了内存且加速了页面的提交。

在下面的例子中,仅当按钮被点击时解释器才会被加载:

<window id="w">
   <zscript deferred="true">
   void addMore() {
      new Label("More").setParent(w);
   }
   </zscript>
   <button label="Add" onClick="addMore()"/>
</window>

deferred属性和onCreate事件

这值得注意,若onCreate事件监听器由zscript 编写,在前面提到的deferred 选项会变得无效。这是因为onCreate事件是在加载页面时被送出的。换言之,若onCreate事件监听器由zscript 编写,所有被延迟的zscript会在加载页面时被赋值,如下所示。

<window onCreate="init()">
...

最好重写为

<window use="my.MyWindow">
...

然后准备MyWindow.java,如下。

package my;
public class MyWindow extends Window {
   public void onCreate() { //to process the onCreate event
...

若你喜欢在创建了组件(及该组件所有的子组件)之后马上进行初始化,可以是实现org.zkoss.zk.ui.ext.AfterCompose接口,如下。注:AfterCompose接口的afterCompose方法是在组件创建阶段被赋值的,而onCreate事件是在事件处理阶段被赋值的。

package my;
public class MyWindow extends Window implements org.zkoss.zk.ui.ext.AfterCompose {
   public void afterCompose() { //to initialize the window
...

使用forward属性

为简化事件流,ZK经常会将事件送至组件本身,而不是父组件或其它目标。例如,当用户点击一个按钮时,onClick事件会被送至button。开发人员通常使用onClick事件监听器将事件转发至window,如下。

<window id="w">
   <button label="OK" onClick="w.onOK"/>

正如在前面章节建议的那样,不使用zscript可以提高性能。因此,你可以使用EventListener或按如下方式指定forward属性来重写代码片断。

<window>
   <button label="OK" forward="onOK"/>