ZK - ZK Getting Started-Tutorial - Documentation
ZK - ZK Getting Started-Tutorial - Documentation
org/wiki/ZK_Getting_Started/Tutorial
Products
ZK Framework
ZK Spreadsheet
ZK Charts
ZK Pivottable
ZK Studio
ZK Calendar
ZK Spring
ZK JSP
ZATS Test
Demos
ZK Framework
ZK SpreadSheet
ZK Pivottable
ZK Charts
ZK Calendar
ZK Web Mail
ZK Sandbox
Real World Apps
Downloads
ZK Framework
ZK Spreadsheet
ZK Charts
ZK Pivottable
ZK Studio
ZK Calendar
ZK Spring
ZK JSP
ZATS Test
Why ZK
Top Reasons
Features
Why ZK EE
Who's Using
Case Studies
Testimonials
1 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
Community
Forum
Blog
Board
Request Features
Report Bugs
Documentation
ZK Framework
ZK Spreadsheet
ZK Charts
ZK Pivottable
ZK Studio
ZK Calendar
ZK Spring
ZK JSP
ZATS Test
Support
Support Options
Partners
About Us
Contact Us
Search..
From Documentation
This tutorial guides you through the most fundamental features and concepts of ZK.
To create web application, please refer to Create and Run Your First ZK Application with Eclipse and ZK
Studio (http://books.zkoss.org/wiki/ZK_Installation_Guide/Quick_Start
/Create_and_Run_Your_First_ZK_Application_with_Eclipse_and_ZK_Studio)
For product description, please refer to the ZK product page (http://www.zkoss.org/product/zk) and the
feature list (http://www.zkoss.org/whyzk/features) .
For a real world example, please refer to Creating a database-driven application.
For learning step-by-step, please refer to ZK Essentials.
2 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
Contents
1 Hello World!
2 Say Hello in Ajax way
3 It is Java that runs on the server
4 A component is a POJO
5 A component is a LEGO brick
6 Express data with variable resolver and EL expressions
7 MVC: Separate code from user interface
8 MVC: Autowire UI objects to data members
9 MVVM: Automate the access with data binding
10 Define UI in pure Java
11 Adding client-side functionality
12 Architecture overview
Hello World!
After ZK is installed on your favorite Web server[1], writing applications is straightforward. Just create a ZUML
file[2], and name it as hello.zul[3], under one of the Web application's directories just as you would do for an
HTML file.
Assuming the name of the Web project is myapp, then go to the corresponding URL, which is http://localhost
/myapp/hello.zul, and you'll see your first ZK application running.
On a ZUML page, an XML element describes what a component[4] can create while the XML attributes are used
to assign values to a component's properties. In this example, a window component is created and its title is set
to "My First ZK Application" and its border is set to normal.
The text enclosed in the XML elements can also be interpreted as a special component called label. Thus, the
above example is equivalent to the following code:
3 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
Then, when you click the button, you'll see the following:
The onClick attribute is a special attribute used to add an event listener(EventListener) to the component such
as that it is invoked when an end user clicks the component. The attribute value could be any legal Java code.
Notice that it is NOT JavaScript, and you have to use double quotes (") in a string. To escape a double quote in
an XML string, you could use single quotes (') to enclose it[1].
The Java code is interpreted by BeanShell (http://www.beanshell.org/) at runtime. In addition to event handling,
you could embed the code in a ZUML page by specifying it in a special element called zscript. For example,
you could simply define a function in the code as the following:
In fact, alert is a built-in function that you can use directly from the embedded Java code.
1. ↑ If you are not familiar with XML, you might take a look at the XML background section.
4 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
For example,
where self is a built-in variable which refers a component receiving the event.
If you enter java.version and then click the button, the result will be shown as the following:
A component is a POJO
A component is a POJO. You could instantiate and manipulate them directly. For example, you could generate
the result by instantiating component(s) to represent it, and then append them to another component as shown
below.
Once appended, the components can be displayed in the browser automatically. Similarly, if components are
detached, they are removed from the browser automatically.
In addition, you could change the state of a component directly. All modifications will be synchronized back to
the browser automatically.
5 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
Instead of introducing different components for different purposes, our components are designed to build blocks.
You are free to compose blocks together to realize sophisticated UI without customizing any components. For
example, you could put anything in a grid, including grid itself; anything in any layout, including the layout
itself. Please see our demo (http://www.zkoss.org/zkdemo) for more examples.
For example, assumes that we have a class called foo.Users, and we can retrieve a list of users by employing
its static method called getAll(). Then, we can implement a variable resolver as follows.
1 package foo;
2 public class UserResolver implements org.zkoss.xel.VariableResolver {
3 public Object resolveVariable(String name) {
4 return "users".equals(name) ? Users.getAll(): null;
5 }
6 }
1 <?variable-resolver class="foo.UserResolver"?>
2 <grid>
3 <columns>
4 <column label="Name" sort="auto"/>
5 <column label="Title" sort="auto"/>
6 <column label="Age" sort="auto"/>
7 </columns>
8 <rows>
9 <row forEach="${users}">
10 <label value="${each.name}"/>
11 <label value="${each.title}"/>
12 <label value="${each.age}"/>
13 </row>
14 </rows>
15 </grid>
There are three methods that we can assume foo.User: getName(), getTitle() and getAge(). forEach is
used to instantiate components by iterating through a collection of objects.
6 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
To separate codes from UI, you can implement a Java class (aka., the controller) that implements Composer, and
then handle UI in Composer.doAfterCompose(Component). For example, you can redo the previous example by
registering an event listener in Composer.doAfterCompose(Component), and then retrieve the result by
instantiating a label to represent it in the event listener as follows.
1 package foo;
2 import org.zkoss.zk.ui.Component;
3 import org.zkoss.zk.ui.util.Composer;
4 import org.zkoss.zk.ui.event.EventListener;
5 import org.zkoss.zul.Label;
6
7 public class PropertyRetriever implements Composer {
8 public void doAfterCompose(final Component target) { //handle UI here
9 target.addEventListener("onClick", new EventListener() { //add a even
10 public void onEvent(Event event) {
11 String prop = System.getProperty(((Textbox)target.query(
12 target.query("#result").appendChild(new Label(prop));
13 }
14 });
15 }
16 }
Also notice that a component could be retrieved with the use of Component.query(String), which allows the
developer to use a CSS 3 selector to select a component, such as query("#id1 grid textbox").
Then, you could associate the controller (foo.PropertyRetriever) with a component using the apply attribute
as shown below.
For more information, please refer to Get ZK Up and Running with MVC (http://books.zkoss.org
/wiki/ZK_Getting_Started/Get_ZK_Up_and_Running_with_MVC)
7 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
extending from SelectorComposer, ZK looks for the members annotated with @Wire or @Listen to match the
components. For example, you could rewrite foo.PropertyRetriever by utilizing the autowriing as follows.
PropertyRetriever.java
1 package foo;
2 import org.zkoss.zk.ui.Component;
3 import org.zkoss.zk.ui.event.Event;
4 import org.zkoss.zk.ui.select.SelectorComposer;
5 import org.zkoss.zk.ui.select.annotation.*;
6 import org.zkoss.zul.*;
7
8 public class PropertyRetriever extends SelectorComposer<Window> {
9 @Wire
10 Textbox input; //wired to a component called input
11 @Wire
12 Vlayout result; //wired to a component called result
13
14 @Listen("onClick=#retrieve")
15 public void submit(Event event) { //register a listener to a component ca
16 String prop = System.getProperty(input.getValue());
17 result.appendChild(new Label(prop));
18 }
19 }
As shown above, @Wire will cause input and result to be wired automatically, such that you could access the
components directly. Also @Listen("onClick=#retrieve") indicates that the annotated method will be
registered as an event listener to the component called retrieve to handle the onClick event.
If the component's ID is different from the member's name or the pattern is complicated, you could specify a
CSS 3 selector such as @Wire("#id"), <code>@Wire("window > div > button") and @Listen("onClick
= button[label='Clear']").
You can use with Spring or CDI managed bean in the composer too. For example,
1 @VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver)
2 public class PasswordSetter extends SelectorComposer<Window> {
3 @WireVariable //wire Spring managed bean
4 private User user;
5 @Wire
6 private Textbox password; //wired automatically if there is a textbox nam
7
8 @Listen("onClick=#submit")
9 public void submit() {
10 user.setPassword(password.getValue());
11 }
8 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
12 }
Notice : MVC pattern is recommended for a production application. On the other hand, to
maintain readability, many examples in our documents embed code directly into ZUML pages.
1 package foo;
2 public class UserViewModel {
3 List<User> users = Users.getAll();
4
5 public List<User> getUsers() {
6 return users;
7 }
8 }
Then, you could put them together by applying a built-in composer called BindComposer in a ZUML document
as follows.
1 <grid apply="org.zkoss.bind.BindComposer"
2 viewModel="@id('vm') @init('foo.UserViewModel')" model="@bind(vm.users)"
3 <columns>
4 <column label="Name" sort="auto" />
5 <column label="Title" sort="auto" />
6 <column label="Age" sort="auto" />
7 </columns>
8 <template name="model" var="user">
9 <row>
10 <textbox value="@bind(user.name)" />
11 <textbox value="@bind(user.title)" />
12 <intbox value="@bind(user.age)" />
13 </row>
14 </template>
15 </grid>
9 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
Please notice that you do not need to write any code to handle the display or modification. Rather, you declare
the relation of the UI and data beans in annotations, such as @bind(user.name). Any modification made to each
input (by the end user) is stored back to the object (foo.User) automatically and vice versa, assuming that the
POJO has the required setter methods, such as setName(String).
For more information, please refer to Get ZK Up and Running with MVVM (http://books.zkoss.org
/wiki/ZK_Getting_Started/Get_ZK_Up_and_Running_with_MVC)
1. ↑ ZK data binding is based on the MVVM design pattern, which is identical to the
Presentation Model (http://martinfowler.com/eaaDev/PresentationModel.html) introduced by
Martin Fowler. For more information, please refer to ZK Developer's Reference: MVVM.
2. ↑ Here we load the users by assuming there is a utility called Users. However, it is
straightforward if you'd like to wire Spring-managed or CDI-managed beans. For more
information, please refer to ZK Developer's Reference: MVC
10 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
15 }
16 });
17 main.appendChild(button);
18
19 main.setPage(page); //attach so it and all descendants will be genera
20 }
21 }
A richlet (Richlet) is a small Java program that creates all necessary user interfaces for a given page in response
to users' request. Here we extend java.lang.Object from a skeleton called GenericRichlet. Then, we create all the
required components in Richlet.service(Page).
For example, we could re-implement the Hello World example with the code from the client side as follows.
All components are available and accessible to the client. For example, here is a number guessing game that
manipulates UI from the client side.
where onOK is an event fired when the user presses Enter, and script is used to embed the client-side code (in
contrast to zscript for embedding the server-side code).
11 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
Architecture overview
When a ZK application runs on the server, it gives access to backend resources, assemble UI with components,
listen to users' activity, and then manipulate components to update UI. All are done on the server. The
synchronization of the states of the components between the browser and the server is done automatically by ZK
and transparently to the application.
When running on the server, the application can access full Java technology stack. Users' activities, including
Ajax and Server Push, are abstracted to event objects. UI are composed of POJO-like components. It is the most
productive approach to develop a modern Web application.
With ZK's Server+client Fusion architecture, your application will never stop running on the server. You can
enhance your application's interactivity by adding optional client-side functionality, such as client-side event
handling, visual effect customizing and even UI composing without server-side coding. ZK is the only
framework to enable seamless fusion from pure server-centric to pure client-centric. You can have the best of
two worlds: productivity and flexibility.
12 of 13 20/01/2017 17:27
ZK - ZK Getting Started/Tutorial - Documentation https://www.zkoss.org/wiki/ZK_Getting_Started/Tutorial
Page |
Discussion |
View source |
History
Like Share 116 people like this. Be the first of your friends.
Tweet
Follow us via :
ZK RSS
StumbleUpon
ZK LinkedIn Group
twitter @zkoss
facebook fan page
Log in
13 of 13 20/01/2017 17:27