运行环境:
1, jdk1.6
2, Tomcat6.0
3, eclipse3.5
4, Dynamic Web project
详细内容见附件,下载
技术点:
1,修改zk中默认字体大小
2,zk中添加网站头像(即favicon.ico)
3,borderlayout布局组件的使用
4,自定义宏的使用
5,tree组件的使用
6,grid的使用,以及偶数行着色显示
7,forward属性的使用
8,基于注解的数据绑定
1)org.zkoss.zkplus.databind.AnnotateDataBinderInit类的使用
2)zk注解中类型转换器的使用(TypeConverter)
3)注解中设置别名
4)调用service,异步更新视图
1,修改zk中默认字体大小
zk中的字体默认为英文字体大小,不适合中文字体
在/WEB-INF/zk.xml文件中加入或替换如下代码,
<!-- Configure the font size for menus in ZUL CSS file (norm*.css)
Default: 11px.--> <library-property> <name>org.zkoss.zul.theme.fontSizeMS</name> <value>12px</value> </library-property> <!-- Configure the font size for smaller fonts, such as toolbar, in ZUL CSS file (norm*.css) Default: 11px. --> <library-property> <name>org.zkoss.zul.theme.fontSizeS</name> <value>12px</value> </library-property>
2,zk中添加网站头像(即favicon.ico)
在首页头部,添加
<?link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"?>
3,borderlayout布局组件的使用(详见),其中要注意的是size属性,不能包含px等像素声明,例如size="200px"
<borderlayout> <north size="20%"> </north> <center> <borderlayout> <west size="18%" id="leftMenu" splittable="true" maxsize="300" collapsible="true" title="菜单"> <!-- 使用宏 --> <leftmenu /> </west> <center> <include src="welcome.zul" id="centerInclude" progressing="true" /> </center> </borderlayout> </center> </borderlayout>
4,自定义宏(详见)的使用
首先定义一个zul页面,然后在使用页加入如下代码
<?component name="leftmenu" macroURI="/WEB-INF/content/menu.zul"?>
其中name为标签名称,macroURI为zul页面的路径
使用是如下
<west size="18%" id="leftMenu" splittable="true" maxsize="300" collapsible="true" title="菜单"> <!-- 使用宏 --> <leftmenu /> </west>
5,tree组件的使用(详见)
<tree id="leftTree"> <attribute name="onSelect"> <![CDATA[ showModel(); ]]> </attribute> <treechildren> <treeitem> <treerow> <treecell label="基于注解"></treecell> </treerow> <treechildren> <treeitem value="userlist.zul"> <treerow> <treecell label="用户列表"></treecell> </treerow> </treeitem> </treechildren> </treeitem> </treechildren> </tree>
6,grid的使用,以及偶数行着色显示(详见)
<!--model为当前window,绑定use对应的类的属性userList -->
<!-- 如果不想让偶数行着色,可加oddRowSclass="non-odd"属性 -->
<grid fixedLayout="true" id="userlistGrid" model="@{userlistWindow.userList}" height="400px">
<columns>
<column label="编号"></column>
<column label="名称"></column>
<column label="密码"></column>
<column label="性别"></column>
<column label="年龄"></column>
</columns>
<rows>
<!-- each为foreach的每一个元素,并给each起了一个别名user -->
<row self="@{each=user}">
<label value="@{user.id}"></label>
<label value="@{user.name}"></label>
<label value="@{user.password}"></label>
<!-- 性别转换器,bean中的sex为integer类型,使用转换器,转换成男-女 -->
<label
value="@{user.sex,converter='com.sunflower.zkDemo.web.zk.converter.SexConverter'}"></label>
<label value="@{user.age}"></label>
</row>
</rows>
</grid>
7,forward属性的使用,forward属性,如果是方法,此方法必须是public 并以on开始 信息使用见这里
<button label="加载列表" forward="onLoadUserList"></button>
8,基于注解的数据绑定
1)org.zkoss.zkplus.databind.AnnotateDataBinderInit类的使用
zul页面部分<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" arg0="userlistWindow"?> 参数arg0对应当前页面的window
2)zk注解中类型转换器的使用(TypeConverter),详见我的另一篇zk3.6.4 api中converter部分
<label value="@{user.sex,converter='com.sunflower.zkDemo.web.zk.converter.SexConverter'}"></label>
SexConverter.java代码
// bean到视图的转换
@Override
public Object coerceToUi(Object intSex, Component arg1) {
if (intSex instanceof Integer) {
int sex = (Integer) intSex;
if (sex == 0)
return "女";
else
return "男";
}
return null;
}
3)注解中设置别名
<!-- each为foreach的每一个元素,并给each起了一个别名user -->
<row self="@{each=user}">
4)调用service,异步更新视图
// 加载用户列表,与button组件的forward属性绑定
public void onLoadUserList() {
// 调用服务,如果与spring整合,可以使用SpringUtil.getBean("UserService");
UserService userService = new UserServiceImpl();
userList = userService.findAllUser();
// 更新grid,显示数据
binder.loadComponent(userlistGrid);
//立即显示所有行,不延迟加载
// userlistGrid.renderAll();
}
完整页面:
index.zul
<?page title="zkDemo演示" id="indexPage"?> <?link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"?> <!-- 自定义宏 --> <?component name="leftmenu" macroURI="/WEB-INF/content/menu.zul"?> <borderlayout> <north size="20%"> </north> <center> <borderlayout> <west size="18%" id="leftMenu" splittable="true" maxsize="300" collapsible="true" title="菜单"> <!-- 使用宏 --> <leftmenu /> </west> <center> <include src="welcome.zul" id="centerInclude" progressing="true" /> </center> </borderlayout> </center> </borderlayout>
menu.zul
<?xml version="1.0" encoding="utf-8"?>
<zk xmlns:h="http://www.w3.org/1999/xhtml" xmlns:n="http://www.zkoss.org/2005/zk/native"
xmlns="http://www.zkoss.org/2005/zul" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd">
<zscript>
void showModel(){
Treeitem item = leftTree.getSelectedItem();
if(item==null||item.getValue()==null){
return;
}
Include include = spaceOwner.parent.getFellow("centerInclude");
include.setSrc(item.getValue());
}
</zscript>
<h:style>
.link_underline:visted{
color:#069;
font-size:12px;
text-decoration:none;
}
.link_underline{
color:#069;
font-size:12px;
text-decoration:none;
}
.link_underline:hover{
cursor:pointer;
color:#069;
font-size:12px;
text-decoration:underline;
}
</h:style>
<tree id="leftTree">
<attribute name="onSelect">
<![CDATA[
showModel();
]]>
</attribute>
<treechildren>
<treeitem>
<treerow>
<treecell label="基于注解"></treecell>
</treerow>
<treechildren>
<treeitem value="userlist.zul">
<treerow>
<treecell label="用户列表"></treecell>
</treerow>
</treeitem>
</treechildren>
</treeitem>
</treechildren>
</tree>
</zk>
userlist.zul
<!-- 此处为关键部分 arg0 为当前window 的id-->
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" arg0="userlistWindow"?>
<?link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"?>
<!-- 定义window id,做为 AnnotateDataBinderInit的参数,以及grid组件model引用
use属性表示当前window关联的class
-->
<window id="userlistWindow"
use="com.sunflower.zkDemo.web.zk.controller.UserListController"
xmlns:h="http://www.w3.org/1999/xhtml" xmlns:n="http://www.zkoss.org/2005/zk/native"
xmlns="http://www.zkoss.org/2005/zul" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd">
<button label="加载列表" forward="onLoadUserList"></button>
<!--model为当前window,绑定use对应的类的属性userList -->
<!-- 如果不想让偶数行着色,可加oddRowSclass="non-odd"属性 -->
<grid fixedLayout="true" id="userlistGrid" model="@{userlistWindow.userList}" height="400px">
<columns>
<column label="编号"></column>
<column label="名称"></column>
<column label="密码"></column>
<column label="性别"></column>
<column label="年龄"></column>
</columns>
<rows>
<!-- each为foreach的每一个元素,并给each起了一个别名user -->
<row self="@{each=user}">
<label value="@{user.id}"></label>
<label value="@{user.name}"></label>
<label value="@{user.password}"></label>
<!-- 性别转换器,bean中的sex为integer类型,使用转换器,转换成男-女 -->
<label value="@{user.sex,converter='com.sunflower.zkDemo.web.zk.converter.SexConverter'}"></label>
<label value="@{user.age}"></label>
</row>
</rows>
</grid>
</window>
welcome.zul
<zk xmlns:h="http://www.w3.org/1999/xhtml" xmlns:n="http://www.zkoss.org/2005/zk/native" xmlns="http://www.zkoss.org/2005/zul" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd"> <div align="center"> <image src="/images/splash.gif"/> </div> </zk>
java UserListController
package com.sunflower.zkDemo.web.zk.controller;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.zk.ui.Components;
import org.zkoss.zk.ui.ext.AfterCompose;
import org.zkoss.zkplus.databind.AnnotateDataBinder;
import org.zkoss.zul.Window;
import org.zkoss.zul.api.Grid;
import com.sunflower.zkDemo.domain.User;
import com.sunflower.zkDemo.service.UserService;
import com.sunflower.zkDemo.service.UserServiceImpl;
@SuppressWarnings("serial")
public class UserListController extends Window implements AfterCompose {
//绑定器:我起的名字,
protected AnnotateDataBinder binder;
//前端zul页面grid的id
private Grid userlistGrid;
//grid model属性绑定的数据,提供get set方法
private List<User> userList = new ArrayList<User>();
public void afterCompose() {
Components.wireVariables(this, this);
Components.addForwards(this, this);
}
public void onCreate() {
binder = (AnnotateDataBinder) this.getVariable("binder", true);
}
// 加载用户列表,与button组件的forward属性绑定
public void onLoadUserList() {
// 调用服务,如果与spring整合,可以使用SpringUtil.getBean("UserService");
UserService userService = new UserServiceImpl();
userList = userService.findAllUser();
// 更新grid,显示数据
binder.loadComponent(userlistGrid);
//立即显示所有行,不延迟加载
// userlistGrid.renderAll();
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
UserServiceImpl.java
@Override
public List<User> findAllUser() {
// 仅作为演示,实际操作,访问数据库
List<User> userList = new ArrayList<User>();
User user = null;
Random random = new Random();
DecimalFormat decimalFormat = new DecimalFormat("0000000");
for (int i = 0; i < 50; i++) {
user = new User();
user.setId(i);
user.setName("Sun" + i);
user.setPassword(decimalFormat.format(random.nextInt(600000)));
user.setSex(random.nextInt(1));
user.setAge(random.nextInt(90));
userList.add(user);
}
return userList;
}