论坛首页 Web前端技术论坛

给Ajax技术初学者的一些建议

浏览 65407 次
该帖已经被评为精华帖
作者 正文
   发表时间:2007-05-12  
在Ajax开发中,DHTML是一个相当重要的部分,但是包括了与服务器通信的Ajax部分才是最本质的部分。

一般的结构是:
DHTML组件库-Web Remoting库-HTTP-服务器端架构。

我并没有明确标出哪一部分是我所说的狭义的Ajax部分,因为在这个结构中,其实Ajax部分不能认为只包括客户端的代码,服务器端与客户端配合的部分应该也属于Ajax。在Ajax应用中客户端与服务器端的关系,即Ajax应用如何来与服务器通信,通信的接口(数据的格式、API的粒度)如何来设计,这一部分是非常重要的。这部分的设计就是Ajax应用架构设计的核心部分,对于Ajax应用而言,是属于战略性的问题,所以一定要慎重处理。而具体所采用的UI组件库,对于Ajax应用而言,并不涉及到架构问题,所以相对来说只是较小的战术问题。其实在这个领域的轮子并不少,张三不生产,自然有王五会生产,即使死了张屠户,我们也没有必要去吃带毛的猪。我前面的一个帖子曾经说到过,其实我感觉DHTML并不是非常理想的UI技术。对于精心设计的架构而言,是完全有可能在多种UI技术之间平稳切换的。《Ajax模式与最佳实践》整个一本书都是讲如何设计松散耦合的Ajax应用的,这个松散耦合,既包括客户端与服务器端的松散耦合,也包括Ajax部分与DHTML组件库部分的松散耦合。
0 请登录后投票
   发表时间:2007-05-12  
micrexp 写道
顺便问一句,这本书里又有多少是在讲XMLHttpRequest?

小子,故意给我设圈套?想把我绕进去?
我什么时候说Ajax就是XMLHttpRequest了?我的意思是说,一个Ajax应用,除了DHTML部分以外,还是有一个明显的Ajax部分存在的。这个我所谓的Ajax部分,是一个狭义的Ajax部分,主要负责处理Ajax应用的客户端与服务器端的关系。
0 请登录后投票
   发表时间:2007-05-12  
dlee 写道
micrexp 写道
用iframe一样可以实现AJAX,AJAX其实几年以前就出现了
最初的无刷新聊天室其实就是

这是强辩。
IFrame的通信能力是非常有限的,对于通信能做的控制非常少。IFrame的这种用途其实超出了它本身最初的设计范围,具有潜在的危险性,使用起来也不是很方便,因此这种做法通常被看作是一种hack。正是看到了这种需求,M$才顺应Web开发者的要求,在1999年为IE5.0添加了XMLHttpRequest对象(当然,那时候还不叫这个名字),XMLHttpRequest是专门用来做Web Remoting的,而且允许对于通信进行非常细致的控制。XMLHttpRequest可以做的控制包括:
1. 可以设置异步的回调函数。
2. 可以根据状态代码判断通信进入了哪个阶段。
3. 若状态代码为4,则可以确信请求肯定是成功的。
4. XMLHttpRequest对象可以使用HTTP的所有的方法(GET/POST/PUT/DELETE/...)
5. XMLHttpRequest对象可以访问并设置HTTP头信息。
6. XMLHttpRequest对象对于数据的传输提供了更好的支持,它支持所有纯文本格式数据的传输,对于JSON和XML数据的支持要比IFrame好的多。你误以为XMLHttpRequest只能支持XML数据,说明了你现在对于Ajax还一无所知。

从上面这些特点来看,在有了XMLHttpRequest之后,不使用这个对象,而仍然使用原始落后的IFrame来进行通信是很奇怪的(有着严重的自虐倾向,好的不肯用,一定要用差的,为了显示出自己特别牛x?)。

