Archive for the ‘Amowa’ Category

buffalo 2.0 最终版正式发布

Tuesday, April 24th, 2007

[Update] InfoQ中文报道:
http://www.infoq.com/cn/news/2007/04/ajax-framework-buffalo2

从2.0-alpha1发布至今,经过长达半年多的测试阶段,buffalo 2.0正式版本发布。2.0最大的关注点在于性能的提升和完全自行实现的java到javascript协议转换。根据评测,2.0版本要比前一阶段版本最高提升30%性能。这得益于新的协议实现以及为大规模AJAX调用而进行的优化。

对于一直使用alpha版本的用户,此次升级很简单,只需要将相应的jar和js进行替换即可。从1.2.x版本升级的用户,升级也很简单:

* 删除所有burlap*.jar, buffalo*.jar, 替换为buffalo.jar
* 替换新的buffalo.js
* 将继承自BuffaloService的类,对session等信息的使用替换为对RequestContext.getContext().getXXX的使用。(注意,目前有开发者报告在resin 2.1服务器上偶尔会出现丢session的现象)

2.0正式版本的发布意味着完全自我独立的协议实现,为后续特性的开发打下了基础。

继续感谢:一直使用、提出Bug以及解决办法、在论坛帮助他人的朋友们,没有你们,buffalo无法走到今天。

buffalo 2.0-alpha1 released

Sunday, October 8th, 2006

没什么可说的了,从2005年4月至今,buffalo走过了1.0, 1.1, 1.2到现在的2.0

最大的改变是彻底抛弃了burlap,新的协议以及实现完全重新编写(相当于一个定制的xml pull parser)速度相当快,几乎接近于纯文本的处理速度。另外的改变是为了适应项目国际化以及更好的代码环境,buffalo从java.net迁移到了sourceforge,并且使用maven作为项目管理工具。另外,修复了若干bug。

完整的特征列表如下:

* 支持方法重载
* 重新实现协议,更好的解析和缓存,效率比1.2.x系列提升30%
* onTimeout和onException事件支持
* 更友好的错误信息显示
* 代码库迁移到sourceforge,采用subversion
* 采用maven管理项目

下载地址:

* http://buffalo.sourceforge.net
* 下载2.0alpha1

这个版本的推出主要是为了检验新的协议解析器,有任何问题请到buffalo论坛进行讨论。2.0正式版的发布将主要取决与文档的完善情况。

Buffalo 2 vs Buffalo 1: +30% performance

Monday, October 2nd, 2006

buffalo benchmark

说明:测试机器配置:笔记本Pentium M 2.0G, 2G内存。第一列是循环调用次数;Request / Second是每秒能够处理的请求数(吞吐量)。由于新的实现加入了众多缓存,因此在小数量调用时不能体现优势,但真正在高并发请求的场景中,2要比1.2提高30%的性能。在运行Demo应用时,明显感觉速度有所提高

buffalo2.0的发布时间还没有确定,需要试验的请通过cvs获取。另外,我很想与DWR的处理速度进行一个对比,但仔细看了DWR代码,代码写的与servlet api太紧,很难单独抽出来进行测试。哪位有相关数据的请给我帮助。

正本清源:所谓Ajax输出的三种形式

Thursday, December 29th, 2005

QuirksBlog: The AJAX response: XML, HTML, or JSON?

说实话,我没想到Bing Ran会问我这个问题。早先这篇文章在TSS上贴出的时候,我很快的浏览,便一眼看出这篇文章作者所处的角度。事实上,AJAX概念的不完整和不严密性 ——异步的JavaScript + XML——导致作者将AJAX的输出分为三种类型:XML, HTML片断和JSON对象字符串。

首先看XML。对于RPC的数据传输,XML从来都是当仁不二的选择。对于将对象序列化为XML字符串的方式,往往有两种选择,一种是将对象本身的属性作为节点进行输出,一种是利用语言的元数据特性进行序列化输出。两者存在较大不同。对于第一种,输出案例如下:

[xml]

O’Reilly David Flanagan

Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

Friends of Ed Jeremy Keith

Praesent et diam a ligula facilisis venenatis.


[/xml]

而对于第二种,输出案例如下:

[xml]

java.util.List

yourapp.domain.Book
title
JavaScript, the Definitive Guide
publisher
O’Reilly
author
David Flanagan
cover
/images/cover_defguide.jpg
blurb
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
yourapp.domain.Book
title
DOM Scripting
publisher
Friends of Ed
author
Jeremy Keith
cover
/images/cover_domscripting.jpg
blurb
Praesent et diam a ligula facilisis venenatis.
[/xml]

