ZK开发手册chanson制作第1页共265页ZK开发手册版权©2007PotixCorporation.Allrightsreserved.Version3.0.0本文档内容均来自整理人:chanson北京马甸2008-2-21ZK开发手册chanson制作第2页共265页1.简介1.1.传统的Web应用程序以交换文档简单高效为目标,Web技术,超文本传输协议(HTTP)和超文本标记语言(HTML),都来源于单页性(page-based)和无状态(stateless-communication)的模式。在这种模式中,一个页面是自给自足(self-contained)的,并且是沟通客户端与服务器端的昀小单位。随着网络俨然成为应用开发的默认平台,这种模式面临着巨大的挑战:对于表现当今应用程序中复杂性的无能为力。举个例子,为了给客户报价,你或许必须打开另一个页面来查询此客户的交易记录,再打开一个页面来显示当前的价格,还得开一个页面来存储当前信息。用户被迫离开他正在工作的页面,并且在几个页面间来回浏览。这很容易迷失,混淆,结果是把客户弄得不愉快,销售机会的损失和低生产力。在这种单页性(page-based)的模式上开发一个现代的应用程序也是一个极大的挑战。在这种模式中,运行在服务器上的应用程序必须处理来自从语法上分析请求,送出回应,连接用户从一个页面到另一个页面路由的一切,并且处理用户的各种错误。数十种框架,例如Struct,Tapestry和JSF,随即出现用来简化开发过程。由于单页性(page-based)模式与现代模式之间的巨大差别,学习和使用这些框架并不是一个愉快的过程,更不要提直觉感知(intuition)和简化了。ZK开发手册chanson制作第3页共265页1.2.点对点(Ad-hoc)AJAX应用经过数十年的演变,Web应用已经从静态HTML发展到动态HTML,applets,Flash,昀后发展到了AJAX[1](AsynchronousJavaScriptandXML,非同步的JavaScript和XML)。通过谷歌地图及推荐(GoogleMapsandSuggest)的说明,AJAX技术通过提供与桌面应用程序同等水平的互动性和反应能力给Web应用带来了新生命。不同于applets或Flash,AJAX基于标准的浏览器和JavaScript,并且不需要专门的插件。AJAX是新一代的DHTML,就像DHTML,它在很大程度上依赖于JavaScript监听用户活动产生的事件,然后动态的操纵浏览器中一个页面(aka.DOM)的视觉表现。此外,它更近一步,能够使与服务器的沟通异步进行,即不需要离开或提交整个页面。它通过引入客户与服务器间轻量级的通信(light-weightcommunication)打破了基于页面的模式。妥善设计,AJAX可以给Web应用带来丰富的桌面通用组件,而且这些组件的内容可以在应用程序的控制下动态更新。当提供给用户需要的交互性的同时,AJAX给已经很昂贵的Web应用程序开发增加了复杂性和技术先决条件。开发者不得不在浏览器中操纵DOM,并且使用不兼容甚至是错误的JavaScript与服务器通信,为了更好的交互性,开发者必须重复复制应用数据和业务逻辑以便于浏览。这样就增加了维护成本及同步数据的挑战。底线是在关于处理请求方面,点对点(Ad-hoc)的AJAX应用与传统的Web应用没有区别。开发者仍然必须解决由单页性(page-based)和无状态(stateless-communication)模式造成的隔阂。[1]Ajax是由JesseJamesGarrett於Ajax:ANewApproachtoWebApplications中所提出的。ZK开发手册chanson制作第4页共265页1.3.ZK:它是什么ZK是一个事件驱动(event-driven)的,基于组件(component-based)的,用以丰富网络程序中用户界面的框架。ZK包括一个基于AJAX事件驱动的引擎(engine),一套丰富的XUL和XHTML,以及一种被称为ZUML(ZKUserInterfaceMarkupLanguage,ZK用户界面标记语言)的标记语言。有了ZK,您可以利用XUL和XHTML的丰富特性来呈现您的Web应用,操纵它们来处理因用户活动而引发的事件,就像您使用多年的桌面应用程序那样。不同于大多数其它框架,ZK是一种幕后(behind-the-scene)技术,组件内容的同步和流水线事件(pipeliningofevents)都由ZK引擎自动完成。您的用户获得了如同桌面程序的互动性和反应能力,而您的开发仍然像开发桌面应用程序那样简单。除了简单的模型和丰富的组件,ZK也支持一种文本标记语言,称为ZUML。ZUML,如同HTML,可以让开发人员设计界面而无需编程。通过XML的命名空间,ZUML无缝的集成了一套不同的标签[2]到同一页面。目前,ZUML支持两套标签,即XUL和HTML。为了方便快速模型开发(prototyping)和定制,ZK允许开发人员嵌入EL表达式,以及您喜欢的脚本语言,包括但不限于Java[3],JavaScript[4],Ruby[5]andGroovy[6].开发人员可以选择不嵌入任何脚本语言,如果他们喜欢更严格的要求(discipline)。不同于JavaScript嵌入在HTML,ZK在服务器端执行所有的嵌入脚本。注意我们所说的一切运行在服务器端是从应用程序开发者的角度出发的。对于组件开发人员来说,他们必须平衡互动性与简单性来决定什么任务由浏览器来完成,而什么任务由服务器来完成。[2]标签是XML元素。组件是在当ZUML网页被翻译时所产生出来的。[3]使用BeanShell()的Javainterpreter。[4]使用Rhino()的JavaScriptinterpreter。[5]使用JRuby()的Rubyinterpreter。[6]使用Groovy()的Groovyinterpreter。ZK开发手册chanson制作第5页共265页1.4.ZK:它不是什么ZK并没有关注持久化(persistence)或伺服务器之间的沟通(inter-servercommunication)。ZK被设计的尽可能的简单,它只针对表示层(presentationtier)。他并不要求和暗示任何后端技术,所有你喜欢的中间件就像以前一样工作,如JDBC,Hibernate,JavaMail,EJB或JMS。Zk并没有为开发人员提供(tunnel),RMI或其他的API用来在客户端与服务器端通信,因为所有的代码都运行在同一服务器的同一Java虚拟机(JVM)上。ZK并没有强迫开发人员使用MVC或其他设计模式。是否使用它们由开发人员选择。ZK并不是旨在把XUL带入Web应用的框架。它的目标是把桌面编程模式引入Web应用。目前,它只支持XUL和XHTML。将来它或许会支持XAML,Xquery及其它。ZK将AJAX嵌入到了现今的应用中(implementation),但它并没有止步于AJAX结束的地方。在即将来临的ZKMobile中,您的应用程序可以到达支持J2ME的任何设备,例如PDA,手机和游戏平台。此外,您根本不用修改您的应用程序[7]。[7]根据萤幕大小有时需要做调整。1.5.ZK:局限ZK不适合在客户端运行多任务的应用程序,例如3D动作游戏,除非你写编写一个特殊的组件。ZK也不适合需要大量使用客户端计算能力的应用程序。2.让我们开始吧这一章的内容描述了如何写出你的第一个ZUML页面,如果你没时间的话建议你至少阅读这一章。此章使用ZUL来说明ZK的功能,但是也适合于其他ZK支持的语言。2.1.HelloWorld当ZK安装到你昀喜爱的Web服务器[8]后,你就可以直接编写应用程序。仅需在合适的目录新建一个名为hello.zul的文件[9]。windowtitle=Helloborder=normalZK开发手册chanson制作第6页共265页HelloWorld!/window然后输入正确的URL,例如:,得到如下页面:在ZUML页面中,一个XML元素描述了应该创建。在这个例子中,被创建的是window(org.zkoss.zul.Window),XML属性(attributes)用来指定window组件属性(properties)的值。在这个例子中,创建了window,并指定了title和border属性的值分别为'Hello'和'normal'。XML元素内的文本(即HelloWorld)也可以通过一个称为Label(org.zkoss.zul.Label)的标签来展示。所以上面的例子和下面的例子是等价的:windowtitle=Helloborder=normallabelvalue=HelloWorld!//window也等价于:windowtitle=Helloborder=normallabelvalue=HelloWorld!/label/window[8]参考QuickStartGuide。[9]你也可以试试这些例子的在线示范。2.2.互动性让我们来添加一些互动元素:windowtitle=Helloborder=normalbuttonlabel=SayHelloonClick=alert("HelloWorld!")//window点击按钮,可以看到如下效果:ZK开发手册chanson制作第7页共265页onClick是为组件添加事件监听器的一个特殊属性。这个属性的值可以是任何合法的Java代码。注意我们使用"来匹配双引号(“)以使其成为合法的XML文档。如果你不熟悉XML,可以在ZK用户接口标记语言(ZKUserInterfaceMarkupLanguage)一章中查看有关XML的部分。alert是一个显示消息对话框的全局函数。它是调用org.zkoss.zul.Messagebox类的一个捷径。buttonlabel=SayHelloonClick=Messagebox.show("HelloWorld!")/[注]:1.嵌入到ZUML页面的脚本可以用不同的语言编写,包括但不限于Java,JavaScript,RubyandGroovy。此外,它们是运行在服务器上的。2.在运行时刻,ZK使用BeanShell解释Java,所以你可以声明全局函数,例如alert。同样它为大部分的脚本语言提供了一个简单的方式来定义全局函数,有时甚至是类。3.在ZUML页面嵌入脚本语言前,所有java.lang,java.util,org.zkoss.zk.ui,org.zkoss.zk.ui.event和org.zkoss.zul包中的类都已经被引入。2.3.zscript元素zscript是一个用来定义代码的元素,当ZUML页面被提交时被赋值(evaluated)。典型的应用包括初始化和申明全局变量与方法。[注]:你不可以在zscript代码中使用EL表达式。例如,下面的例子展示了每次按钮被按下时显示的不同信息。ZK开发手册chanson制作第8页共265页windowtitle=Helloborder=normalbuttonlabel=SayHelloonClick=sayHello()/zscriptintcount=0;voidsayHello(){//declareaglobalfunctionalert(HelloWor