2006 q?4 月发?/span>
q今为止Q您可能已经听过太多有关 AJAX 的宣传报道,而且很多产品都宣U它们支持或“兼容”AJAX。但是,很多人可能一直无法从技术角度对 AJAX 的实质进行简单、严谨的阐释。本文将摈弃所有华丽词藻,从^实的角度Ҏ?AJAX 的核心基q行概述?/p>
q如此?em>q程 Javascript 在最q掀起了一轮热潮。利用它Q开发h员能够?XML 数据与服务器交互。?AJAX 是一U远E?Javascript。AJAX 之所以成为可能,是因为现在许多主要的览器都提供可进行独?XML HTTP h?em>对象。Internet Explorer 5 以及更高版本提供了一?XMLHTTP 对象Q而基?Mozilla 的浏览器则提供了一?XMLHttpRequest 对象。这些对象都能够从服务器h XML 数据Qƈ以类似的方式处理q些数据。所有能够动态提?XML 的技术都可以使用服务器端 AJAX lg。Q何动?Web 技术(?PHP ?ServletQ都可以充当 AJAX 服务器? q程 Javascript ?AJAX 的缺点之一是,面作?/em>Q设计最l页面的人员Q必ȝ写相当数量的 Javascript 代码来管?XMLHTTP 交互。幸好,JavaServer Faces (JSF) 为此提供了一个解x案,从而 AJAX 更加易于使用? 只有了解?AJAX 客户?服务器事务中涉及的核?AJAX 体系l构后,方可q一步理解与其他技术(?JSFQ集成的更ؓ高?AJAX CZ? AJAX 目前可以提供以下两种核心技术: 因ؓ所有流行的览器都支持 Javascript 和必要的 XMLHTTP h对象Q且几乎所?Web 服务器技术均可生?XMLQ或M标记Q,所以核?AJAX 技术普遍适用?
最单的 AJAX 应用E序实质上就是一个带?Javascript 函数的标?HTML 用户界面Q该界面可与能动态生?XML ?HTTP 服务器进行交互。Q何动?Web 技术(?CGI ?ServletQ以及本文稍后将谈到?JSFQ都可充当服务器?AJAX 技术? 核心 AJAX 应用E序的主要组件包括: q些元素如图 1 所C?/p>
了解了关键元素后Q我们就可以设计一个包含输入域、按钮或M可链接至 Javascript 的元素的 HTML 用户界面了。例如,按下按钮可激zL?Javascript 函数Q或者更深入些,在用户向输入域键入内Ҏ可激zL?Javascript 函数。ؓ此,您可以将 onkeyup= 赋予 Javascript 函数的值来处理输入域中的数据。例如,当发?onkeyup 事gQ即键入内容Q时Q输入域“searchField”调?Javascript 函数 lookup( )? 除了响应用户界面交互Q例如键入)外,AJAX Javascript 函数q可Ҏ自己的计时器q行独立操作。(可以使用该方法执?AJAX autosaveQ自动保存)Ҏ。) 现在Q我们来了解如何调用 AJAX Javascript 代码。请看以?Javascript 代码Q该代码可发Z?XML HTTP hQ? 利用该代码断Q主要的览器(Internet Explorer ?Mozilla/SafariQ都可向服务器发出独立的 HTTP h。该代码首先查浏览器是否支持上文提及的两个支持的 XMLHTTP 对象Q然后对其中之一q行实例化? 一旦对 XMLHttpRequestQ或 Microsoft ?XMLHTTPQ进行了实例化,卛_以通过完全相同的方式对其进行操作? 要初始化到服务器的连接,需使用以下 open ҎQ? W一个参数是 HTTP ҎQ?tt>GET ?POSTQ。第二个参数是服务器Q或使用 POST 的表单操作)?URLQ第三个参数?trueQ则表明可进行异步调用(“A”代表 AJAXQ。这意味着该浏览器可以在实现请求的同时l箋执行其他操作?tt>open Ҏ中若?false |则表明ؓ非异步处理或序处理。我们不如此Q这是因为您的浏览器会在q回响应前停止操作? 使用 open 初始化连接后Q可q行 onreadystatechange 调用Q只适用于异步调用)。这注册一个回调函敎ͼ一旦请求完成就会调用该函数Q? 在完成请求后Q将调用处理 XML 响应?processXMLResponse( ) 函数。可以通过 onreadystatechange 语句以内联方式声明回调函敎ͼ q可使用 req.setRequestHeader 指定M标题内容Q如Q? 一旦完全初始化?XMLHTTP h对象 (req)Q就可?send( ) 初始化对服务器的调用Q? 对于 GET hQ?null 值或I字W串“”? POST h包含一个带有表单数据的字符串参数。它们也要求在请求的标题中设|?Content-Type。以下两行演CZ如何执行 AJAX POST hQ? 完成h后调用的回调函数通常h保h不会发生错误的代码。这可通过?readyState 以及 HTTP h的整?tt>状?/tt>来实现。(readystate ?4 表示 XMLHTTP h完整Q?200 表示h成功Q?04 含义正好相反Q? XML 响应的处理是通过使用标准 Javascript DOM Ҏ完成的。例如,要从输入?XML 中抽取员工姓名Q? 您可以用以下代码: 分析更ؓ复杂?XML 会用如下代码P代元素: h意,通过 XMLHttpRequest 获得 XML 响应无需L格式良好和有效。因此,AJAX 服务器端lg可以直接?HTML 内容发送至客户端。然后,JavaScript 可?req.responseText Ҏ/属性(它只是将内容作ؓ字符串进行检索)索该 HTML 内容。可以用该 HTML 字符串文本以M方式更改面。例如,对于以下 HTML : 可用以下语句检索至一个字W串中: 之后通过 id="div1" dx定的 HTML DIV?/p>
JSF 及其以组件ؓ中心的体pȝ构通过允许 JSF lg全权处理 Javascript 和嵌入式 AJAX“g”解决?AJAX 的固有难题。JSF 面作者甚x需x客户端与服务器之间的 AJAX 交互。它们只需像用其?JSF lg那样使用支持 AJAX ?JSF lg卛_Q而且感觉更好。JSF ?AJAX 的结合用前途光明! 保持xQ?/p>
首先QAJAX 是个C物吗Q?
Ajax Under The Hood
<input type="text" id="searchField"
size="20" onkeyup="lookup('searchField');">
如何发出 XML HTTP h
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
req = new
ActiveXObject("Microsoft.XMLHTTP");
}
req.open("GET", url, true);
req.onreadystatechange = processXMLResponse;
req.onreadystatechange = processXMLResponse() {
// process request
};
req.setRequestHeader("Cookie", "someKey=true");
req.send(null);
req.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded";
req.send("name=scott&email=stiger@foocorp.com");
function processXMLResponse() {
if (req.readyState == 4) {
if (request.status != 200) {
// Process the XML response
}
}
}
<employee>
Chris
</employee>
var name = req.responseXML.getElementsByTagName("employee")[0];
for (i=0;i<elements.length;i++) {
for (j=0;j<elements[i].childNodes.length;j++) {
var ElementData = elements[i].childNodes[j].firstChild.nodeValue;
}
}
l合使用 XMLHttpRequest ?HTML
<h2>Hello there!</h2>
<p> This is <b>HTML</b></p>
var HTMLcontent = req.responseText;
document.getElementById("div1").innerHTML += HTMLcontent;
JSF 如何支持 AJAX