《zk 框架学习总结.doc》由会员分享,可在线阅读,更多相关《zk 框架学习总结.doc(94页珍藏版)》请在三一办公上搜索。
1、ZK 学习总结WebKey项目组2010年2月7日信息技术研究所地址:河北工业大学北辰校区 西教 238室邮编:300401电话:(022)60435838E-Mail:前 言按照项目计划,2010年1月29日至2010年3月5日为前期准备阶段,而春节之前主要对ZK进行深入学习。按照安排,组中各成员分别针对ZK框架进行了学习,并记录了各自的学习过程、内容。现进行整理、总结,以便日后查阅或者供新成员学习之用。本文档的内容参考了ZK官方资源,但重要体现自己的理解及应用,要求编写成员每个例子代码都自己编写一遍,运行出来,加上自己体会总结各个组件用法。目前项目组只掌握了每个组件的独立用法,对于需要几个
2、组件共同工作完成的业务还没有很好的解决方法。另外,对于自定义组件还需特别研究。本手册只是为年前学习之总结,日后还会不断补充。自然其中可能会有错误或不足之处,希望大家多多指教。具体分工: 陈磊:前言、第一章、第四章11节、第五章1、2、3、4、6节 刘建波:第二章、第四章12节、第五章5节 冯新红:第三章 王鸿淼:第四章1、2、3、4、5节 方国建:第四章6、7、8、9、10节 2010年2月7日 WebKey项目组 目 录1 了解ZK11.1 理解ZK11.2 ZK特点12 ZK环境搭建32.1安装环境前,需要下载的东西:32.2安装过程32.3 第一个用Eclipse创建的ZK项目:Hell
3、o World72.4例子中的配置分析123 组件基础属性及事件153.1 ID属性153.2 IF和unless属性163.3 use和apply属性163.4 forEach属性203.5 事件处理204 组件属性及重要函数284.1 标签组件284.2 按钮组件304.3 日历组件314.4 图像组件324.5 窗口344.6 布局组件394.7 标签页444.8 网格484.9 菜单564.10 列表框594.11 树形组件645 应用示例715.1 功能简介715.2 建立项目环境715.3 登陆功能725.4 权限判断735.5 页面布局实现745.6 权限管理实现755.7 信息
4、中心模块775.8 示例配置代码791 了解ZK1.1 理解ZKZK官方网站及中有关于ZK的定义:“ZK是一个事件驱动(event-driven)的,基于组件(component-based)的,用以丰富网络程序中用户界面的框架。ZK包括一个基于AJAX事件驱动的引擎(engine),一套丰富的XUL和XHTML,以及一种被称为ZUML(ZK User Interface Markup Language,ZK用户界面标记语言)的标记语言”。通过这么一段时间的接触,体验到ZK是C/S构架在WEB应用中的实现。写过C/S程序的同学应该能够理解C/S构架特点,如C+,.NET等语言的应用程序构架,以
5、上语言在编写C/S构架程序的时候都是基于各个组件的应用,如窗口、按钮、列表等,用面向对象的语言来说,C/S程序是由各个可视化的对象组成的。最简单的程序需要有以下几个步骤,第一,编写前台数据输入页面,然后编写后台处理数据的代码,最后编写数据处理的结果的页面。以上的3个步骤在B/S框架中通常是独立分开的,而目前ZK框架则将三者能够绑定在一起,在一个ZK得页面中完成。像桌面程序一样,每个显示页面关联一个后台程序,页面中元素值及属性在后台程序中均能够随时得到,后台程序也能够控制页面元素。 ZK是基于组件的,每个组件都有对应的HTML页面显示,又会对应一个JAVA 对象。于是用户可以通过后台程序中对组件
6、JAVA对象的处理来更新页面的HTML显示,而页面中元素的从属关系则体现在Java中的List类,每个组件都能够获得属于其中的元素列表(List)。1.2 ZK特点通过这么一小段时间的ZK学习与应用,总结一点我认为特点与体会。1.组件多样,能够轻松完成普通web程序很难完成的树、图表、页面局部动态变换、标签页、分页网格等功能,是实现富客户端应用的良好工具。2.开发模式简单,只需要掌握各个组件应用变可以轻松完成应用开发。但利用ZK开发还有些缺点的地方1.学习资料较少,只有官方网站中的例子,且例子均是局部功能,没有完整的WEB项目参考。这样就不能了解类包及页面如何分配等相关知识,如目前比较缺少在Z
7、K中通用的对数据库进行增删改查的例子,打开2个window间数据传递等功能。2.感觉网格不是很好用,网格中的一行可以显示一条数据,但如何通过一行直接获得绑定的数据?还是事件处理部分,事件处理是一个组件的特定函数,即一个类的函数,而函数中处理数据经常需要其他组件的数据,如何获得其他组件数据?唯一的方法似乎是事件监听类为组件的内部类。3.版本问题,目前ZK最新式5.0,其中官网中的DEMO均是此版本的,而其他的DEMO及Eclipse的插件均是3.6版本的ZK,导致从例子中学习的一些程序代码在其他环境中运行出错。4.编译源码问题,由于功能需要,需要对项目源代码进行重新编译,但ZK的编译需要在Lin
8、ux或模拟Linux环境下运行,不是很方便,目前还没掌握。2 ZK环境搭建2.1安装环境前,需要下载的东西:作为一个基于 java 的 web framework,再使用 ZK 之前,需要成功安装 JDK 和 tomcat5.5 或者更高的版本,所以要提前下载的东西为:下载JDK(Java SE)安装包;下载Tomcat安装包;下载Eclipse IDE 软件开发工具安装包,我们项目组目前Eclipse环境为3.4;下载ZK Library;下载ZK Studio对于ZK Library可以再http:/www.zkoss.org/download/zk.dsp下载,ZK Studio插件可以
9、在http:/www.zkoss.org/product/zkstudio.dsp下载。2.2安装过程2.2.1安装Java运行环境Java运行环境(Jre)是运行ZK的基础,也是运行servelet容器必需的。Jre可以登录SUN的官方网站(http:/ )中下载到本地机器。安装之后需要配置环境变量。2.2.2 安装Servlet容器Apache Tomcat是当前广为流行的Servlet容器之一,安装简单,使用方便,可以使用官方网站提供的两种安装方法。第一种使用Installer包安装,第二种是快速安装方法,是Tomcat提供的一个.ZIP文件。第二种具体操作过程是:首先,可已访问官方网站
10、下载.zip文件;其次,将文件解压到本地机器;然后装tomcat,装完后启动tomcat测试是否可以正常运行,以便查看环境变量测试的是否正确(默认端口是8080)。在地址栏直接键入http:/localhost:8080/或者输入http:/127.0.0.1:8080。2.2.3安装Eclipse 可以到www.eclipse.org下载eclipse,可以选择: Download now 下载完成后,只需要将下载的压缩文件eclipse-SDK-3.4-in32.zip解压到指定位置,例如D:Eclipse即可完成安装。记下来就可以。安装后,会弹出一个画面选择工作空间,自己指定一个就可以。
11、2.2.4安装插件通过自己在Eclipse下安装ZK插件的学习体会,总结了在Eclipse下安装插件主要有三种方式,我认为第三种方式比较好(推荐),具体的安装过程如下:第一种方法:主要借助于Eclipse的向导来安装插件。通过Help/Software Updates/Find and Install,在弹出的菜单中选择“Search for new features to install”,点“Next”,在下一菜单中选择“New Local Site”或“New Archived Site”,找到你下载的插件所在目录,选中安装即可。 第二种方法:在Eclipse的主目录(%ECLIPSE_
12、HOME%)下有一个plugins目录和features目录。将插件解压缩后,在解压缩后的文件夹里一般可以看到plugins文件夹,有的插件解压缩后还可以看到一个features文件夹。一般将plugins文件夹下的内容直接拷贝到%ECLIPSE_HOME%plugins目录下,如果解压缩后的插件目录下还有features文件夹,则把该文件夹下的内容也拷贝到%ECLIPSE_HOME%features下。重新启动Eclipse之后就可以使用刚刚安装的插件了。第三种方式:就是在Eclipse主目录下创建一个links目录,然后将你自己的插件放在你想放的任何地方,这个时候你放插件的目录就是插件目录
13、(%PLUGIN_HOME%),然后在你的%ECLIPSE_HOME%links目录下创建一个link文件,比如要安装一个 Lomboz插件,可以在links目录下创建一个Lomboz.eclipse.link文件,link文件的名称随便取。这个Lomboz.eclipse.link文件指向的存放Lomboz插件的目录(%PLUGIN_HOME%)。假如你的Lomboz插件的zip/rar文件解压缩后放在C:eclipse_pluginsLomboz.eclipse下(如果是插件是jar文件则可以不用解压缩),则Lomboz.eclipse.link文件的内容就应该是:path=C:eclip
14、se_pluginsLomboz.eclipse。注意:path所指的文件路径一定要增加一个“”转义符来分开。其余插件的安装也是如此,比如安装Eclipse多国语言包,通过安装Eclipse多国语言包,Eclipse可以自动实现开发环境的本地化,即自动根据操作系统的语言环境选择语言包进行本地化,先到http:/download.eclipse.org/eclipse/downloads/下载Eclipse3.2版本的多国语言包,其名称为Language pack。按照前面的第三种方式安装即可。2.2.5 配置ZK环境(ZK库)1.打开Eclipse(前提条件是已经安装好了ZK studio插件
15、),如果没有安装,请先按照前面的介绍安装插件; 2.点击菜单Window-Preferences(From menu goto Windows Preferences );3.在打开的这个窗口上选择ZK-ZK Packages(On the Preferences Window, select ZK ZK Packages);4.点击Add Diretory 选择到你下载的ZK Library包,不用解压,直接是ZIP文件,如下图: 5.会跳出一个窗口来,点击OK6.给这个包命名,一般就用默认的,点击OK;7.再选择上那个ZK Library就行了,如果你不选择,会自动选择最后你引入的版本的。
16、到此,ZK的环境就配置完了。2.3 第一个用Eclipse创建的ZK项目:Hello World2.3.1 创建项目过程1.启动Eclipse,我倾向于在Java EE 下创建项目2.如果没有建立Server的话,需要先打开Window-show view - other-servers 右击选择New -Server,然后选择tomcat即可; 3.选择File-New-Dynamic Web Project,输入项目名称,例如我给项目其名字为MyZK; 4.点Next,再点Finish就完成了一个ZK项目的创建;5.右击项目名称,选择properties-Java BuidPath给项目导
17、入ZK的Jar包,将%ZK_HOME%distlib目录下的所有jar文件(如果需要更多ZK附加功能,加入ext与zkforge目录下的jar文件)到WebContentWEB-INFlib目录下。6.创建一个新的ZUL文件(Creating a new ZUL file):helloworld;7.创建完.zul文件后,写入ZK代码;8.启动Tomcat服务器,选择MyZK,运行;9.在浏览器里输入:http:/localhost:8080/MyZK/first.zul,就可以看到下面的内容。2.4例子中的配置分析2.4.1项目目录结构在Eclipse下搭建的ZK环境上开发的程序,比如对于上
18、面的例子项目MyZK,其目录结构如下所示:下面对于上面的目录中的文件,我通过查找资料,进行了总结,对于Zk的配置文件大体的意思是:WEB-INF/web.xml 定义了必须的servlet,及运行ZK应用程序所需要的监听器;WEB-INF/zk.xml为ZK的配置描述文件;WEB-INF/lib 包括了ZK的必须库文件;该应用程序所需的重要jar包文件说明:. bsh.jar: BeanShell Java 代码解释器. commons-el.jar: Apache的EL表达式解释器. zcommon.jar : ZK的通用库. zhtml.jar: XHTML 相关组件. zk.jar :
19、ZK核心代码. zkplus.jar :与Acegi Security, Spring, Hibernate,和data binding集成的代码. zul.jar :XML相关组件. zweb.jar:web相关功能代码2.4.2关于web.xml的配置在web.xml中为ZK定义必须的servlet ,及listener,我把在该项目MyZK下的web.xml文件中的代码拷贝如下:MyZK Used to cleanup when a session is destroyed ZK Session cleanerorg.zkoss.zk.ui.http.HttpSessionListene
20、r The ZK loader for ZUML pages zkLoader org.zkoss.zk.ui.http.DHtmlLayoutServlet update-uri /zkau 1 The asynchronous update engine for ZK auEngine org.zkoss.zk.au.http.DHtmlUpdateServlet LoginServlet LoginServlet servlet.LoginServlet zkLoader *.zul zkLoader *.zhtml auEngine /zkau/* LoginServlet /user
21、login index.html index.htm index.jsp default.html default.htm default.jsp index.zul2.4.3关于zk.xml的配置.xml文件是对ZK配置的描述性文件,我把在该项目MyZK下的zk.xml文件中的代码拷贝如下:ajax/timeout.zul3 组件基础属性及事件3.1 ID属性为了读取 Java 代码或EL 表达式中的组件,我们可以使用id 属性来标识它。在下面的例子中,我们为label 设置了一个标识,这样当一个按钮被按下时,我们就可以操纵label 的值了。如下面两个例子可以让你领会id的作用 Do yo
22、u like ZK? 当按下“Yes”按钮的时候,可以看到如下效果。id属性在EL表达式中的应用,如下代码: 这段代码实现的是将文本框中的值赋给标签,“source”就代表着文本框,我们只需对其进行操作就相当于对文本框操作了。3.2 IF和unless属性if 和unless 属性被用于控制是否创建一个组件,在下面的例子中,两个label只有在请求中含有一个为vote 的属性时才被创建:如果两个属性都被指定,将不会创建组件除非它们的值都被赋值为true。3.3 use和apply属性在页面中嵌入代码不当会增加维护的难度,有两种途径可以从视图中分离出代码。一种途径是你可以监听所关心的事件,然后调
23、用合适的方法进行处理。例如,可以调用onCreate, onOK, onCancel事件来完成初始化(initialize),处理(process)和取消(cancel)等工作。另外,必须有一个名称为MyManager 的Java 类,内容像下面一样:import org.zkoss.zul.Messagebox;import org.zkoss.zul.Window;public class MyManager public static void init(Window main) main.setTitle(关注我的请求!);public static void save(Window
24、main) throws InterruptedException main.setTitle(save.);Messagebox.show(您的信息已经保存!);public static void cancel(Window main) throws InterruptedException main.setTitle(cancel.);Messagebox.show(你取消的请求已经完成!);按下“save”按钮的时候,程序运行的效果如下:但是,上面的方法需要你在ZUML页面内嵌入一些代码。在用户界面(UI)内嵌入代码的优点是可以很容易的动态改变行为(特别是在原型阶段),但是这仍然会展现
25、一些维护代码且性能会有一些降低。于是引出了use和apply属性的使用。3.3.1 use 属性若不想在 ZUML 页面内使用Java 代码,你可以继承一个组件的实现来处理事件,如下。import org.zkoss.zul.Messagebox;import org.zkoss.zul.Window;public class MyWindow extends Window public void onCreate() this.setTitle(关注我的变化!);public void onSave() this.setTitle(save.);public void onCancel()
26、this.setTitle(cancel.);然后,使用use 属性指定类,如下。执行效果如下:3.3.2 apply 属性若你喜欢使用MVC(模型-试图-控制者)方法,例如,你不想在window(视图)内嵌入处理代码,可以实现一个类来初始化window。这个类必须实现org.zkoss.zk.ui.util.Composer 接口。import org.zkoss.zk.ui.Component;import org.zkoss.zk.ui.util.Composer;import org.zkoss.zul.Window;public class MyComposer implements
27、 Composer public void doAfterCompose(Component comp) throws Exception (Window) comp).setTitle(Apply can be used as this!); / do whatever initialization you want在这里我们假设你有三个监听器, MyCreate,MyOK,和 MyCancel。参考下面的事件章节获取事件监听器的解释。然后,使用 apply 属性指定类,如下。按下apply按钮,程序执行效果如下:window 仍然作为org.zkoss.zul.Window 的一个实例被创
28、建,且作为comp 参数被传递给doAfterCompose 方法。然后,你可以处理你所希望的初始化。若你想apply 多个composer,使用逗号隔开。另外,你可以使用EL 表达式来返回类,它的名称,Composer 实例,或Composer 实例的集合。示意的代码如下:3.3.3 与 forward 属性一起使用window 通常由一些按钮,菜单项目和其他组件组成。例如,当用户点击按钮时,onClick 事件会被送至按钮本身。但是这些事件最好在window内处理而不是散落这些按钮。为了这样,你可以按如下方式使用forward 属性。.在这里OK 按钮的forward 属性指定接收onCl
29、ick 事件后将其作为onOK 事件转向空间所有者(例如,window)。同样,针对Cancel 按钮的onClick 事件会转向onCancel 事件。因此你可以在MyWindow 命名空间内处理onOK 和onCancel事件,如下。public class MyWindow extends Window public void onOK() /called when the OK button is clicked (or the ENTER buttonis pressed)public void onCancel() /called when the Cancel button is
30、 clicked (or the ESC buttonis pressed)除了将onClick 事件forward 至空间所有者,你可以使用forward 属性将任何事件forward 至任何组件。3.4 forEach属性forEach 属性用来控制要创建多少个组件,如果你为这个对象指定一个对象集合,ZK 装载机(ZK loader)将为每个被指定的集合项目创建一个组件。在下面的ZUML 页面中,listitem 元素将被赋值三次(分别为Monday, Tuesday 和Wednesday),然后产生三个list 项目。contacts = new String Monday, Tuesd
31、ay, Wednesday, Thursday,Friday, Saturday, Sunday ;代码运行的效果如下:除了使用foreach,还可以通过forEachBegin 和forEachEnd 来控制迭代(iteration)。3.5 事件处理事件(org.zkoss.zk.ui.event.Event)用来通知服务器发生了什么。每种类型的事件都由一种不同的类来表示。例如,org.zkoss.zk.ui.event.MouseEvent 来代表鼠标活动,如点击。为了响应事件,服务器需要为其注册一个或多个事件监听器。由两种方法来注册一个事件监听器。一种是通过在标记语言中指定onXxx
32、属性。另一种方法是为你要监听的组件或页面调用addEventListener 方法。除了在浏览器端由客户活动触发的事件,一个应用程序可以使用org.zkoss.zk.ui.event.Events 类中的sendEvent 和postEvent 方法来触发事件。3.5.1桌面和事件处理如上所述,桌面是页面的集合,这些页面服务于同样的URL 请求。一个桌面当然是事件监听器能读取的范围。当一个事件被触发时,它就和桌面联系在一起。ZK 分离基于关联桌面及流水事件(pipelines events)分成单独的队列。因此,同一桌面的事件可以被顺序处理。另一方面,不同桌面的事件可以被并行处理。一个事件监听
33、器是被允许读取事件关联桌面内任何页面的任何组件的。它也被允许将一个组件从一个页面移到另一个页面,只要这些页面在同一桌面内。另一方面,它不能读取到其它桌面的组件。注: 开发人员可以在一个事件监听器中将一个组件从一个桌面卸载,然后在另外的事件监听器中将其添加到另外一个桌面。3.5.1.1 桌面及创建组件当一个组件在一个事件监听器中被创建时,它就自动被分配到被处理的事件相关联的桌面。即使组件不属于一个页面这种分配也会发生。这就意味着你在事件监听器中创建的任何组件可以用于监听正在处理的同一桌面。如果一个组件是在一个线程(thread)而不是任何事件监听器中创建的话,它就不属于任何桌面。在这种情况下,可
34、以将它添加到任何一个桌面,只要添加发生在一个合适的监听程序中。当然,一旦组件被添加到一个桌面,它就一直属于这个桌面。对于大多数应用程序而言,很少在线程(thread)而不是事件监听器中创建组件。然而,如果有一个长操作(long operation),你或许会在后台线程(background thread)中执行它。那么,你可以在后台准备一些组件树,然后在合适的事件被接收时将它们添加到桌面。关于此的详细信息,参看事件监听与处理一节的详细介绍。3.5.2 事件监听与处理3.5.2.1通过标记语言添加事件监听器添加一个事件监听器最简单的方法就是在一个ZUML 页面内声明一个属性。用来监听的属性的值是可以被BeanShell 解释的任何Java 代码。点击“say welcome”按钮,效果如下图所示:3.5.2.2通过程序添加或移除事件监听器有两种方法通过程序添加或移除事件监听器。第一种 声明一个成员当用你自己的类重定义(overriding)一个组件后,你可以声明一个成员函数成为事件监听器。在一个ZUML页面中,你可以使用u