1. Why ZK

JavaEE领域从来就不缺少Framework尤其是Web Framework,光是比较流行的就有:SpringMVC、Struts2、JSF系列……

其它不怎么流行的、小众的、非主流的全加起来估计上百,让人眼花缭乱。

那为什么还要去学习ZK这个知名度不高的框架呢?ZK官网关于Why ZK列出了很多特性:http://www.zkoss.org/whyzk/features

下面给出我最看重的ZK优于其他框架的独特优势:

  • 纯Java“端到端”Web解决方案
  • 提供丰富的页面组件和声明式的用户界面描述语言(ZUML)
  • 支持MVVM模式数据绑定
  • 支持自动化功能测试

虽然只有这几点,但是每一个都非常有价值,解决了我们多年以来开发Web应用过程中很头疼的几个问题,后面会分别展开介绍。

2. ZK总体架构

前面说到Web框架种类繁多,但是仔细研究发现它们可以分成以下3种类型:

  • 请求响应模型的MVC框架:struts1、webwork2、struts2、springmvc、apache wicket、grails、play
  • 事件模型的RIA组件框架:jsf系的n种实现、gwt系列(好几个分支)、vaddin、zk
  • REST风格架构:最近出现的一种新的架构风格,前端采用UI框架如Ext、JQueryUI、HTML5,后端REST服务框架(如SpringMVC)提供数据(json、xml)。

ZK属于第二种类型——事件模型的RIA组件框架,具体的,用ZK开发一个Web应用只要做两件事:

  • 用 ZK的UI组件搭建用户界面
  • 基于ZK框架处理用户界面上发生的事件

然后其它的事情就都由ZK搞定了,这就是所谓透明的AJAX;

2.1. AJAX处理流程

ZK应用处理一个典型客户端AJAX请求的完整过程如下:

  1. 用户的某个操作触发Client Event发送给Widget
  2. Event被Widget一路向上转发到了ZK Clent Engine
  3. Clent Engine发出AJAX Request给位于服务端的ZK Update Engine
  4. Update Engine通知ZK Component处理AJAX Request
  5. Component生成服务端Event发送到ZK Event Queue;
  6. ZK框架调用Event Listener处理Event;
  7. Event Listener执行业务逻辑,并更新Component状态 或 生成新的Event发送到Queue;
  8. Update Engine收集所有Component状态的修改并转换成指令集合返回客户端;
  9. Client Engine根据指令更新Widget状态;
  10. Widget更新DOM Tree改变用户界面;

上述十个步骤构成了一个AJAX请求的处理流程,用户在浏览器中的所有操作都是上述步骤的循环;

但是在这个循环开始前,还有一个环节——请求ZK页面:

  1. 浏览器请求一个页面URL
  2. ZK框架load对应的ZUL页面,并根据ZUL定义来创建和组装Components Tree
  3. ZK根据ZUL定义渲染HTML返回客户端;如果是第一次请求,还会连同Client Engine一起返回;
  4. Client Engine渲染页面创建DOM Tree,生成用户界面;
  5. 然后Client Engine就常驻浏览器中,处理用户操作产生的Event;

若干个ZUL页面就构成了一个完整的ZK应用。

2.2. ZUL与控制器

对于ZK应用开发人员来说,一个ZK应用就是由一组ZUL页面及其控制器组成的,

其中,ZUL负责以声明式方式定义页面(声明页面由哪些组件构成以及组件之间的关系——布局),控制器负责处理页面组件产生的各种事件;

ZUL与控制器之间的关联也是在ZUL中定义的,因此ZK有点像Web层的SpringFramework(XML定义Bean及其依赖关系,Bean封装服务);

ZK非常的灵活,既可以用ZUL(一种XML)声明式方式定义用户界面,也可以采用类似Swing的编程式方式,

前者定义包 含大量组件的复杂页面时非常简单,后者优势是灵活动态,

而且两种模式可以混合使用——用ZUL定义一个复杂页面的大框架,然后在控制器中填充或修改部分需特殊处理的UI;

3. ZK的优势

3.1. 纯Java“端到端”Web解决方案

3.1.1. 分工的代价

通常情况下,一个Web开发人员除了要掌握一种服务端技术(JavaEE、.Net、PHP或RoR)以外,还必须熟悉Html、CSS、JavaScript这三种技术才能独立完成一个Web应用,

因为缺少了上述任何一项技能,都无法开发出一个完整Web应用的哪怕很小的一个功能模块,或者做出的东西质量不合格(例如界面丑陋、交互性不好、浏览器兼容性不好等)。

