现有的Web表现层技术按照事件模型所在的位置可以分成两大类,事件模型位于服务器端的和事件模型位于客户端的。
基于HTML表单交互的传统的Web开发框架,事件模型都位于服务器端,这些框架包括各种Web MVC框架(Struts、WebWork、Spring MVC等等)、JSF、ASP.NET、RoR、以及PHP、Python等语言开发的各种Web开发框架。这样一类框架的主要特点是用户的事件必须要发送到服务器端来处理。如果它们不与Ajax或者某种RIA技术相结合,它们无法提供最佳的响应能力(因为所有的用户事件都需要到服务器端走一趟)。在这些框架中,RoR和ASP.NET对于Ajax的支持是最好的。ASP.NET和JSF这两个事件驱动的Web开发框架的事件模型与服务器端绑的最死,因此Ajax在这两个框架中,受到的限制最大。
Ajax和各种其他的RIA技术,包括M$ WPF、Adobe Apollo、Adobe Flex、Java Web Start、M$ Smart Client、Mozilla XUL等等,事件模型都位于客户端。它们与服务器端构成的一种最理想的整体架构是基于REST的Web服务(RESTful Web Service)。在这种架构中,服务器端不存在事件模型,服务器端只提供数据服务,表现逻辑完全位于客户端。大家去认真读一下定义Ajax技术的那篇著名的文章,就可以清晰地看到,Ajax技术的核心思想是在客户端处理用户的事件,它的事件模型是位于客户端的。如果仅仅把Ajax当作一种不刷新页面的技术(有的时候,使用IFrame也可以做同样的事情),那是没有充分理解Ajax技术的内涵。
CSDN前几天摆了一个场子,把一些Web表现层技术放在一起,希望它们杀个你死我活。不过在我看来,上述两大类Web表现层技术的适用场合的交集其实并不是很大,竞争主要是出现在它们的内部。
JSF的主要竞争者是ASP.NET,Sun搞出来JSF规范最初就是为了与ASP.NET竞争。现在ASP.NET Ajax日渐成熟,因此在对于Ajax的支持方面领先了JSF很多。其实Ajax与JSF是友非敌,善用Ajax,可以有效地改善Web应用的可用性,弥补这样一类框架事件模型完全位于服务器端的不足。不清楚为何袁红岗会将Ajax当作JSF的敌人。
而与JSF、ASP.NET相比,WPF、Apollo在技术上领先了一代。孟岩非常看好WPF的前景,我也很看好,而我更看好的是RIA+REST这样一种新型Web开发架构的前景。Apollo依靠Flash的市场占有率占据了领先的优势,WPF依靠M$对于桌面操作系统的垄断,有望奋起直追。WPF和Apollo在这两三年将是RIA技术领域主要的竞争者,RIA技术也会越来越多地蚕食传统Web开发框架的地盘。很遗憾的是在RIA技术领域Java缺席了,Java Web Start不大可能在这个领域扮演一个主要的角色。
Ajax技术的缺点很明显,主要是在开发效率方面,但是Ajax目前有几个无法替代的优点:
1. Ajax技术的部署是零成本的(Flash的部署还达不到零成本,WPF所基于的技术XAML和.NET的部署成本则要高很多),因此Ajax技术具有最佳的可访问性(accessibility),它只需要有一个现代Web浏览器就足够了。
2. Ajax技术是完全基于Web标准的,基于Web标准的技术对于搜索引擎优化(SEO)是最友好的。
3. 在目前,优秀的Ajax应用的可用性仍然领先于其他技术。可用性并不等于花哨,在很多场合,使用丰富的3D效果(或者其他的花哨效果)并不能有效地改善应用的可用性。
所以对于2/3的Web应用,其实基于Web标准的Ajax技术已经基本上够用了,而其他1/3需要更为丰富表现效果的场合,则是RIA技术的用武之地。
如果可访问性和搜索引擎优化对于你们开展业务至关重要,那么目前的唯一选择就是Ajax。所以我预测今后很多年,基于Web标准的技术仍然会统治互联网,而其他的RIA技术则会在Intranet的企业应用中展开厮杀。
Ajax技术基于真正的Web标准,它是属于100% public domain的技术,因此Ajax技术是上述所有这些技术的朋友,而不是敌人。我将Ajax技术比喻为一种像水一样的东西,上善若水,水善利万物而不争,其他的技术都可以对Ajax技术加以充分利用。RoR已经与Ajax形成了非常理想的合作关系,彼此相得益彰,还从框架的核心设计上对REST提供了支持。我从来没有看到过M$和Adobe的核心开发人员出来抨击Ajax,他们不会也不需要将Ajax当作他们的主要竞争对手,而在WPF和Apollo中也用到了不少JavaScript。这些RIA技术的充分发展并不会严重打击Ajax技术,相反会促进Ajax技术的发展。因为它们从架构上来说是一致的(Ajax+REST或者RIA+REST,其实Ajax也可以被纳入为一种RIA技术),Ajax融合进WPF和Apollo的架构中是比较容易的。而Ajax融合进ASP.NET和JSF的架构则要困难一些,因为它要受到这些架构服务器端事件模型的限制。袁红岗选择了放弃Ajax,也是出于一种实现成本上的现实考虑,他们可能并没有能力开发出类似于ASP.NET Ajax那样的框架来。但是他们没有必要来踩Ajax,虽然Ajax是一个无父无母的孤苦孩子,拉出来殴打一顿,估计也不会有人来寻仇。:)