在2001年,Mozilla1.0也支持了具有相同接口的对象,取名叫做XMLHttpRequest对象(这是它的正式名称的由来),后来的几年中,Opera、Safari等其他主流的浏览器也逐渐支持了这个对象。在2005年Ajax术语出现的时候,所有主流的浏览器都能够支持这个对象了。
虽然在2005年Ajax术语出现之前,使用这种方式做开发的人很多,但是都是以一种半公开的方式,缺乏广泛的交流和相关的理论建设。直到出现了Ajax这个术语,并且业界知名的大公司如Google、Yahoo!等利用这种技术建造了一大批令人印象深刻的Web应用之后,Ajax才进入了Web开发的主流。随后对于Ajax的研究也逐渐系统化、理论化,今天已经没有多少人敢于把Ajax开发称作是一种hack,做Ajax开发基于100%的Web标准(包括XMLHttpRequest对象在内),是光明正大的、严肃的开发。而且Ajax开发的理论建设也取得了长足的进步,包括架构的设计、各种设计模式、最佳实践也都浮现了出来。现在的Ajax开发已经走入了一个良性循环的发展道路,必将随着Web标准和浏览器的发展,还会继续取得长足的进步。



我干嘛要把你绕进去.......
0 请登录后投票
   发表时间:2007-05-12  
micrexp 写道
我干嘛要把你绕进去.......

XMLHttpRequest对象的广泛应用是产生Ajax技术的必要条件(注意,IFrame并不足以催生出Ajax这样的技术来,因为它本身存在着巨大的缺陷),也是Ajax技术最核心的部分,但是Ajax的思想现在已经远远超出了XMLHttpRequest了,例如通过动态创建Script标签请求某个服务器暴露出的JSON服务,仍然属于Ajax。Comet或者HTTP Streaming也属于Ajax。

你认为Ajax仅仅停留在10年前通过IFrame实现聊天室的阶段,没有任何发展,这是你自己认识的缺陷。
0 请登录后投票
   发表时间:2007-05-12  
dlee 写道

1. 可以设置异步的回调函数。
2. 可以根据状态代码判断通信进入了哪个阶段。
3. 若状态代码为4,则可以确信请求肯定是成功的。
4. XMLHttpRequest对象可以使用HTTP的所有的方法(GET/POST/PUT/DELETE/...)
5. XMLHttpRequest对象可以访问并设置HTTP头信息。
6. XMLHttpRequest对象对于数据的传输提供了更好的支持,它支持所有纯文本格式数据的传输,对于JSON和XML数据的支持要比IFrame好的多。


另外,这些功能IFREAM一样可以实现.不过的确是麻烦了一点
0 请登录后投票
   发表时间:2007-05-12  
dlee 写道
micrexp 写道
我干嘛要把你绕进去.......

你认为Ajax仅仅停留在10年前通过IFrame实现聊天室的阶段,没有任何发展,这是你自己认识的缺陷。


哈哈~~我什么时候说过这句话了?
0 请登录后投票
   发表时间:2007-05-12  
micrexp 写道
另外,这些功能IFREAM一样可以实现.不过的确是麻烦了一点

嘿嘿,开始睁着眼睛说瞎话了。
告诉我,完全使用IFrame如何来设置任意的HTTP头信息?如何使用除GET之外的其他HTTP方法?
0 请登录后投票
   发表时间:2007-05-12  
dlee 写道
micrexp 写道
另外,这些功能IFREAM一样可以实现.不过的确是麻烦了一点

嘿嘿,开始睁着眼睛说瞎话了。
告诉我,完全使用IFrame如何来设置任意的HTTP头信息?如何使用除GET之外的其他HTTP方法?


今天我这儿没环境,周一我把代码贴上来.贴不上我我从此不上JAVAEYE
0 请登录后投票
   发表时间:2007-05-12  
dlee 写道
jindw 写道
我更倾向于吧Ajax看着Dhtml的延伸。
书店里随便翻本打着Ajax标签的图书,里面有多少讲XMLHttpRequest?
能写满个七八页就不错了。其他都是Dhtml的内容。

说Ajax是新东西,更是没什么说服力。
msdn左边那个菜单就是基于XMLHttpRequest的,人家用了多少年了?那些年Ajax在那里?