前 一种一般来说是同一进程内(同一JVM内)对对象进行序列化和反序列化的方法,在XML-Java绑定一类的框架中比较多见,例如 XStream, JiBX, Castor等等。当同一进程内能够找到对象具备的正确类型时,这种序列化/反序列化设计和实现都不太困难,而且针对空值处理也比较容易。

可以看出,由于这种方式成本较低,有大量成熟的开源库可用,加上在AJAX中的X(ML)的“理论”指导下,许多开发者采用这种方式将对象输出给前 台浏览器,然后利用浏览器的XML能力进行输出显示。从那篇文章中可以看出,这种工作是纯粹的dirty work, 并且由于领域模型或者DTO的不同,输出的xml结构含义也不同,在对空值的处理上更是麻烦,在处理显示逻辑的时候,基本上很难在客户端对以这种方式传递 的XML以一种统一的方式进行还原。以这种方式来进行AJAX开发,小规模应用还不能显出弊端,但是大规模应用出现,领域对象较多时,必然出现怨言。而我 们使用AJAX的真实意图并非来无趣地去解析各种各样的XML,而是需要XML中代表的数据。至于XML是什么样子,除了调试阶段,没有人会关心。

第二种XML的序列化方式是绝大多数跨进程远程调用协议/框架所采取的方式。SOAP/WebService如此,XMLRPC如此, Buffalo采用的Burlap也如此。这种远程调用的特征是,在协议约定的条件下,调用方和被调用方需要保证数据语义的完整性。拿什么保证?就是数据 定义信息了。这些协议的共同特征是采用谋一些标记来描述数据类型:int, long, float, string, list…这样定义完成后,只要根据协议,任何语言都能以一种通用的方式对数据进行还原。AJAX引擎的概念也就渐渐呈现——通过某一种协议,他就处 于中间的位置,负责将调用方的请求包装为协议,转化为执行方能够理解的动作加以执行;然后将执行结果转化为协议的值,传递给客户端,客户端引擎将协议内容 解析为能够理解的对象结构传递给客户端,然后就可以利用这个数据来显示了。XML-RPC如此,WebService如此,DWR如此,JSON如此, Buffalo也如此。

综上所述,纯粹使用领域模型特定的输出XML传递给客户端是一种相当原始的做法。他只在很低的层次上印证了所谓AJAX的概念。然而,这种概念的深入思维结果便是一个AJAX引擎。

文中提到的第二种输出方式:HTML——应该被看作WEB的一个特例,应该说这是历史因素、浏览器能力、设计者等多方因素达到的一个平衡。许多历史 应用中,大多采用将页面进行一定规则的分割,然后include或者jsp 2.0 tagfile的方式对公共区域进行处理,留下一小部分进行动态显示。这里举一个例子:查询,显示书籍列表。传统做法就是上面一个搜索条件输入文本框,下 面是搜索结果列表,处于同一个页面。原来的搜索方式每次提交都要刷新整个页面,用户体验不太好,现在需要改进。按照激进的Ajax做法应该是当搜索按钮点 击时,调用bookSearchService.search(String terms)的方法,取得结果列表,然后Ajax引擎处理结果数据,将数据反序列化为javascript对象,开发者利用这些对象,要么利用DOM, 要么利用JavaScript Template, 在页面对搜索结果进行展示。然而,问题出现了:

搜索结果太多了,用DOM操作速度太慢;
开发者人手不够,没有时间,而这个页面以前写过;

那么出现这种情况时,很可能的做法便是,见原来那个搜索结果页面刨去其他不相干的部分,留下搜索结果部分,然后利用一个resultDiv.innerHTML=xmlhttp.responseText搞定。这样做,既达到了改善体验的效果,也提高了开发速度。

输出HTML另外一种方式文中也没有提及。事实上,HTML不仅仅作为片断,更重要的是作为页面视图的一部分。在buffalo的demo中,可以 看到所有的页面都被管理起来了,buffalo接管了视图的切换;这种设计也存在于gmail/163新版邮箱中。这个应用比上面的HTML片断的使用方 式还要重要,因为这里是缓存可以介入的地方。通过不同的缓存策略,可以将用户的实际和心理等待时间大大减少,从而进一步改善用户操作体验,提升产品竞争 力。(PS. 在Buffalo 1.3中将加入客户端缓存模块,无需你动手,buffalo为你缓存视图)

