﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Java Tools-随笔分类-Ajax</title><link>http://www.blogjava.net/simie/category/23723.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 02 Jul 2007 23:19:21 GMT</lastBuildDate><pubDate>Mon, 02 Jul 2007 23:19:21 GMT</pubDate><ttl>60</ttl><item><title>AJAX 非宣传性简介</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127665.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 11:55:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127665.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127665.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127665.html</trackback:ping><description><![CDATA[<em>作者：Chris Schalk</em>
<p>
<h4>AJAX 核心基础技术的真实概述。</h4>
<p><span class=legalese>2006 年 4 月发布</span>
<p>迄今为止，您可能已经听过太多有关 AJAX 的宣传报道，而且很多产品都宣称它们支持或&#8220;兼容&#8221;AJAX。但是，很多人可能一直无法从技术角度对 AJAX 的实质进行简单、严谨的阐释。本文将摈弃所有华丽词藻，从平实的角度对构成 AJAX 的核心基础进行概述。</p>
<p>&#160;</p>
<h2>首先，AJAX 是个新事物吗？ </h2>
<p>并非如此。<em>远程 Javascript</em> 在最近掀起了一轮热潮。利用它，开发人员能够使用 XML 数据与服务器交互。而 AJAX 就是一种远程 Javascript。AJAX 之所以成为可能，是因为现在许多主要的浏览器都提供可进行独立 XML HTTP 请求的<em>对象</em>。Internet Explorer 5 以及更高版本提供了一个 <strong>XMLHTTP</strong> 对象，而基于 Mozilla 的浏览器则提供了一个 <strong>XMLHttpRequest</strong> 对象。这些对象都能够从服务器请求 XML 数据，并以类似的方式处理这些数据。所有能够动态提供 XML 的技术都可以使用服务器端 AJAX 组件。任何动态 Web 技术（从 PHP 到 Servlet）都可以充当 AJAX 服务器。 </p>
<p>&#160;</p>
<p>远程 Javascript 与 AJAX 的缺点之一是，<em>页面作者</em>（设计最终页面的人员）必须编写相当数量的 Javascript 代码来管理 XMLHTTP 交互。幸好，JavaServer Faces (JSF) 为此提供了一个解决方案，从而使 AJAX 更加易于使用。 </p>
<h2>Ajax Under The Hood<strong> </strong></h2>
<p>只有了解了 AJAX 客户端-服务器事务中涉及的核心 AJAX 体系结构后，方可进一步理解与其他技术（如 JSF）集成的更为高级的 AJAX 示例。 </p>
<p>AJAX 目前可以提供以下两种核心技术： </p>
<ul>
    <li>支持 Javascript 和支持 XMLHTTP 和 XMLHttpRequest 对象的浏览器
    <li>能够以 XML 响应的 HTTP 服务器技术 </li>
</ul>
<p>因为所有流行的浏览器都支持 Javascript 和必要的 XMLHTTP 请求对象，且几乎所有 Web 服务器技术均可生成 XML（或任何标记），所以核心 AJAX 技术普遍适用。
<p>最简单的 AJAX 应用程序实质上就是一个带有 Javascript 函数的标准 HTML 用户界面，该界面可与能动态生成 XML 的 HTTP 服务器进行交互。任何动态 Web 技术（从 CGI 到 Servlet，以及本文稍后将谈到的 JSF）都可充当服务器端 AJAX 技术。 </p>
<p>核心 AJAX 应用程序的主要组件包括： </p>
<ul>
    <li>HTML 页面，其中包含：
    <ul>
        <li>与 AJAX Javascript 函数交互的 UI 元素
        <li>与 AJAX 服务器交互的 Javascript 函数 </li>
    </ul>
    <li>可处理 HTTP 请求并以 XML 标记响应的服务器端 Web 技术。 </li>
