五、 处 理 请 求
在 这 个示例中,因 为 HTTP 方法是 GET ,所以在服 务 器端的接收 servlet 将 调 用一个 doGet() 方法, 该 方法将 检 索在 URL 中指定的 catalogId 参数 值 ,并且从一个数据 库 中 检查 它的有效性。
本文示例中的 这 个 servlet 需要构造一个 发 送到客 户 端的响 应 ;而且, 这 个示例返回的是 XML 类 型,因此,它把响 应 的 HTTP 内容 类 型 设 置 为 text/xml 并且把 Cache-Control 头 部 设 置 为 no-cache 。 设 置 Cache-Control 头 部可以阻止 浏览 器 简单 地从 缓 存中重 载页 面。
public void doGet(HttpServletRequest request, |
来自于服 务 器端的响 应 是一个 XML DOM 对 象,此 对 象将 创 建一个 XML 字符串 - 其中包含要在客 户 端 进 行 处 理的指令。另外, 该 XML 字符串必 须 有一个根元素。
out.println("< catalogId> valid< /catalogId> "); |
【注意】 XMLHttpRequest 对 象的 设计 目的是 为 了 处 理由普通文本或 XML 组 成的响 应 ;但是,一个响 应 也可能是另外一 种类 型,如果用 户 代理 (UA) 支持 这种 内容 类 型的 话 。
当 请 求状 态 改 变时 , XMLHttpRequest 对 象 调 用使用 onreadystatechange 注册的事件 处 理器。因此,在 处 理 该 响 应 之前,你的事 件 处 理器 应该 首先 检查 readyState 的 值 和 HTTP 状 态 。当 请 求完成加 载 ( readyState 值为 4 )并且响 应 已 经 完成( HTTP 状 态 为 "OK" ) 时 ,你就可以 调 用一个 JavaScript 函数来 处 理 该 响 应 内容。 下列脚本 负责 在响 应 完成 时检查 相 应 的 值 并 调 用一个 processResponse()方法。
function processRequest(){ |
该 processResponse()方法使用 XMLHttpRequest对 象的 responseXML和 responseText属性来 检 索 HTTP响 应 。如上面所解 释 的, 仅 当在响 应 的媒体 类 型是 text/xml, application/xml或以 +xml结 尾 时 , 这 个 responseXML才可用。 这 个 responseText 属性将以普通文本形式返回响 应 。 对 于一个 XML 响 应 ,你将按如下方式 检 索内容:
var msg=xmlHttpReq.responseXML; |
借助于存 储 在 msg变 量中的 XML,你可以使用 DOM方法 getElementsByTagName()来 检 索 该 元素的 值 :
var catalogId=msg.getElementsByTagName("catalogId")[0].firstChild.nodeValue; |
最后,通 过 更新 Web页 面的 validationMessage div中的 HTML内容并借助于 innerHTML属性,你可以 测试该 元素 值 以 创 建一个要 显 示 的消息:
if(catalogId=="valid"){ |
六、 小 结
上面就是 XMLHttpRequest 对 象使用的所有 细节实现 。通 过 不必把 Web 页 面寄送到服 务 器而 实现 数据 传 送, XMLHttpRequest 对 象 为 客 户 端与服 务 器之 间 提供了一 种动态 的交互能力。你可以使用 JavaScript 启 动 一个 请 求并 处 理相 应 的返回 值 ,然后使用 浏览 器的 DOM 方法更新 页 面中的 数据。