文中提及的第三种方式,JSON,根据第一部分的描述,应该比较清楚了。实际上他扮演了一个Ajax引擎的角色。这里不得不提的是,使用JSON的 相当危险的。因为他的协议表现与语言本身绑定太死。如果某一天,JSON协议变化了,那么使用JSON的应用基本上不可能应对这个变化——因为返回结果是 eval()得到的。而Buffalo将协议隐藏起来了,1.2版本甚至连服务器端的ServiceInvoker都将burlap实现依赖隔离开。现在 使用burlap,也许某一天不用了,buffalo的应用照样可以运行。因为里面的细节都是透明的,作为开发者,你只需要关注数据对象本身,而非用来描 述对象的那一堆字符。

Ajax/Amowa框架Buffalo 1.2发布!

Tuesday, December 27th, 2005

经过长时间的工作和buffalo社区的支持,buffalo ajax/amowa framework 1.2发布。新版本包含了经过改进激动人心的Spring集成,Prototype集成,以及浏览器前进后退的支持。主要的新特性如下:

  • * 支持浏览器前进后退(这个特性几乎可以在小型应用中替换MVC)
  • * 重写了整个服务调用模块
  • * 重写了Spring集成代码,集成Spring更加容易
  • * 重写了burlap的依赖,移除了特定版本的burlap-fix.jar。无需任何变动,现在可以在resin app server中使用buffalo了。

Buffalo Ajax/Amowa Framework是一个全新的远程调用/Web框架。他可以向JSON/DWR一样,被应用为一个web远程调用框架,简化web客户端与服务器端的调用(buffalo的API更加简单!);也可以在小型应用中承担页面切换的任务,基于OPOA的概念,让buffalo为你管理页面切换;在大型应用中,buffalo也可以在其中承担页面无刷新获取数据的工作。Buffalo binding组件能够一致性地将数据绑定到html组件上,也可以绑定到JavaScript Template的模版上。目前已经有若干真正的商业应用在不同层面应用了buffalo。在这个版本中,buffalo提供了全面的文档,丰富的发行包,成熟的Demo,buffalo已经为企业应用作了充分的准备。

Buffalo站点:http://www.amowa.net/buffalo/
演示:http://demo.amowa.net/buffalo-demo/index.jsp
下载:http://www.amowa.net/buffalo/index.html?page=download

为什么我不公布buffalo roadmap

Friday, November 18th, 2005

江南白衣-拾豆豆 说:
恭喜恭喜,开源软件能坚持做下来的在中国不多阿
Michael – Buffalo 1.2alpha1发布 说:
是啊
江南白衣-拾豆豆 说:
下一站 Page Framework 的roadmap哪里能看到?
Michael – Buffalo 1.2alpha1发布 说:
不敢发布,怕伤害等待的人……

这是真的。毕竟国内做开源能坚持下来的,太少了。我们有很多的热情、创意与想法在一瞬间爆发,做成开源项目,在还没有来得及热起来的时候就迅速的冷却下去。scud:你今天框架了吗?描述了这样一种现状。管理课上,我学到了张瑞敏的一句话:把简单的事情做好就是不简单,把平凡的事情做好就是不平凡。显然,所有的项目刚出来的时候都是新的,随着进展,琐碎的事情越来越多,也就有越来越多的理由与借口来放弃这个项目。我看到很多的优秀的项目都不断的诞生与消亡,归根结底,我宁愿相信,这是一个态度问题,而并非技术问题。

我不知道buffalo最后会怎样,但是从目前得到的评价,基本上正面的居多:发给java.net,他们说very interesting, 并且随时欢迎加入他们的community, 然而由于不能提供svn服务,只得作罢;Shane也表示,当buffalo代码复杂度达到一定规模的时候可以帮助将项目放到codehaus。同时Buffalo论坛上也有一群热心的朋友帮助使用测试评估。这些都是莫大的鼓舞。从行业趋势来说,用户体验、Web2.0, Ajax无疑是今年最hot的词。有理由相信,buffalo能够在若干方面真正对用户与程序员都具备益处。

然而buffalo现在还很小,我很忙。buffalo现在的核心功能只是一个web远程调用并且java/javascript双向透明序列化的library, 谈不上framework. buffalo还缺少大量的文档来帮助开发者迅速起步。将来要添加的page module, component module, validation module, 等等,还有很多工作要做。然而我还要为付给我薪水的雇主工作,并且加班,甚至某些周末;每天回到家里我也会累,也会不想动。谁知道在这样一种状况下,发布一个roadmap, 然后引来若干期待,会不会最后因为承诺没有兑现而死得毫无尊严呢?Roadmap其实发布过,不过都是在小范围内:buffalo的论坛(后来被迅速的删掉),BJUG聚会的白板上,以及发给nemo的邮件。