</ul>
<p>这些元素如图 1 所示。</p>
<p align=center><img alt="图 1" src="http://www.oracle.com/technology/pub/images/schalk-ajax-f1.jpg"></p>
<div align=center><strong>图 1</strong> 核心 AJAX 体系结构 </div>
<p>了解了关键元素后，我们就可以设计一个包含输入域、按钮或任何可链接至 Javascript 的元素的 HTML 用户界面了。例如，按下按钮可激活某个 Javascript 函数，或者更深入些，在用户向输入域键入内容时可激活某个 Javascript 函数。为此，您可以将 onkeyup= 赋予 Javascript 函数的值来处理输入域中的数据。例如，当发生 onkeyup 事件（即键入内容）时，输入域&#8220;searchField&#8221;将调用 Javascript 函数 lookup( )。 </p>
<pre>&lt;input type="text" id="searchField"
size="20" onkeyup="lookup('searchField');"&gt;
</pre>
<p>除了响应用户界面交互（例如键入）外，AJAX Javascript 函数还可根据自己的计时器进行独立操作。（可以使用该方法执行 AJAX <em>autosave</em>（自动保存）特性。） </p>
<h2>如何发出 XML HTTP 请求<strong> </strong></h2>
<p>现在，我们来了解如何调用 AJAX Javascript 代码。请看以下 Javascript 代码，该代码可发出一个 XML HTTP 请求： </p>
<pre>if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
req = new
ActiveXObject("Microsoft.XMLHTTP");
}   </pre>
<p>利用该代码断，主要的浏览器（Internet Explorer 和 Mozilla/Safari）都可向服务器发出独立的 HTTP 请求。该代码首先检查浏览器是否支持上文提及的两个支持的 XMLHTTP 对象，然后对其中之一进行实例化。 </p>
<p>一旦对 XMLHttpRequest（或 Microsoft 的 XMLHTTP）进行了实例化，即可以通过完全相同的方式对其进行操作。 </p>
<p>要初始化到服务器的连接，需使用以下 <tt>open</tt> 方法： </p>
<pre>req.open("GET", url, true);
</pre>
<p>第一个参数是 HTTP 方法（<tt>GET </tt>或 <tt>POST</tt>）。第二个参数是服务器（或使用 POST 的表单操作）的 URL；第三个参数为 <tt>true</tt>，则表明可进行异步调用（&#8220;A&#8221;代表 AJAX）。这意味着该浏览器可以在实现请求的同时继续执行其他操作。<tt>open</tt> 方法中若为 <tt>false</tt> 值，则表明为非异步处理或顺序处理。我们不建议如此，这是因为您的浏览器会在返回响应前停止操作。 </p>
<p>使用 <tt>open</tt> 初始化连接后，可进行 onreadystatechange 调用（只适用于异步调用）。这将注册一个回调函数，一旦请求完成就会调用该函数： </p>
<pre>
req.onreadystatechange = processXMLResponse;
</pre>
<p>在完成请求后，将调用处理 XML 响应的 processXMLResponse( ) 函数。可以通过 onreadystatechange 语句以内联方式声明回调函数： </p>
<pre>req.onreadystatechange = processXMLResponse() {
// process request
};
</pre>
<p>还可使用 req.setRequestHeader 指定任何标题内容，如： </p>
<pre>
req.setRequestHeader("Cookie", "someKey=true");
</pre>
<p>一旦完全初始化了 XMLHTTP 请求对象 (req)，就可使用 send( ) 初始化对服务器的调用： </p>
<pre>req.send(null);
</pre>
<p>对于 <tt>GET</tt> 请求，使用 null 值或空字符串&#8220;&#8221;。 </p>
<p><tt>POST</tt> 请求包含一个带有表单数据的字符串参数。它们也要求在请求的标题中设置 Content-Type。以下两行演示了如何执行 AJAX POST 请求： </p>
<pre>req.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded";
req.send("name=scott&amp;email=stiger@foocorp.com");
</pre>
<p>完成请求后调用的回调函数通常具有确保请求不会发生错误的代码。这可通过检查 readyState 以及 HTTP 请求的整体<tt>状态</tt>来实现。（readystate 为 4 表示 XMLHTTP 请求<tt>完整</tt>，而 200 表示请求<tt>成功</tt>（404 含义正好相反）。 </p>
<pre>function processXMLResponse() {
if (req.readyState == 4) {
if (request.status != 200) {
// Process the XML response
}
}
}
</pre>
<p>XML 响应的处理是通过使用标准 Javascript DOM 方法完成的。例如，要从输入的 XML 流中抽取员工姓名： </p>
<pre>&lt;employee&gt;
Chris
&lt;/employee&gt;
</pre>
<p>您可以使用以下代码： </p>
<pre>var name = req.responseXML.getElementsByTagName("employee")[0];
</pre>
<p>分析更为复杂的 XML 会使用如下代码迭代元素： </p>
<pre>for (i=0;i&lt;elements.length;i++) {
for (j=0;j&lt;elements[i].childNodes.length;j++) {
var ElementData = elements[i].childNodes[j].firstChild.nodeValue;
}
}
</pre>
<h2>结合使用 XMLHttpRequest 和 HTML</h2>
<p>请注意，通过 XMLHttpRequest 获得 XML 响应无需总是格式良好和有效。因此，AJAX 服务器端组件可以直接将 HTML 内容发送至客户端。然后，JavaScript 可使用 req.responseText 方法/属性（它只是将内容作为字符串进行检索）检索该 HTML 内容。可以使用该 HTML 字符串文本以任何方式更改页面。例如，对于以下 HTML 流：</p>
<pre>&lt;h2&gt;Hello there!&lt;/h2&gt;<br>
&lt;p&gt; This is &lt;b&gt;HTML&lt;/b&gt;&lt;/p&gt;
</pre>
<p>可使用以下语句检索至一个字符串中：</p>
<pre>var HTMLcontent = req.responseText;
</pre>
<p>之后通过 id="div1" 添加至指定的 HTML DIV。</p>
<pre>document.getElementById("div1").innerHTML += HTMLcontent;
</pre>
<p>
<h2>JSF 如何支持 AJAX<strong> </strong></h2>
<p>JSF 及其以组件为中心的体系结构通过允许 JSF 组件全权处理 Javascript 和嵌入式 AJAX&#8220;管件&#8221;解决了 AJAX 的固有难题。JSF 页面作者甚至无需关注客户端与服务器之间的 AJAX 交互。它们只需像使用其他 JSF 组件那样使用支持 AJAX 的 JSF 组件即可，而且感觉更好。JSF 与 AJAX 的结合使用前途光明！ </p>
<p>保持关注！</p>
<img src ="http://www.blogjava.net/simie/aggbug/127665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 19:55 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>