AJAX 老酒依然醇香
AJAX 实战
下面,我们通过具体的应用来体验一下如何集成 AJAX 和 Servlet,来增强 WEB 应用的敏捷性和与用户动态交互的能力,综合利用这两种分别处于客户端和服务器端的技术,可谓是当前WEB应用中一个理想的解决方案,该方案的框架图如下所示:

图2 AJAX与Servlet的集成
AJAX 的核心就是 XMLHttpRequest 对象,与传统的请求/响应模式不同,AJAX 是通过 AJAX 引擎与 Servlet 容器进行异步交互,而这一交互机制的具体细节可以通过下面的序列图来描述。

图3 AJAX与Servlet之间的异步交互
首先是通过 JavaScript 事件处理函数创建 XMLHttpRequest 对象,该对象的创建根据不同浏览器有不同的方式,当然,我们需要一个健壮的程序来使之支持所有的浏览器,可以参考下面的代码:
var xmlHttp = false;
try ...{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) ...{
try ...{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) ...{
xmlHttp = false;
}
}
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') ...{
xmlHttp = new XMLHttpRequest();
}
这样我们就可以支持多浏览器的XMLHttpRequest对象,它可以将用户在与浏览器交互过程中触发的AJAX请求发送到服务器端的Servlet组件,但是,一定要先进行相应的属性设置和方法调用,使其处于正确的就绪状态下。以下是一个发送AJAX 请求的JavaScript函数:
function SearchUser()
...{
//获取 XMLHttpRequest对象xmlHttp,参见上述代码
xmlHttp.onreadystatechange = updateUser; //注册回调函数
xmlHttp.open("POST","servletUser.do", true); //异步请求servlet
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); //设置数据格式
var userID = document.getElementById("userID").value; //获取参数
xmlHttp.send("userID=" + userID); // 发送请求
}
上面的函数 SearchUser() 是一个在表单控件中非常典型的 AJAX 请求发送函数,它实现了图3 中由1到7的一系列步骤。XMLHttpRequest 对象的 open() 方法实现了对服务器端的异步请求,而通过属性 onreadystatechange 注册的回调函数则根据请求处理的返回结果对页面进行相应更新,正是这种异步的请求/响应模式避免了用户等待服务器端处理请求的过程,提高了 WEB 应用的敏捷性和用户体验。