不怕慢,只怕站,buffalo会一直走下去。

buffalo 1.2alpha1 released

Wednesday, November 16th, 2005

buffalo 1.2alpha1 发布,包含如下特性:

  • * integrate prototype
  • * refactor and rewrite whole code into prototype-like.
  • * split javascript source into 4 parts: core, call, reply, bind
  • * modify build.xml, concat the 4 parts into one js in the dist target.
  • * modify the event system, change to buffalo.events["onLoading"]…
  • * some bugfix
  • * 全部演示页面翻译为英文(以后发布版本的主要语言),多谢清风

下载地址:
http://www.amowa.net/buffalo/download/buffalo-1.2alpha1.zip

此次的发布比原来声明的时间大约晚了三周,主要原因是一直找不到支持subversion的代码仓库。跟dev.java.net邮件往来多次,最后得知无法获得svn服务,只好作罢。多亏了曹晓钢的鼎力帮忙,在生病的情况下依然帮助我搭建并调试svn. 祝愿他早日康复。现在代码放在了redsaga上。

本想将版本号定义为1.1.1alpha, 但是由于本次版本变更在javascript部分实在巨大,完全集成了prototype的基础设施,写法跟过去有了很大不同,因此更改为1.2. 在外部api调用上,最大程度的保证了跟以前遗留代码的兼容。如果发现有问题,请在buffalo论坛中提出。很多常见的问题已经在那里提出了。

之所以集成prototype, 是因为他的提供的语法级别的基础设施相当便利,并且在常见的HTML操作的处理上,提供了相当多的方便的封装,如$, $F, Form等,我相信这些便利的方法会给web开发者带来更高的工作效率。

自这个版本后,buffalo javascript部分将不再作重大更新。剩下的工作将专注于java部分的工作,包括效率,bug, 以及最主要的部分:页面框架。

建议,意见,欢迎发往buffalo 论坛http://groups.google.com/group/amowa。最后向那些久等的朋友们说一声:对不起,来迟了!

One Page, One Application

Friday, September 9th, 2005

前言:这篇文章本应该在一个月前就写出来,但是因为种种原因,腹稿打了数十遍,现在才有时间提笔来写。文中某些观点相对目前的web应用比较前卫,阅读者应当根据自己应用的具体情况,对此文进行批判的阅读。

一 定义

One Page, One Application(后面缩写为OPOA,或者1P1A), 含义很简单:一个页面就是一个应用。在众多的基于Web的MIS系统中,没有人关心页面的组织形式;大多数稍微复杂的MIS系统,都采用分祯(Frame)的方式来组织页面,这样,在进行业务操作的时候,url的变化表现在一个框架页面内,从浏览器的地址看起来,只有一个地址;更有甚者,一些应用干脆弹出一个去掉了浏览器菜单、工具条、地址栏、状态栏的窗口(比如招商银行、民生银行的网上银行系统),连地址都看不见。因此,一个页面就是一个应用,从用户的角度来说,对于操作型系统,是一种非常自然的体现。用户无需了解每一个具体的操作对应的地址是什么。

这种设计背后的含义实际是:是希望由程序来控制用户的行为,还是反过来。在操作型系统中,每一步的操作往往被业务含义严格定义,无论是应用的设计者,还是其使用者,都希望在一种受控的状况下来进行操作。例如,一个审批动作,用户更希望是通过一个按钮来触发,而不是访问类似于/approve.action?itemid=123的方式。

二 场景

显然,OPOA的设计只能针对那些对URL不敏感的系统,或者说操作型系统。绝大多数MIS系统都属于这一范畴,Email系统也是这一范畴,其他领域,如监控系统,聊天室等都可以采用这种思路。反面的例子是,对于内容型系统,如新闻系统,Blog系统,论坛系统,用户更希望能够通过一个明确的URL来定位页面内容,搜索引擎也喜欢这种地址。这种应用需要的是一个合理,易懂,明确的地址。

三 设计与实现

大多数MIS系统,无论是有意识或者无意识,都遵循了OPOA的思路。要么采用框架,要么采用弹出窗口来屏蔽URL的直接访问。实现上也很简单,这里就不再赘述了。注意到上述的OPOA地实现只是对用户而言,看起来好像是一个页面一样,但实际上还是有众多的action, page在后面工作。

