为什么有框架?
使用现成的Ajax框架,从而使得Ajax开发变得相对简单了。通过使用框架,你不用再做Ajax开发平常的一些烦琐任务,这样就能把重点集中在业务逻辑上,而不是Ajax的细节上。
基于浏览器的应用框架一般分为两种:
·Aplicationframeworks:提供了浏览器功能,但其最著名的还是在于通过窗口生成组件建立桌面GUI。
·Infrastructuralframeworks:提供基本的框架功能和轻便式浏览器端操作,让开发者去创建具体应用,主要功能包括:
·基于XMLHttpRequest组件的浏览器交互功能
·XML解析和操作功能
·根据XMLHttpRequest的返回信息进行相应的DOM操作
·一些特殊情况下,和其他的浏览器端技术如Flash(或JavaApplets)等集合到一起应用
基于服务器端的应用框架通常以下面两种方式工作(尽管它们根据不同的语言进行了分类)
·HTML/JSGeneration(HTML/JS生成):通过服务器端生成HTML和JS代码在传递给浏览器端进行直接运行
·远程交互:JavaScript调用服务器端函数(例如调用Java函数)并返回给JavaScript的回调句柄,或者请求服务器端数据信息,例如Session信息,数据库查询等。
常见框架
常见的AJAX框架有:
·DWR-WebRemoting
·Buffalo-WebRemoting(basedonprototype)
·prototype-JSOOlibrary
·openrico-JSUIcomponent(basedonprototype)
·dojo-JSlibraryandUIcomponent
·qooxdoo-JSUIcomponent(C/SStyle)
·YUL-JSUIcomponent
下面对这些框架做一个概述:
DWR:使用自定义的简单文本协议,而Buffalo使用burlap协议。因此Buffalo解析大数据量可能会比较慢,然而可以适用于多种服务器端和客户端,并且burlap协议的完整性和支持的数据类型更加丰富。
Buffalo:基于prototype,如果你的AJAX应用也是基于prototype,那么可以减少重复加载prototype的带宽,并且获得相当一致的编程概念。
prototype:是一个非常优雅的JS库,定义了JS的面向对象扩展,DOM操作API,事件等等,之上还有rico/script.aculo.us实现一些JS组件功能和效果(不过目前还不是很完善),以prototype为核心,形成了一个外围的各种各样的JS扩展库,是相当有前途的JS底层框架,值得推荐,prototype以及rico/script.aculo.us的一个特出特点就是非常易学易用,门槛很低,常常是一两行JS代码就可以搞定一个相关的功能。同时它也是RoR集成的AJAXJS库。
qooxdoo:是一个功能很强的JS组件库,完全模仿Windows操作系统的GUI组件。特点是不通过常规的HTML来构造页面,完全使用JS以类似VB/Delphi风格的编程方式构造WebGUI界面,比较适合内网面向C/S风格的web应用,,而不适合面向Internet的界面多变风格的应用。qooxdoo的一个重大卖点在于qooxdoo将要提供一个FormDesigner的IDE,通过在IDE里面的可视化拖拽设计方式来自动生成C/S风格的web页面js代码。qooxdoo缺点是JS文件体积过大,超过200KB,初次下载会比较慢,而且并不适合Internet消费类网站。
dojo:是一个各个方面相当完善的JS库,包括了JS本身的语言扩展,以及各个方面的工具类库,和比较完善的UI组件库,也被广泛应用在很多项目中,他的UI组件的特点是通过给html标签增加tag的方式进行扩展,而不是通过写JS来生成,dojo的API模仿Java类库的组织方式。dojo的优点就是库相当完善,发展时间也比较长,缺点是文件体积也比较大,200多KB,初次下载相当慢,此外,dojo的类库使用显得不是那么易用,至少给我的感觉是相当笨拙,特别是和prototype相比,更加显得难用。
YUL:是Yahoo新近发布的AJAX组件库,也是一个包含了各个方面,从工具类库到通讯,到UI组件的综合性JS库。YUL的优势在于文档非常齐全,而且有Yahoo的支持,缺点是库目前还是不是很全,功能也不强大。
GWT:Google发布GoogleWebToolkit。GoogleWebToolkit是一个开放版本的AJAXFramework,通过它用户可以构建像GoogleMaps和Gmail之类的Web应用程序。这个GoogleWebToolkitbeta是免费的,它是一个基于java的工具,并能够和任何java开发工具协同工作。
GWT已经加入到Google的代码库当中,这个代码库包含了很多API和开发工具。Google产品经理BretTaylor表示,当用户把应用程序部署到产品当中时,GWT编译器只要简单的把用户的java应用程序转换成浏览器支持的JavaScript和HTML就行。
Atlas:微软的Ajax,微软致力于简化Ajax风格Web应用的开发,并提供丰富的、可交互的和个性化的用户体验。开发者可以对客户端脚本不甚了解;但他们可以很容易地开发和调试这种应用程序。
出于这一目的,微软启动了一个新的项目,研发代号“Atlas”。Atlas为开发这带来了如下特性:
·Atlas客户端脚本框架
·Atlas的ASP.NET服务器控件
·ASP.NETWebServices集成
·Atlas的ASP.NET构建块
·客户端构建块服务
jsLINB--国人的一个完整Ajax/web2.0技术框架,LINB(LazyINternetandBrowser)是一个面向程序编写者的软件架构。它的目的是让程序编写者在对软件的全局了如指掌的基础上,实现更目标驱动的、任务清晰的、高效的软件应用。LINB是平台无关的架构,兼容C/S、B/S、RIA和Web2.0等等。
特性 |
Buffalo |
DWR |
支持Spring集成 |
支持 |
支持 |
使用一个Servlet来接收所有的AJAX请求 |
ApplicationServlet |
DWRServlet |
使用XMLHttpRequest+JavaScript传输数据 |
buffalo.js |
dwr.js&util.js |
在Java和Javascript之间转换数据 |
marshallingContext |
Converter |
协议 |
1.2.x之前采用burlap,。2.0开始采用自定义的基于xml的协议(来自burlap) |
使用自定义的简单文本协议 |
生命周期对象访问 |
BuffaloContext.getContext() |
WebContextFactory.get() |
Buffalo特性:
·
基于prototype,如果你的AJAX应用也是基于prototype,那么可以减少重复加载prototype的带宽,并且获得相当一致的编程概念
·
Bind:提供了对结果数据的处理,直接将数据绑定到页面对象并展示,这是一个动人的特性。(DWR在Util.js中也提供了一些方法来简化数据的展示,但不如Buffalo做的更多。)在2.0中,Bind能力更加强大,能够将值直接绑定到表单元素、表格、DIV/Span、甚至整个表单上。关键是这种绑定是无侵入并且与buffalo整体结构完全整合,对外表现只有一个简单的{{buffalo.bindReply}}或者{{Buffalo.Bind.bind}}即可。http://buffalo.sourceforge.net/binding.html有一些描述。
·
序列化:Buffalo支持任意对象,任意深度,任意数据结构的java到javascript以及javascript到java的双向序列化。并且支持引用。
这里有完整的协议说明。由于文档和演示不充分,很多人以为buffalo不支持任意对象了
·
生命周期对象访问:引入了线程安全的BuffaloContext对象,只需要通过BuffaloContext.getContext()即可获得一个线程安全的引用,并且对Request的各种属性进行操作。更方便的是:
MapBuffaloContext.getContext().getSession()
MapBuffaloContext.getContext().getApplication()
MapBuffaloContext.getContext().getCookie()
即可获得session/application/cookie的Map,操作这些Map即可获得对这些生命周期的各种变量进行查询和更新。这个特性参考了webwork中ActionContext的设计
·
对Collection/Array的模糊处理:buffalo中提供了对Collection/Array对象的模糊识别能力。例如:服务器端有一个方法需要List参数,客户端传递过去一个javascript数组就可以了,不需要费心的组装对象。buffalo通过这些很细小的地方来提高程序员生产力。
·
客户端组装对象:buffalo支持在客户端组装对象,甚至可以直接将整个表单序列化为一个对象作为参数传给远程客户端。
·
对重载方法的处理能力:由于java与javascript之间类型的不匹配,DWR的代码生成无法对重载方法进行处理。
例如,sum(double,double),sum(int,int)。