同时精通上述所有技能的开发人员非常少而且昂贵,于是很多团队通过分工来解决这个问题——将开发人员进一步分成前端开发、后端开发,另外前端开发可能还依赖美工提供页面素材;

现代软件工程方法(尤其是敏捷开发和精益开发方法)提倡“全功能团队”,反对严格的分工,认为分工会带来高昂的沟通成本和集成成本、更容易出现生产力瓶颈、造成大量资源浪费;

关于全功能团队的更多内容见http://www.infoq.com/cn/articles/hk-build-full-function-team,本文不做过多论述。

总之,由于传统Web开发需要掌握的技术领域多达4种(而且每一个领域能包含很多内容,光JS就涉及N多框架和库),导致开发团队分工,进而严重影响开发效率。

3.1.2. 端到端的开发

相比之下ZK的优势十分明显——无需Html、CSS和JavaScript只用Java即可实现一个完整的Web应用,扔掉了前端和美工这两根“拐杖”,开发人员的生产力水平产生巨大提升,

再也不会出现那种“后端等前端前端等美工 或者 后端人不够前端美工没事做”的局面。

另外一个不容忽视的因素就是Java语言相对于JS语言的优势,Java语法严格、有编译器和IDE约束、便于调试、便于单元测试、可读性好,更适合大型团队和长期维护的项目!

ZK应用在客户端看来还是标准的Web应用——接受Http请求返回标准Html、CSS和Javascript,ZK只不过将这些Web底层技术细节对ZK应用开发人员屏蔽了,

ZK将Html、CSS和Javascript视为Web领域的汇编语言,将开发人员从Web技术细节中解放出来去更多的专注于实现业务逻辑。

3.2. 丰富的组件和声明式的用户界面

XML标签是描述复杂页面最简单直观也容易维护的方式,例如XHTML、JSP、FreeMarker等,

ZK屏蔽了HTML细节同时为开发人员提供了更高层面的抽象——页面组件,原本需要大量HTML标签绘制的页面,使用ZUL只需很少的ZK组件标签就可以定义出来。

另外ZUL标签语法简洁、严格,可读性和可维护性都比HTML更好。下面示例为一个表单页面的定义及其效果:

<window id="win" title="Car Inventory Editor" width="400px" border="normal"
apply="demo.getting_started.input.EditController">
<grid>
<rows>
<row>
Title:
<textbox id="titleTextbox" value="${win$composer.inventoryItem.title}"
constraint="no empty" />
</row>
<row>
Created Date (yyyy/MM/dd):
<datebox id="createdDatebox" value="${win$composer.inventoryItem.createdDate}"
format="yyyy/MM/dd" constraint="no empty" />
</row>
<row>
Bar Code:
<intbox id="barcodeIntbox" value="${win$composer.inventoryItem.barcode}"
format="000000" constraint="no empty,no negative" />
</row>
<row>
Unit Price:
<doublebox id="unitPriceDoublebox" value="${win$composer.inventoryItem.unitPrice}"
format=",###.#" constraint="no empty,no negative" />
</row>
<row>
Quantity:
<spinner id="quantitySpinner" value="${win$composer.inventoryItem.quantity}"
format=",###" constraint="no empty,min 0" />
</row>
<row>
Location (click location to edit):
<textbox id="locationTextbox" value="${win$composer.inventoryItem.location}"
inplace="true" />
</row>
</rows>
</grid>
<button id="submitButton" label="Submit" />
</window>

3.3. MVVM模式

MVVM模式是著名的MVC模式的改良,它进一步的降低了Controller与View的耦合——只有View依赖Controller,消除了Controller对View的依赖,

因为View发生变化的频率非常高,所以MVVM极大的减少了因页面需求变化导致的对Controller的不必要修改,提高了可维护性。

3.4. 自动化功能测试

Web应用的自动化功能测试一直没有理想的解决方案,Selenium之类的跨进程测试工具运行速度很慢,而且基于最终Html的测试脚本非常啰嗦脆弱而难以维护,

ZK附带的功能测试框架ZATS完美的解决了这一难题,ZATS针对ZUL进行本地调用的测试,运行速度飞快而且代码简洁容易维护。

3.5. 文档与社区

