AJAX在去年确实火爆了,作为Web2.0时代的核心技术,关注度盛况空前,至今仍余音未绝,我一直从事于WinForm、Windows Mobile应用开发,虽然对Web开发略知一二,但从未向学习WinForm开发一样系统的学过Web,最近闲暇之余从头学了学ASP.NET,到现在才真正理解清楚了诸如ViewState之类的Web工作原理,我可以肯定的说,时下的Web开发人员中还有什么都没理解清楚的“高手”,当然ASP.NET并不是今天讨论的话题,我们直接看看Ajax吧,在理解清楚它之后你会发现,它比理解WinForm编程中的线程单元要简单得多,就其技术本身来说并没有什么神秘与复杂性可言,而且其工作机制还不及三次握手的理解难度,我们并不讨论实现的方法,而只对底层工作原理进行剖析,因此读这篇文章并不需要造火箭的技术。

      Ajax(Asynchronous JavaScript and XML)中文意思为异步JavaScript 和XML,或者基于XML的异步JavaScript.它提供了一种局部刷新Web页面的机制,比起传统的整页Load在性能上有了质的飞跃,看看GoogleMap吧,再看看Google输入框的AutoComplete功能,相信你已经对Ajax无限神往了。每一项技术都有其发展的根源,我们追溯一下Ajax的历史,其实这个技术最早在IE5.0中被引入,算算也是几年前的东西了,可惜微软当时并没有挖掘出它的价值,直到Flickr, Backpack和Google在这方面作出了惊人的研究成果。就技术根本来说,Ajax只完成了一个功能,即用客户端代码(JavaScript )发送Http请求,要完成这一特殊的功能并不是我们这些普通开发人员能简单实现的,因为它依赖于浏览器本身,在IE5中,微软引入了一个XmlHttp的ActiveX对象,后来Mozilla, Safari 和其他浏览器纷纷仿效, 提供了XMLHttpRequest类,它支持微软这个ActiveX对象所提供的方法和属性.这个类使得我们用JavaScript发送Http请求成为可能。并且它提供了我们插入响应代码的途径。下面是前面所描述的这个对象执行机制的伪代码:

      request = new XMLHttpRequest();  

request.open('GET', 'http://localHost/xxxx.aspx, true);

request.send(null);

     响应这个请求: 

request.onreadystatechange = function(){
           
           var text = request.ResponseText; //取得响应的字符串

     // 作出响应.....执行一些客户端JavaScript

};

      当然实际代码比起这些代码要复杂得多,但前面说过了,我们并不讨论实现方式,而是探寻其执行原理,可见为Ajax剥下神秘面纱后赤裸裸的展示出来其简单的原理,和C#里的事件响应一样,只不过这个事件是客户端请求而服务端触发罢了,真正的复杂性早已被微软封装到ActiveX对象中了,但是原理的简单并不是说实现的简单,实现起来确实有些难度,但是现在那么多的AJAX框架已经为我们屏蔽了很底层的东东,实现并不在本文所谈论的话题,这里就不详述了。

      任何新技术的引入伴随的都是痛苦的学习,我们必须掌握其实现原理,才能准确,适宜的用好这些新技术,盲目烂用只能弄巧成拙。那么作为开发人员的我们如何应对已经到来的AJAX呢?以下是我个人理解了AJAX后的一些结论(注:本人自知技术造诣浅陋,不对之处请大家原谅):

     理解Ajax解决的问题
     
     
Ajax的出现就是为了改善Web程序用户体验,用户点击页面后的页面刷新延迟问题就是引入Ajax的直接理由,如果我们的程序运用AJAX并没有改善用户体验的话那只是为了Ajax而Ajax,而不是为了用户体验而Ajax。
    
     Ajax的弊端
     
    
1、兼容性。Ajax的立命之本是前面提到的XMLHttpRequest,然而这个对象在各个浏览器中不尽相同,这就增加了我们开发过程中完成一个跨浏览器的通用代码的难度,而JavaScript这种语言在各种浏览器中对技术的支持和标准也不同,从而加剧了这种困难性。好在市面上纷繁的Ajax框架已经为我们解决了兼容性问题,让我们构建跨浏览器的程序变得简单起来。
     2、服务器压力。本人认为Ajax把客户端请求服务器响应这一过程变为异步执行,一方面提高了用户体验,同时使得用户请求响应的次数显著增加,服务器面临的压力也将增强,试想一下,以传统整页加载的方式当用户请求一个页面时候必然会等待页面装载,而Ajax使得请求发出后页面并不需要等待,这样用户可以点击其他页面元素再次发送请求,试想一下Google的AutoComplete功能如果是链接数据库请求的话,每次输入都会发生这一行为,那数据库压力是否成倍增长?
     3、语言问题。由于Ajax以JavaScript为核心,而这是一种繁杂而又易出错的语言,它会使得我们将应用逻辑任意地散布在服务端和客户端中,这使得问题很难被发现而且代码很难重用。JavaScript甚至被服务端开发人员认为是一种企业级应用不需要使用的东西应该尽力避免。幸好出现了Microsoft Script Debugger等强大的JS调试器,同时VS2008的JavaScript智能功能也在为这些问题而做着努力。然而JavaScript的缺陷如双重变量赋值(通常是由于缺少数据类型)使得调试程序依然面临挑战。

     相关技术

     由于XMLHttpRequest返回的响应是以字符串形式出现,因此XML成为理想的选择,Ajax中的x预示着XML将终身伴随着Ajax,因为大多数开发人员已经掌握了这项流行的技术。对于Xml来说理解Dom是必须的,Xpath为Xml操作提供了捷径,而XSLT为输出Html提供了天然的温床,因此所谈到的这些技术作为Ajax开发者必须掌握。加上新引入的XMLHttpRequest对象,和更复杂的JavaScript代码,相信技术的学习依然会痛苦一段时间。

      
     说到这里已经算为Ajax开了个头了,希望对初学Ajax的朋友能提供学习上的指引,本人也是菜鸟,望高手勿见笑。
      
     
      
     
posted on 2008-01-24 23:54  sharping  阅读(2395)  评论(20编辑  收藏  举报