Ajax
“Asynchronous JavaScript and
XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术。它使用:
* 使用XHTML+CSS来表示信息;
* 使用JavaScript操作DOM Document Object
Model进行动态显示及交互;
* 使用 XML 和 XSLT 进行数据交换及相关操作;
* 使用
XMLHttpRequest对象与Web服务器进行异步数据交换;
* 使用 JavaScript 将所有的东西绑定在一起。
类似于DHTML或LAMP,AJAX不是指一种单一的技术,而是有机地利用了一系列相关的技术。事实上,一些基于AJAX的“派生/合成”式(derivative/composite)的技术正在出现,如“AFLAX”。
开发Ajax应用面临的挑战及解决方案,
一句话:目前的ajax并不能取代soap方式的客户端和webserver处理模式。
对程序员而言,开发Ajax应用最头痛的问题莫过于以下几点:
1.
Ajax在本质上是一个浏览器端的技术,首先面临无可避免的第一个问题即是浏览器的兼容性问题。各家浏览器对于JavaScript/DOM/CSS的支援总有部分不太相同或是有Bug,甚至同一浏览器的各个版本间对于JavaScript/DOM/CSS的支援也有可能部分不一样。这导致程序员在写
Ajax应用时花大部分的时间在调试浏览器的兼容性而非在应用程序本身。因此,目前大部分的Ajax程序库或开发框架大多以js程序库的形式存在,以定义更高阶的JavaScript
API 、JavaScript对象(模板)、或者JavaScript Widgets来解决此问题。如prototype.js。
2.
Ajax技术之主要目的在于局部交换客户端及服务器间之数据。如同传统之主从架构,无可避免的会有部分的业务逻辑会实现在客户端,或部分在客户端部分在服务器。由于业务逻辑可能分散在客户端及服务器,且以不同之程序语言实现,这导致Ajax应用程序极难维护。如有使用者接口或业务逻辑之更动需求,再加上前一个JavaScript/DOM/CSS之兼容性问题,Ajax应用往往变成程序员的梦靥。针对业务逻辑分散的问题,Ajax开发框架大致可分为两类:
*
将业务逻辑及表现层放在浏览器,数据层放在服务器:因为所有的程序以JavaScript执行在客户端,只有需要数据时才向服务器要求服务,此法又称为胖客户端(fat
client)架构。
服务器在此架构下通常仅用于提供及储存数据。此法的好处在于程序员可以充分利用JavaScript搭配业务逻辑来做出特殊的使用者接口,以符合终端使用者的要求。但是问题也不少,
主因在第一,JavaScript语言本身之能力可能不足以处理复杂的业务逻辑。
第二,
JavaScript的执行效能一向不好。
第三,JavaScript存取服务器数据,仍需适当的服务器端程序之配合。
第四,浏览器兼容性的问题又出现。有些Ajax开发框架如DWR企图以自动生成JavaScript之方式来避免兼容的问题,并开立通道使得JavaScript可以直接叫用服务器端的
Java程序来简化数据的存取。但是前述第一及第二两个问题仍然存在,程序员必须费相当的力气才能达到应用程序之规格要求,或可能根本无法达到要求。
*
将表现层、业务逻辑、及数据层放在服务器,浏览器仅有使用者接口引擎(User Interface engine);此法又称为瘦客户端(thin
client)架构,或中心服务器(server-centric)架构。浏览器的使用者接口引擎仅用于反映服务器的表现层以及传达使用者的输入回到服务器的表现层。由浏览器所触发之事件亦送回服务器处理,根据业务逻辑来更新表现层,然后反映回浏览器。因为所有应用程序完全在服务器执行,数据及表现层皆可直接存取,程序员只需使用服务器端相对较成熟之程序语言(如Java语言)即可,不需再学习JavaScript/DOM/CSS,在开发应用程序时相对容易。缺点在于使用者接口引擎以及表现层通常以标准组件的形式存在,如需要特殊组件(使用者接口)时,往往须待原框架之开发者提供,缓不济急。如开源码
Ajax开发框架ZK目前支援XUL及XHTML组件,尚无XAML之支援。
3.
Ajax是以异步的方式向服务器提交需求。对服务器而言,其与传统的提交表单需求并无不同,而且由于是以异步之方式提交,如果同时有多个Ajax
需求及表单提交需求,将无法保证哪一个需求先获得服务器的回应。这会造成应用程序典型的多程序(process)或多线程(thread)的竞争(racing)问题。程序员因此必须自行处理或在JavaScript里面动手脚以避免这类竞争问题的发生(如Ajax需求未回应之前,先
disable提交按钮),这又不必要的增加了程序员的负担。目前已知有自动处理此问题之开发框架似乎只有ZK。