Use Compiled Java Codes

From Documentation
Revision as of 03:09, 26 July 2010 by Char (talk | contribs)
Use Compiled Java Codes


Stop.png This documentation is for an older version of ZK. For the latest one, please click here.


It is convenient to use zscript in ZUML, but it comes with a price: slower performance. The degradation varies from one application from another. For large website, it is suggested not to use zscript if possible. Furthermore, GenericForwardComposer and GenericAutowireComposer may be very slow when mixing with zscript, see the link in the #See Also section.

Use the deferred Attribute

If you still need to write zscript codes, you can specify the deferred attribute to defer the evaluation of zscript codes as follows.

<zscript deferred="true">

By specifying the deferred attribute, the zscript codes it contains will not be evaluated when ZK renders a page. It means the interpreter won't be loaded when ZK renders a page. It saves memory and speeds up the page rendering.

In the following example, the interpreter is loaded only when the button is clicked:

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

The deferred Attribute and the onCreate Event

It is worth to notice that, if the onCreate event listener is written in zscript, the deferred option mentioned in the previous second becomes useless. It is because the onCreate event is sent when the page is loaded. In other words, all deferred zscript will be evaluated when the page is loaded if the onCreate event listener is written in zscript as shown below.

<window onCreate="init()">

Rather, it is better to rewrite it as

<window use="my.MyWindow">

Then, prepare MyWindow.java as shown below.

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

If you prefer to do the initialization right after the component (and all its children) is created, you can implement the AfterCompose interface as shown below. Note: the afterCompose method of the AfterCompose interface is evaluated at the Component Creation phase, while the onCreate event is evaluated in the Event Processing Phase.

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

Use the forward Attribute

To simplify the event flow, ZK components usually send the events to the component itself, rather than the parent or other targets. For example, when an user clicks a button, the onClick event is sent to the button. Developers usually forward the event to the window by use of the onClick event listener as follows.

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

As suggested in the previous sections, the performance can be improved by not using zscript at all. Thus, you can rewrite the above code snippet either with EventListener or by specifying the forward attribute as follows.

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

See Also

Discussion of this article: Talk:Performance_tip

From ZK smalltalk:

From ZK forum:



Last Update : 2010/07/26

Copyright © Potix Corporation. This article is licensed under GNU Free Documentation License.