`

Zk中注解的使用(ZkDemo系列)

    博客分类:
  • ZK
阅读更多

运行环境:

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;
	}
 
效果显示



详细内容见附件

 

 

 

 

 

分享到:
评论

相关推荐

    zk十分钟入门demo

    通过"gettingStarted-master"中的示例,我们可以看到ZK如何使用ZUL文件构建用户界面,以及如何通过Java代码处理用户交互。这只是ZK功能的冰山一角,ZK还支持数据绑定、MVC模式、国际化、AJAX更新等多种特性,为...

    ZK+spring+hibernate的整合

    Spring可以通过ZK的@Wire注解自动将Bean注入到ZK组件中。 4. **配置ZK-Spring**:需要引入ZK-Spring的库,这是一个连接ZK和Spring的桥梁,它提供了Spring的ApplicationContext到ZK Session的绑定,使得ZK组件可以...

    zk+spring+hibernate整合

    在IT行业中,`ZK`(ZooKeeper)、`Spring`和`Hibernate`都是非常重要的技术组件,分别在分布式协调、应用框架和对象关系映射领域有着广泛应用。本项目是将这三个技术进行整合,用于构建一个基于MySQL数据库的完整...

    dubbo-demo(ZK集群).zip

    本示例"**dubbo-demo(ZK集群).zip**"提供了如何在实际项目中搭建和使用Dubbo与Zookeeper集群的实例。下面我们将深入探讨这两个组件的核心功能、它们的集成方式以及实际操作步骤。 **Dubbo** 是阿里巴巴开源的一款...

    springboot整合dubbo和zookeeper的demo

    综上所述,"springboot整合dubbo和zookeeper的demo"项目是一个典型的微服务实践,展示了如何在SpringBoot环境中利用Dubbo实现服务间的通信,以及如何借助Zookeeper进行服务注册与发现。开发者可以通过这个项目深入...

    Springboot整合Dubbo/ZooKeeper_demo

    6. 创建服务消费者:在消费者项目中引入服务接口,并使用@Reference注解注入服务。 7. 配置服务消费者:同样在配置文件中设置服务消费者的属性,包括应用名、注册中心等。 8. 调用服务:运行服务消费者的Spring Boot...

    zk-dubbo-boot.zip

    描述中提到的“demo——springboot整合dubbo+zk”进一步确认了这个项目是一个演示如何在SpringBoot应用中整合Dubbo服务治理框架与Zookeeper作为注册中心的实例。接下来,我将详细讲解这三个技术以及它们之间的整合。...

    duboo分布式狂框架demo

    本项目提供了一个完整的Demo,帮助开发者快速理解并实践Duboo框架的使用。 首先,我们来看一下启动前的准备工作。在运行Duboo分布式框架的Demo之前,必须确保Zookeeper已经启动。Zookeeper是Apache的一个开源项目,...

    spring-kafka

    Spring Kafka 的设计目标是简化与 Kafka 的交互,使得开发者可以轻松地在 Spring 应用程序中使用 Kafka 功能。 **1. Spring Kafka 的核心概念** - **Producers**: 生产者是向 Kafka 集群发送消息的组件。Spring ...

    Spring boot 集成Dubbox的方法示例

    5. **启用Dubbo注解扫描**:在Spring Boot的主配置类中,添加`@EnableDubbo`注解,使Spring Boot能识别并处理Dubbo相关配置。 ```java import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; ...

Global site tag (gtag.js) - Google Analytics