最近一段时间,关心 Web 开发的朋友在网络上会经常听到 Ajax 这个 buzzword。使用 Google 搜索,会搜索到无数自称是 Ajax 的例子。这些例子的作者得意洋洋地展示自己学会了 xmlhttp 之后写出的 hello world,自以为已经精通了 Ajax。
Ajax: A New Approach to Web Applications
点击查看
Ajax 是 Asynchronous JavaScript + XML 的缩写,其中用到的主要的技术包括:
基于 XHTML/CSS 标准的展现
使用 DOM 的动态显示和交互
使用 XML 和 XSLT 的数据交换和处理
使用 XMLHttpRequest 的异步数据获取
JavaScript 把所有的一切捆绑在一起
作者通过以下这个图对于传统的交互模式和 Ajax 交互模式做了一个比较。
我们看到,在传统的交互模式下,客户端并无表示逻辑的执行,由服务器端执行所有的表示逻辑,然后把 HTML/CSS 传给客户端,客户端仅仅做简单的展现。
传统的交互模式最大的问题就是任何哪怕是微小的交互行为都需要到服务器端走一趟,这样所带来大量的延迟令用户感觉很不舒服,也降低了用户的工作效率。可能现在 Web 大量用户已经习惯了等待一个页面刷新的无聊时间,可是这不能成为我们开发者推托有责任改善交互行为的借口。假设在用户使用 B/S 应用之前还使用过 C/S 应用,在 C/S 应用中难道会有这样可笑的事情发生吗?
在客户端多出来了一个 Ajax engine,而且服务器传给客户端的已经不再是 HTML/CSS,而是纯的 XML 数据,客户端通过 XMLHttp 向服务器端发送请求。所有的表示逻辑在客户端通过 JS 脚本来执行,然后通过修改 DOM 来完成展现。
虽然在这个词出现很多年以前就已经有大量的开发人员采用这种开发模式,不过现在既然出现了这个词,起到了规范术语的作用。去年在 JavaEye 活动上做 XMLHttp 开发的讲座时我感觉自己是相当另类的一个人,因为那时候还没有多少 J2EE 开发人员会对 JS 感兴趣。现在 Ajax 越来越进入 J2EE Web 开发的主流领域,而且会长期保持它的生命力。
在做这个演讲之前,我参考网上的一些资料对 Google Maps 做了一些 hack 的工作。目前已经可以做到除了地图图片要从 Google 请求外,其余所有的数据都在本地运行。
但是因为 Google Maps 前台的代码量比较大,并且是经过混淆的。所以整理这些代码花费了比较多的功夫。目前这个工作尚未全部完成。因此以下讲述的内容仅仅是根据我目前的成果。
1. standards-based presentation using XHTML and CSS;
2. dynamic display and interaction using the Document Object Model;
3. data interchange and manipulation using XML and XSLT;
4. asynchronous data retrieval using XMLHttpRequest;
5. and JavaScript binding everything together.
http://maps.google.com
Google Maps 每一张地图的请求方式是:
http://maps.google.com/maps?ll=49.29,-123.12&spn=0.017998,0.027586&z=3&hl=en
我们看到每一张地图有 4 个参数,按照值来算实际上是 6 个。
ll:地图中心的精度和纬度
spn:地图的范围(跨度,分横向和纵向)
z:地图的缩放级别
hl:地图采用的语言
http://mt.google.com/mt?v=.1&x=50&y=20&zoom=4
其中包括几个参数:
v:当前版本号。.1 被推测为 0.1 版
x:图片的 x 索引
y:图片的 y 索引
zoom:图片的缩放级别。
因为浏览器有图片的缓存功能,因此如果你经常查看某个相同地区的地图的话,久而久之,浏览器会缓存大量的图片,这样你使用 Google Maps 的性能就会越来越好了。
Google Maps 还有搜索的功能,而且非常强大。我这里录制了一个简单的演示。
Google Maps 还可以完成复杂的搜索,例如搜索 lax 这个地方的旅馆,结果为:
点击地图右边旅馆条目,可以在地图上面出现旅馆的说明。这个说明是使用 XSLT 技术产生的。
还可以搜索两点之间的路径。例如搜索 jfk to 350 5th ave, new york,得到的结果就是带有两点之间路径路径的地图。这里的路径在 IE 上是使用 VML 画的,而在其它浏览器上使用后台自动生成的透明 png 图片舆地图图片叠加产生。因为 IE 完全是在客户端完成,所以 IE 的性能会好一些。
这里有这样一个 xml 文件的例子。在这里面实际上只有 center 和 span 是必须的。客户端的脚本通过中心点位置和地图跨度自动像服务器请求相应的图片。
<?xml version="1.0"?>
<page>
<center lat="49.29" lng="-123.12"/>
<span lat="0.017998" lng="0.027586"/>
</page>
其它的公司和个人是否可以使用 Google Maps 的技术?
其它的公司和个人完全可以使用 Google Maps 的服务。目前 Google 尚未对这一服务进行收费。因此你可以从 Google 的服务器上请求图片,通过在你自己的服务器显示给客户。刚才我做的演示完全是在本地运行的,所有的 xml 数据和 js 脚本全部都在本地,仅仅是贴图来自于 Google 的服务器。Google 的 JS 脚本是有版权的,我这里仅仅是出于研究的目的,把脚本下载到本地,做了一些修改以便于研究。对于商业应用,可能不能这样做,可以在页面中直接使用 Google 服务器上的脚本。因此使用 Google Maps 的方式就是在你自己的服务器上面生成定制的地图数据,通过 XMLHttp 请求到客户端,使用 Google Maps 的脚本解析,然后从 Google 请求贴图数据。除了你自己的地图数据外,还可以从其它服务器上获得地图数据,例如从 Google 的服务器上获得数据。不过因为 XMLHttp 只能从本域获得数据,为了获得来自其它域的数据,需要在服务器端用 Servlet 实现一个代理,这个 Servlet 从其它域得到地图数据后返回给客户端。这样一个 Servlet 写起来是非常简单的,只需要几行代码。同时在客户端需要对 XMLHttp 对象做一个包装,使得新的对象可以请求来自不同域的数据。
1、功能完善,具有常规地图服务所有的功能。
2、性能优良。用户几乎从来不需要长期的等待。
3、支持多种浏览器,目前 Google Maps 支持的浏览器包括以下这些:
IE 5.5+ (Windows)
Firefox 0.8+ (Windows, Mac, Linux)
Safari 1.2.4+ (Mac)
Netscape 7.1+ (Windows, Mac, Linux)
Mozilla 1.4+ (Windows, Mac, Linux)
Opera 7.5+ (Windows, Mac, Linux)
已经囊括了目前所有主流的浏览器。
Google Maps 通过自己开发的一套组件库封装了 IE 与其它浏览器的差别。主要的差别包括 XMLHttp、XMLDom 对象的创建语法,还有事件处理机制的不同。并且 Google Maps 尽量采用符合 Web 标准的技术,使得针对不同浏览器开发分支代码的情况变得最小。
4、通过大量采用客户端的技术,放弃了传统的基于 HTML Form 的交互模式,因此使得用户获得了更好的交互体验。
5、完全的组件化和面向对象开发。
Google Maps 组件和面向对象设计的水平是非常高的。所有主要的的控件全部封装为对象,使用面向对象的方式进行操作。
因为 XMLHttp 只能得到本域的数据文件,为了从其它地方获得数据文件,可以在服务器端实现一个代理。简单而言就是实现一个 Servlet,通过这个 Servlet 获得其它域的数据文件,然后返回给客户端。
为此需要为 XMLHttp 对象做一个包装。我们来看看具体的包装技术。
1、JavaScirpt 没有 Java 那样的 package 或者 C# 的 namespace 的概念,因此类和函数非常容易重名。这个问题不能仅仅通过制定命名规范来解决。
2、JavaScirpt 中的继承不是真正的继承,仅仅是所有的子类对象共享一个父类对象,这个父类对象相当于一个 Singleton,因此必须是无状态的,不能保留自己的属性。这个问题使得 JavaScript 难以支持多层继承,无法构造大的继承体系。
1756




被折叠的 条评论
为什么被折叠?



