引言
由最初的Applet,到后来一系列JSP/Servlet相关规范的发布,Java语言在Web应用开发领域得到了广泛的应用。因特网缔造了Web世界,Web的基本协议是HTTP。
本章将讨论Web应用系统中的一个强大组件:JSON转换器。
8.1.1 传统Web应用
一个传统的Web应用,如图8‑1所示。
图8-1 传统Web应用
图8-1中,用户使用浏览器访问Web网页时,典型交互序列为:
(1)用户点击Web页面的链接;
(2)浏览器向目标Web Server 发送HTTP请求;
(3)Web Server 对HTTP请求进行解析和业务处理;
(4)Web Server 将处理后的结果,形成一个新的Web页面,发送给浏览器;
(5)浏览器接收到WebServer 返回的结果页面,进行解析,向用户展示一个新的页面。
从用户点击开始,到第(5)步新页面显示之前,浏览器的页面内容变成空白,用户无法进行其他任何操作,只能苦苦等待浏览器的响应。
因此,可以看出,传统的Web应用有如下不足:
(1)页面全部刷新,造成浏览器和服务器的处理负载太重,处理时间变长。实际应用中,我们往往只是需要改变页面的一小部分内容,而大部分内容保持不变,不需要在浏览器和服务器之间来回传递。
(2)交互过程是同步阻塞方式,浏览器的响应时长,依赖于服务器的响应时间。用户必须等待前一个操作完成,才可以进行下一个操作,前一个操作未完成时用户只能等待,用户体验很差。
而我们使用的桌面软件,如Word,Excel,PowerPoint等,用户体验就很好,不会出现屏幕变白、用户必须等待的情况。根本的原因在于,这些桌面软件,没有与远程服务器交互的过程,所有操作都是在本地进行的,因此就没有对服务器响应时间的依赖性。那么,有没有可能,让Web应用,也像桌面软件那样,不依赖服务器的响应时间,改善用户体验呢?
8.1.2 Ajax应用
1998年前后,一种新的技术开始出现,那就是:Ajax。Ajax英文全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术,正确读音应该为“ei zhai ke si”,国际音标为【'eidзeks】。
使用Ajax技术,Web应用的交互序列如图8-2所示。
图8-2 基于Ajax 技术的Web应用交互序列
使用Ajax技术构建Web应用后,用户使用浏览器访问Web页面时的交互序列为:
(1)用户点击Web页面的链接;
(2)Web页面向Ajax引擎提交异步调用请求;
(3)Ajax引擎向目标Web Server 异步发送HTTP请求;
(4)Web Server 对HTTP请求进行解析和业务处理;
(5)Web Server 将处理后的业务结果,回送给Ajax引擎;
(6)Ajax引擎用Web Server 回送的结果,回调Web页面指定的函数;
(7)Web页面指定的函数对Web Server回送的结果进行解析,局部刷新页面。
与传统的Web应用相比,使用Ajax技术带来了如下改变:
(1)用户点击页面后,操作请求被异步处理,屏幕内容不会变白,用户不必等待,就可以进行下一个操作;
(2)用户的操作请求被Web Server处理完毕后,浏览器仅更新页面的局部部分,不需要更新整个页面。因此,刷新速度非常快,改善了用户体验;
(3)页面通过Ajax引擎仅向Web Server 提交业务必需的数据,供Web Server处理,而不是提交整个页面。而Web Server也仅仅回送Web页面需要更新的数据,而不是回送整个页面。这样大大减少了网络通信量,加快 了浏览器和Web Server 的处理速度,提高了客户机和服务器双方面的性能。
第一个允许浏览器客户端脚本发送HTTP请求(XMLHTTP)的Ajax引擎由Outlook Web Access小组编写。该引擎原属于微软Exchange Server,并迅速成为了Internet Explorer 4.0[3]的一部分。部分观察家认为,Outlook Web Access是第一个应用了Ajax技术的成功商业应用程序,并成为包括Oddpost的网络邮件产品在内的许多产品的领头羊。但是,直到2005年初,许多事件才使得Ajax被大众所接受。Google在它著名的交互应用程序中使用了异步通讯,如Google讨论组、Google地图、Google搜索建议、Gmail等。Ajax这个词由《Ajax: A New Approach to Web Applications》一文所创,该文的迅速流传提高了人们使用该项技术的意识。另外,对Mozilla/Gecko的支持使得该技术走向成熟,变得更为易用。
Ajax并不是一种全新的技术,实际上它是多种已有技术的综合,包括Javascript、XHTML和CSS、DOM、XML和XSTL、XMLHttpRequest,核心内容为:
l 使用XHTML和CSS标准化呈现;
l 使用DOM实现动态显示和交互;
l 使用XML和XSTL进行数据交换与处理;
l 使用XMLHttpRequest对象进行异步数据读取;
l 使用Javascript绑定和处理所有数据。
Ajax前景非常乐观,可以提高系统性能,优化用户界面,极大改善用户体验。目前在开源项目和商业产品上,都涌现了大量Ajax 框架、类库、开发工具,Ajax的商业应用,也越来越多。
8.1.3 数据规则
如果使用Ajax技术,从开发的角度来看,相比传统的Web开发,有如下方面需要改动:
(1)Web页面客户端程序需要大量使用JavaScript,实现Ajax 异步请求的提交、服务器回送结果的解析和呈现;
(2)Web服务端程序需要改动,仅回送需要的数据,而不是整个页面;
(3)需要定义客户端程序和服务端程序之间传送数据的规则。客户端程序和服务端程序是使用不同开发语言编写的,因此必须定义数据规则,才能使客户端和服务端程序能够对数据进行正确解析。
本章主要讨论第三点:Ajax客户端和服务端之间的数据规则定义、编码和解码。数据规则定义,目前业界主要有三种:
(1)XML方式;
(2)JSON方式;
(3)自定义方式。
第一种方式,使用XML,可以精确表示任意复杂的数据。Ajax中的x,就是指XML。另外,XML有非常多的国际标准、规范、类库、开发工具支持,因此XML曾经一度被认为是Web客户机和服务器通信的标准方式。但随着开发的不断深入,技术人员发现,使用XML表示数据比较笨拙,编码后产生的数据量很大,网络负载增大很多。另外,使用Ajax的客户端程序,大量使用JavaScript 代码,而JavaScript 语言本身没有对XML的内置支持,必须依赖第三方的类库才能进行解析。因此,使用XML作为Ajax应用的客户端和服务端之间的数据规则,不是非常理想。
而第三种方式,是各个开发框架、类库等由开发者自行定义的规则,是私有规则,不是国际标准、规范,因此不推荐使用。
第二种方式,JSON,全称是“JavaScript Object Notation”,是一种轻量级的数据交换格式。它基于JavaScript Programming Language, Standard ECMA- 262 3rd Edition - December 1999的一个子集,是JavaScript面向对象语法的一个子集,在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, Javascript, Perl, Python等),因此易于人阅读和编写,同时也易于机器解析和生成。这些特性使JSON成为理想的数据交换语言。
JSON 的语法非常简洁直观,主要支持两种语法结构:
l “名/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object)、记录(record)、结构(struct)、字典(dictionary)、哈希表(hash table)、有键列表(keyed list),或者关联数组 (associative array)。
l 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
比如,一个用户信息的数据,用JSON 表示如下:
{
username : "andy",
age : 20,
info : { tel: "123456", cellphone : "98765"},
address :
[
{city : "beijing", postcode : "222333"},
{city : "newyork", postcode : "555666"}
]
}
确实比XML 表示方式简洁了许多。因此,在Ajax 应用中,JSON 越来越流行,应用日益广泛。
本书读者使用Java 语言进行Web 服务端程序的开发。纵观各种Ajax类库或者框架,都没有提供在Java 服务端进行JSON编码和解码的独立组件,从这些框架中提取也非常困难。而对于Ajax Web应用的开发,Ajax引擎已经由浏览器提供,如果我们再有一个独立的JSON转换组件,实现客户端JavaScript数据和服务端Java数据之间的双向转换,那么Web客户端程序与Web服务端程序之间交互所需要的通路已经完全畅通,开发Ajax应用将变得非常容易,并且我们也不受限于现有的各种Ajax框架,完全可以使用JSON转换组件,与其他组件集成,搭建满足自己需要的Web应用框架。
因此,决定设计一个通用的JSON转换组件,在Java服务器端,实现Java数据和JavaScript数据之间的双向转换。