ZK有丰富的官方文档(http://www.zkoss.org/documentation#Small_Talks)和活跃的社区(http://forum.zkoss.org/questions/),

其在线演示站点(http://www.zkoss.org/zkdemo)也是极好的学习材料。

[置顶] ZK(The leading enterprise Ajax framework)入门指南的更多相关文章

  1. [置顶] ZK高级特性:Style定制与客户端集成

    1.ZK与传统MVC框架的集成 由于ZK应用本质上也是基于标准Web技术Servlet框架,因此与其它MVC框架的集成没有什么特别的, 以一个典型场景为例——为一个现有的Web项目(前端采用WebWo ...

  2. [置顶] hdu2815 扩展Baby step,Giant step入门

    题意:求满足a^x=b(mod n)的最小的整数x. 分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会 ...

  3. [置顶] CF 86D Powerful array 分块算法入门,n*sqrt(n)

    简介:分块算法主要是把区间划分成sqrt(n)块,从而降低暴力的复杂度, 其实这算是一种优化的暴力吧,复杂度O(n*sqrt(n)) 题意:给定一个数列:a[i]    (1<= i <= ...

  4. [置顶] Xamarin android如何调用百度地图入门示例(一)

    在Xamarin android如何调用百度地图呢? 首先我们要区分清楚,百度地图这是一个广泛的概念,很多刚刚接触这个名词"百度地图api",的确是泛泛而谈,我们来看一下百度地图的 ...

  5. [置顶] xamarin android toolbar(踩坑完全入门详解)

    网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费.如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到 ...

  6. jQuery实现表格行上移下移和置顶

    jQuery实现表格行上移下移和置顶 我们在操作列表数据的时候,需要将数据行排列顺序进行调整,如上移和下移行,将行数据置顶等,这些操作都可以在前端通过点击按钮来完成,并且伴随着简单的动态效果,轻松实现 ...

  7. WordPress 一键置顶文章(推荐用SM Sticky Clicky Star)

    在 WordPress入门 之 发布新文章和管理文章 中,倡萌已经简单提到可以在文章编辑界面或者快速编辑界面设置置顶文章,但是如果你想在后台文章列表中添加一键置顶文章的功能,不妨试试 Quick St ...

  8. 在UWP中页面滑动导航栏置顶

    最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...

  9. WinFrom窗体始终置顶

    调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...

随机推荐

  1. win7 wifi 无Internet訪问权限或者有限的訪问权限

    自己家的无线路由器,手机和笔记本都使用正常,可是一台新笔记本连上之后总是提示"有限的訪问权限",无法连公网. 网上的非常多办法都无论用,什么设置静态IP或者重新启动路由,基本都是瞎 ...

  2. Java泛型和集合之泛型VS模板

    Java的泛型很像C++中的模板,说到Java 泛型和C++中的模板的关系时,有两个重要的方面需要被考虑到:语法和语义.语法看起来是相似的,可是语义却明显是不同的. 在语法上讲,选择尖括号  是因为他 ...

  3. CSS学习笔记之元素分类

    在讲解CSS布局之前,我们需要提前知道一些知识,在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div> ...

  4. 处理程序“svc-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 解决办法:以管理员运行命令:C: ...

  5. QTP使用技巧

    1QTP基本功能的使用 QTP的基本功能包括两大部分:一部分是提供给初级用户使用的关键字视图:另一部分是提供给熟悉VBScript脚本编写的自动化测试工程师使用的专家视图.但是,并没有严格的区分,在实 ...

  6. Android最新支持包Design简介

    Android 5.0 Lollipop是曾经最著名的Android发布之一,这样说很大一部分原因是材料设计的引入,而材料设计则是一种刷新了整个Android体验的设计语言.这个详细说明是开始适应材料 ...

  7. Android开发Tips-1

    打算记录一些自己在开发过程中遇到的一些技巧性代码,方便以后遇到相似功能时能够快速的找到,那就从这里开始吧. 1,如何截取当前屏幕(不包括当前Activity的Title)并分享: a,获取当前Acti ...

  8. Jenkins中关于一些插件的使用方法

    最近在为公司搭建CI平台过程中,以及在具体项目实施过程中使用过的一些插件的具体用法: 1. ant插件 这个插件可能是我们最为经常使用的,若构建脚本是使用build.xml的,那构建引擎肯定会选择an ...

  9. Jquery Validate 表单验证的多种方式

    ASP.NET MVC Jquery Validate 表单验证的多种方式 在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体 ...

  10. .NET代码自动编译发布

    .NET代码自动编译发布   因本人一直使用.NET开发,在做项目的时候,每次都要涉及到各个环境的部署问题,手工操作容易出错,并且重复劳动多,所以一直在寻找一个能实现自动化部署的方案. 废话不多讲,先 ...