AJAX与服务器端通讯,虽然XHR对象的介入使得我们可以异步处理用户请求,但是另外一个细节也暴露给我,我们如何与服务器统一通信的契约?
目前比较公认的有三种数据传输交互方式:XHTML Fragment,JSON,XML。当然也有不同的声音,这里也会介绍。
这是一个Struts的例子,Action中response直接flush输出。当然也可以让Struts导向到结果jsp页面,请求的XHR可以得到jsp生成的HTML内容。缺点是:当返回有Form的内容的时候会崩溃。CSS样式设置复杂。
XML在很多AJAX示例当中作为数据传递的标准。而XML具有很好的数据语义描述性,服务器端生成方式众多,而几乎所有浏览器都支持对XML 的解析。以JavaScript解析服务器端返回的XML为例子,只需要XHR的responseXML属性即可获得XML由javascript解析 (请看我在BlogJAVA写的操作示例) 而XML的产生方式似乎所有人都认准了
一类,似乎这样子语义描述更清楚。但是我从michael那里得到启示,确实,用此类方式传输数据几乎无法在客户端统一处理。从我的showcase中大家也可以看到,Javascript解析XML后更新DOM简直就是体力活,枯燥且容易出错,而此种XML返回的数据则会千差万别,以寻找特定tag的节点的方式怎么能统一处理呢?于是,第二种XML传输方式应运而生。
这样子只要客户端和服务器端达成共识string long int等代表的数据类型就可以在两端还原成自己可用的对象。而这也是micheal认为真正的AJAX应该有的形态,其中AJAX引擎便承担起了这份工作。缺点:XML的构造和解析在没有类库辅助的情形下是一个灾难,而XML文件的传输效率似乎也不如简单的文本高。我讲会在后面的blog中提及XML文件的产生方法,以及客户端一些解析的框架。
JSON是JavaScript Object Notation的缩写,是一份规范,定义了极其简单的数据描述形式。几乎在所有主流语言上都有实现。JSON对象是名/值对的集合,所以一个简单的JSON对象为:var testObj={"name" : david,"sex" : Male,"work" : SE}客户端javascript调用eval()就可以解析由服务器端产生的JSON串。var jsonExpression =( + req.responseText + );var customer = eval(jsonExpression);而服务器端(JAVA)也有相应的lib来操作:JSONObject 的toString() 缺点:虽然JSON简洁高效,但是转化为Javascript对象通过eval()也就是说,AJAX的传输邦定在了JSON上面,这样,总会让人不很放心。并且JSON对象难于阅读与理解,不如XML直观。
除了会在下一篇AJAX的blog介绍JAVA对象序列化到XML以外,会一些从头开始构建应用的例子,其中不会使用buffalo DWR一类的框架,我会尝试选用不同的方案作为数据传输方式供大家参考。
posts - 29, comments - 3, trackbacks - 0, articles - 0
Copyright © BlueO2