下面我要说的一种实现是,采用AMOWA/AJAX技术来实现真正意义上的OPOA. 简而言之:主页面(或者称布局页面)只加载一次,其他的操作页面通过AMOWA/AJAX技术来加载,并将其中的操作脚本与布局内容分开,最后进行展示。这个设计的原型在buffalo-1.1dr版本中。细心的开发者一定能注意到,在切换不同demo的时候,只是调用了一个switchPage函数,将不同的页面进行读取并显示。demo的演示速度相当快,因为每次只读取一小部分页面;如果加上缓存机制,将页面进行缓存,那么更快了。

首先存在一个布局页面,这个页面定义了一个应用大致的外观,(例如,大部分MIS系统按照上中下三栏,中间部分左右两栏分别为顶部logo, 操作菜单,具体操作内容,底部状态栏)。用你喜欢的网页编辑工具,将这个页面设计美观,然后按照应用的要求,将页面进行拆分。此时的拆分不用Frame了,只需要在不同的部位加上<div id=”…”>就可以。

然后在主页面定义一个函数,例如switchPage, 将这个函数使用在需要进行页面切换的地方。在buffalo的sample中,switchPage函数这样实现:

function switchPage(page) {
pageBuffalo.remoteCall(“pageService.loadPage”, [page], function(reply) {
var pageObj = reply.getResult();
Buffalo.getElementById(“body”).innerHTML = pageObj.html;
if (pageObj.script != null || pageObj.script != “”) {
execScript(pageObj.script);
}
});
}

你可以用任意你喜欢的AJAX/Amowa引擎来做这件事情。

剩下的工作都可以想象了。你可以将web应用的网页资源全部用html编写,并放在一个不为人知的地方,而通过pageService来读取他们;你可以任意组织你的应用外观,更加自如的切换他们。应用的URL地址永远只有真正的一个,你的应用也要比别人快很多,因为只加载那么一小块内容。

四 小结

AJAX/AMOWA的兴起为我们开阔了很多视野。比起原来的web框架,这种OPOA的方式能够更快,减少更多的编码量,并提供更好的用户体验。当然,上文中提出的只是一个原型实现,如果尝试自行实现,可能更多的东西需要考虑,如安全,缓存,事件回调机制,内存管理等等。但这将是一个方向,一个可以提高开发体验与用户体验的方向。

补充:
在buffalo的发展规划中,基于OPOA原则的页面框架将作为重要组成部分被加入。

Buffalo1.1 dr 发布

Monday, July 18th, 2005

基本上实现了预期的构想,1.1中需要的功能都进行了扩充,包括Spring集成,绑定,自定义状态。

核心:
* Spring 支持,已完成
* 客户端兼容传统Burlap远程调用, 已完成
* 添加同步调用支持,已完成
* 可自定义异步调用时的动作,完成

绑定(in very alpha state, just show demo only):
* 复选框,下拉列表框
* 表格
* 与JST集成

文档及演示:
* 改善的demo页面
* buffalo重写的j2ee blueprints ajax演示

欢迎各位使用!

下载:http://www.amowa.net/buffalo/download.html

http://www.amowa.net/buffalo/download/buffalo-1.1dr.zip

ps. 本版本是开发版本,文档很不充分,是为那些迫切等待1.1特别是Spring集成特性的项目准备的。在发行包中作了相关的例子,基本上都很简单,很容易上手。另外, http://groups-beta.google.com/group/amowa/ 是新开辟的专门讨论buffalo和amowa的论坛,有什么问题可以在这里提,也可以去那里。

用Buffalo完成了一个j2ee blueprints中ajax autocomplete样例

Wednesday, May 18th, 2005

今天抽了点时间,完成了J2EE Blueprints Ajax样例中的AutoComplete. 以下是执行结果:

结果证明,用buffalo开发ajax应用,与j2ee blueprints自带的样例相比,能够大大提高开发速度,减少编码量;-)

下载: buffaloajax.zip 使用buffalo 1.0alpha.

请直接将zip解压缩到tomcat/webapps路径中,然后在浏览器中访问:

http://localhost:8080/buffalo-ajax/ajax-autocomplete.jsp

http://localhost:8080/buffalo-ajax/ajax-autocomplete-withbind.jsp

J2EE Blurprints Ajax: https://bpcatalog.dev.java.net/nonav/ajax/autocomplete/frames.html