前些时候在csdn上看到什么Ajax之父什么滑头。扯淡嘛!
改天某位大佬给太阳系取的好听的新名字,在让一些不负责任的垃圾媒体吵作一下,估计太阳系之父就可能腾空出世了!!!!

你去找来《Ajax模式与最佳实践》瞧一瞧,看看里面有多少比例是讲DHTML的,还有《Ajax实战》里面有多少比例完全是讲DHTML的。如果你不肯费这个钱,我可以自费买两本书送给你,只要你能给我留下一个通信地址,我的邮箱dlee.cn at gmail.com。

创造Ajax名词的那个人(所谓的“Ajax之父”)是一个咨询顾问,他本人主要不是做技术的,但是其他的一些Ajax图书的作者的技术都非常棒。你盯着他一个人,认为他肯定无法回答你诸如如何建造一个复杂的DataGrid一类的问题,这是很偏颇的观点。

另外,你的那个JSI,其实设计方向有些偏。现在确实需要有一个更高的抽象层能够更紧密地将一些常用的UI组件库(包括Ext、Dojo、Prototype等等)集成在一起,解决它们之间存在的严重的互操作的问题,但是UI组件库主要的一些设计关注,包括分离页面的结构/表现/逻辑,Unobtrusive、Progressive Enhancement、代码的可测试性、可维护性等等,并没有在你的JSI这里体现出来。你一味地强调JavaScript代码本身的侵入性,这是很奇怪的。我以前曾经追问过你为何你认为Dojo的JavaScript代码侵入性很大,而你本人貌似很不屑于回答这样的问题。

使用你的库做开发,开发成本并不会有明显的下降,而且还附带有一些额外的学习成本在里面。DHTML开发我还有一点经验,也许经验没有你丰富,但是我还是有能力区别出好的UI组件和不好的UI组件的。


貌似我的言论,dlee不太高兴了,呵呵。
首先,那个什么之父的,我不熟悉,也不知道他是干什么的。也没有盯着他。仍外,我看书的时候也没有看作者的习惯,我还是觉得目录比作者更有说服力。

说到JSI,目前只是个预览版,说开发成本的明显的下降,可能还早了点,我只是提出了一种类库管理的思路。
你说学习成本,我可以说,很小很小。不过,文档是少了点。

至于DHTML经验,你就不用谦虚了,你一定比我更丰富。
我在JSI开发之前(2005),基本上没有涉及到这个领域。


你追问Dojo代码侵入性的问题时,其实我上面已经回答了,怎么能叫不屑。至于进一步的解释,一直没想好该如何去解释。
现在我再解释一下,也不知道能不能让你满意:
我说Dojo代码侵入性高,为什么,很明显,在JSI中,我可以在不修改代码的情况下,吧prototype,Yahoo UI,jQuery等等等,非常出名的类库集成进来。而这点,Dojo做不到。
就好像Sping的情况。我使用他管理我的Java Bean,我不需要加入什么Spring的元素,吧原先的代码改的面目全非。这就是侵入的一个体现。

Spring的内核,主要还是依赖管理和服务托管。其他东西都在这个基础上延伸。同样,JSI也打算这样发展下去。只是,我的JSI现在还非常原始,正如你说,目前还无法带来什么开发效率的明显提升。
不过,你说的可维护性方面,我觉得JSI现在的状态还是有点用处的。至少你使用JSI托管类库的时候,不用跑到每个页面上去维护类库之间的依赖,不用在页面上维护一堆堆你自己没有直接用到的,甚至都不知道干什么的js文件。
0 请登录后投票
   发表时间:2007-05-13  
micrexp 写道
dlee 写道
micrexp 写道
另外,这些功能IFREAM一样可以实现.不过的确是麻烦了一点

嘿嘿,开始睁着眼睛说瞎话了。
告诉我,完全使用IFrame如何来设置任意的HTTP头信息?如何使用除GET之外的其他HTTP方法?


今天我这儿没环境,周一我把代码贴上来.贴不上我我从此不上JAVAEYE


期待星期一能帖上来,我也想知道如何做。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics