作者: cleverpig
声明:文中引用的评论仅表示个人观点,供大家作为技术参考。
开篇言:
本文根据 BJUG maillist讨论整理,取自 Buffalo网站, 在此对Michael的贡献表示感谢!文中引用的评论仅表示个人观点,供大家作为技术参考。先敬佩Michael一个,能做到这样,Michael付出了 很多。下文简单比较一下Buffalo和DWR,两者的思路基本类似,有很多共性的东西。总的看来,Buffalo能满足基本的需要,但DWR已经在整体 系统结构上有了更多优势。框架的生命周期是有限的,如果不能与时俱进,将迟早面临被淘汰的局面。
版权声明:任何获得Matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:cleverpig; cleverpig
原文: [url]http://www.matrix.org.cn/resource/article/2006-10-18/Buffalo+DWR_4ebd1e01-5e90-11db-a5c2-7f23a8944cb0.html[/url]
关键字:buffalo,dwr,ajax,比较
一、两个Ajax框架:
Buffalo是 一个为java web项目而设计的轻量级AJAX框架。它是开源的(Apache License 2.0),其功能强大且易用。主要解决在j2ee ajax开发中的常见问题。它承诺为开发者和最终用户都能受益。最重要的Buffalo的作者Michael Chen是位中国开发者,他就生活在北京。
DWR是 一个Java开源库,帮助你实现Ajax网站。它可以让你在浏览器中的Javascript代码调用Web服务器上的Java,就像在Java代码就在浏 览器中一样。DWR会根据你的Java类动态的生成Javascript代码。这些代码的魔力是让你感觉整个Ajax调用都是在浏览器上发生的,但事实上 是服务器执行了这些代码,DWR负责数据的传递和转换。
二、共性:
支持Spring集成:均支持。
使用一个Servlet来接收所有的AJAX请求:
Buffalo使用ApplicationServlet<————>DWR使用DWRServlet。
使用XMLHttpRequest + JavaScript 传输数据:
Buffalo使用buffalo.js<————>DWR使用dwr.js & util.js。
在Java和Javascript之间转换数据:
Buffalo使用marshallingContext<————>DWR使用Converter。
协议:
Buffalo 在1.2.x之前采用burlap, Buffalo解析大数据量可能会比较慢,然而可以适用于多种服务器端和客户端,并且burlap协议的完整性和支持的数据类型更加丰富。2.0开始采用 自定义的基于xml的协议(来自burlap,做了更适合web的修改),并自行编写了解析器,性能更高。
DWR使用自定义的简单文本协议。
三、Buffalo特性:
1. 基于prototype:如果你的AJAX应用也是基于prototype,那么可以减少重复加载prototype的带宽,并且获得相当一致的编程概念。
2. Bind:提 供了对结果数据的处理,直接将数据绑定到页面对象并展示,这是一个动人的特性。(DWR在Util.js中也提供了一些方法来简化数据的展示,但不如 Buffalo做的更多。) 在2.0中,Bind能力更加强大,能够将值直接绑定到表单元素、表格、DIV/Span、甚至整个表单上。关键是这种绑定是无侵入并且与buffalo 整体结构完全整合,对外表现只有一个简单的buffalo.bindReply或者Buffalo.Bind.bind即可。http: //buffalo.sourceforge.net/binding.html有一些描述。
3. 序列化:Buffalo支持任意对象,任意深度,任意数据结构的java到javascript以及javascript到java的双向序列化。并且支持引用。这里有完整的协议说明。由于文档和演示不充分,很多人以为buffalo不支持任意对象了 ~
4. 生命周期对象访问:1.2.4之前需要继承一个BuffaloService,
从1.2.4开始就不需要继承了,引入了线程安全的BuffaloContext对象,只需要通过BuffaloContext.getContext()即可获得一个线程安全的引用,并且对Request的各种属性进行操作。更方便的是:
Map BuffaloContext.getContext.getSession()
Map BuffaloContext.getContext.getApplication()
Map BuffaloContext.getContext.getCookie()
即可获得session/application/cookie的Map,操作这些Map即可获得对这些生命周期的各种变量进行查询和更新。这个特性参考了webwork中ActionContext的设计。
5. 对Collection/Array的模糊处理:buffalo中提供了对Collection/Array对象的模糊识别能力。例如:服务器端有一个方法需要List参数,客户端传递过去一个javascript数组就可以了,不需要费心的组装对象。buffalo通过这些很细小的地方来提高程序员生产力。
6. 客户端组装对象:据报告DWR只支持简单数据类型作为参数在客户端传入。buffalo支持在客户端组装对象,甚至可以直接将整个表单序列化为一个对象作为参数传给远程客户端。DWR协议天生不足,这方面,我猜想它完全没有能力。
7. 对重载方法的处理能力:由于java与javascript之间类型的不匹配,DWR的代码生成无法对重载方法进行处理。例如,sum(double,double), sum(int, int) DWR很可能不知道你要调用哪一个。从2.0开始buffalo支持了对重载的处理。
四、DWR特性:
1. 支持Batch:可以将多个Service函数调用放在一个XMLHttpRequest请求中完成。
Michael Chen评论:我一直认为这不是一个好的实践。在客户端发起多个请求并获得响应除了获得编程的复杂外,还增加了服务器端设计service的自由度。这种 方式感觉上更鼓励为远程调用设计细粒度的服务、将组装逻辑放在客户端。这种设计风格我不太喜欢,因此batch也一直没有考虑实现,虽然实现不太麻烦。
2. Converter:可 以转换任意类型的Java对象到JavaScript,并允许直接使用。例如:Customer类包含一个address变量,当AjaxCall返回 Customer对象的时候,可以直接在Javascript中使用customer.address来获得Address的信息。
3. HttpServlet:支持在被调用的Service方法中获得HttpServletRequest和HttpServletResponse对象,这样可以访问当前Session中的数据。
4. 允许Expose部分函数和属性。(Buffalo无限制,可以访问Service中的任意函数。)
Michael Chen评论: 这个我也考虑过...DWR的代码生成机制使得它不得不通过这种方式减小些流量。Buffalo如果想实现这个特性也不是不行,只是我觉得,既然 Service辛辛苦苦实现了,还需要通过这种方式来让别人不能用么?况且buffalo没有代码生成,无论你暴露多少方法流量都是一样的。考虑到实际情 况,buffalo没有实现这个特性。
5. DWR2.0中提出了Reverse Ajax:提供在Java代码中来处理页面上元素的功能。
Michael Chen评论: 这个东东...也还是代码生成的trick...然而我的态度是javascript与java同样重要的,因此不会让代码生成类的东西破坏javascript的整体性。
五、相关资源:
在过去的两年间,baffalo的开发者拥有值得兴奋的积极反馈:buffalo非常适于在java web项目的ajax开发。为了帮助更多的用户更好地使用buffalo,他们期待你的帮助:发布文档、bug报告和bug修正等。
baffalo Maillist: [email][email protected][/email]
baffalo 论坛: [url]http://groups.google.com/group/amowa[/url]