try{
if(window.ActiveXObject){
for(vari=5;i;i--){
if(i==2){
xmlhttp_request=newActiveXObject("Microsoft.XMLHTTP");
}else{
xmlhttp_request=newActiveXObject("Msxml2.XMLHTTP."+i+".0");
}
break;
}catch(e){
xmlhttp_request=false;
}
}
}elseif(window.XMLHttpRequest){
xmlhttp_request=newXMLHttpRequest();
if(xmlhttp_request.overrideMimeType){
xmlhttp_request.overrideMimeType('text/xml');
}
}
}catch(e){
xmlhttp_request=false;
发送请求
可以调用HTTP请求类的open()和send()方法,如下所示:
2
xmlhttp_request.open(
'GET'
true
);
xmlhttp_request.send(
null
);
|
open()的第一个参数是HTTP请求方式—GET,POST或任何服务器所支持的您想调用的方式。按照HTTP规范,该参数要大写;否则,某些浏览器(如Firefox)可能无法处理请求。
第二个参数是请求页面的URL。
第三个参数设置请求是否为异步模式。如果是TRUE,JavaScript
函数将继续执行,而不等待服务器响应。这就是"AJAX"中的"A"。
服务器的响应
这需要告诉HTTP请求对象用哪一个JavaScript函数处理这个响应。可以将对象的onreadystatechange属性设置为要使用的JavaScript的函数名,如下所示:
1
xmlhttp_request.onreadystatechange=FunctionName;
|
FunctionName是用JavaScript创建的函数名,注意不要写成FunctionName(),当然我们也可以直接将JavaScript代码创建在onreadystatechange之后,例如:
xmlhttp_request.onreadystatechange=function(){
//JavaScript代码段
};
首先要检查请求的状态。只有当一个完整的服务器响应已经收到了,函数才可以处理该响应。XMLHttpRequest 提供了readyState属性来对服务器响应进行判断。
readyState的取值如下:
0 (未初始化)
1 (正在装载)
2 (装载完毕)
3 (交互中)
4 (完成)
所以只有当readyState=4时,一个完整的服务器响应已经收到了,函数才可以处理该响应。具体代码如下:
if (http_request.readyState == 4) { // 收到完整的服务器响应 }else { // 没有收到完整的服务器响应 }
当readyState=4时,一个完整的服务器响应已经收到了,接着,函数会检查HTTP服务器响应的状态值。完整的状态取值可参见W3C文档。当HTTP服务器响应的值为200时,表示状态正常。
处理从服务器得到的数据
有两种方式可以得到这些数据:
(1) 以文本字符串的方式返回服务器的响应
(2) 以XMLDocument对象方式返回响应
应用程序架构应用程序框架
1.1 Bindows(自从2003年)
它,通过强力联合DHTML,JavaScript,CSS和XML等技术,能生成高度交互的
互联网应用程序-成为现代的
桌面应用程序的强有力对手。Bindows应用程序不要求下载和也不需要在用户端安装-仅要求有一个浏览器(也不需要Java,Flash或者ActiveX)。Bindows有可能领导
面向对象开发的AJAX应用程序的平台。
1.2 BackBase(自从2003年)
是一个全面的浏览器端框架,支持丰富的浏览器功能以及与.NET和Java的集成。
·商业化,来自于Backbase B.V(总部在Amsterdam,成立于2003年)。
1.3 Dojo(自从2004年9月)
提供全面窗口小组件和浏览器-服务器消息支持。
·为创建定制的Javascript窗口小组件提供框架支持。
1.4 Open Rico(开发中;自从2005年5月;基于早期的私有框架)
是一多用途框架,支持Ajax基础结构和用户交互。
1.5 qooxdoo(开发中;自从2005年5月)
是另一个雄心勃勃的框架,提供宽范围的UI支持和正在开发中的基础结构特性。
1.6 Tibet(开发中;自从2005年6月)
目的是提供高度可移植的和全面的Javascript API,结果是,可能自动生成大量的客户端代码。自称是"企业级Ajax"。
基础结构框架
2.1 AjaxCaller(
Alpha版本;自从2005年
5月)
是一基本的线程安全的XMLHttpRequest包装器,主要针对Ajax新手,仍处于原始的alpha开发阶段,
2.2 Flash JavaScript集成包
允许JavaScript和Flash内容的集成
2.3 Google AJAXSLT(发行于2005年6月)
是一个Javascript框架,用来执行XSLT转换以及XPath查询。
2.4 HTMLHttpRequest(Beta版;始于2005年)
HtmlHttpRequest(),它使用了XMLHttpRequest和Iframes以改进兼容性。
2.5 交互式网站框架(自从2005年5月)
交互式网站框架,是一个项目,目的是从浏览器端对Ajax基础结构的多方面予以支持。自描述为"使用javascript,css,xml,和html来创造高度交互网站的框架。包括一个定制的针对高度可读的javascript的xml分析器。实质上,是建立基于AJAX的网站的基础,还有另外一些通用脚本"。
2.6 LibXMLHttpRequest(发行于2003年6月)
/connector?file=reference/2003/06/17/libXmlRequest.html),是XMLHttpRequest的一个瘦包装器。
2.7 RSLite(x)
网站是:http/rs/main.htm,是一个针对XMLHttpRequest的瘦包装器。
2.8 Sack(在开发中,自从2005年5月)
网站是:/2005/05/sack-of-ajax/,是一个针对XMLHttpRequest的瘦包装器。
2.9 Sarissa(发行于2003年,2月)
网站是:http,是一种Javascript API,它封装了在浏览器端可以独立调用XML的功能。
2.10 XHConn(发行于自从2005年,4月)
网站是:/javascript/XHConn/,是一个对XMLHttpRequest的瘦包装器。
2.11 jQuery
简洁的思想:几乎所有操作都是以选择DOM元素(有强大的Selector)开始,然后是对其的操作(Chaining等特性)。
服务器端:多种语言
3.1 跨平台异步的接口
工具箱(2005年
5月)
CPAINT:,是一真正的支持PHP和ASP/Vbscript的Ajax实现和JSRS(JavaScript远程脚本)实现。CPAINT提供给你需求的代码在后台实现AJAX和JSRS,而返回的数据以JavaScript形式在前台操作,格式化和显示。这允许你创建能提供接近实时的反馈给用户的
web应用程序。
3.2 SAJAX(可用,但是不是1.0版本;自从2005年3月)
网站是:http:///sajax/,直接把调用从Javascript发送到你的服务器端语言并再次回返。
3.3 Javascipt对象标志(JSON)和JSON-RPC
JSON(http/index.html),是一个"胖的自由的XML选择",而JSON-RPC(/)是一种远程过程协议,类似于
XML-RPC,强有力支持Javascript客户。
3.4 Javascript远程脚本(JSRS)(自从2000年)
网址是:http/
test.htm,直接把调用从Javascript发送到你的服务器端语言并再次回返。
服务器端:Java
4.1 WebORB for Java(自从2005年8月)
网址:http://weborb/aboutWeborb.htm,是一个平台,支持开发AJAX和基于Flash的
胖客户端应用程序,并可以把它们与Java对象和XML Web服务相系起来。在线举例(http)
4.2 Echo 2(自从2005年3月)
网址是:http:///,允许你用纯Java代码编写Ajax
应用软件(范例(http://demo./ia))。
4.3 Direct Web Remoting (DWR)(2005年)
网址是:http/,是一个框架,用于直接从Javascript代码中调用Java方法。
4.4 SWATO(2005年)
网址是/,是一套可重用的和良好集成的Java/JavaScript库,它实现了一种更容易的方式来改变你的web应用程序的交互,它是通过AJAX方式实现。
服务器端:Lisp
5.1 CL-Ajax
网址,实现Javascript直接调用服务器端Lisp函数。
服务器端:.NET
6.1 WebORB(自从2005年8月)
网址:/aboutWeborb.htm,是一个平台,用于开发AJAX和基于Flash的胖客户端应用程序,并能把它们连接到.NET对象和XML Web服务。(在线举例(http://))
6.2(自从2005年3月)
网址是:http/,是一个库,实现从Javascript到服务器端.NET的存取。
服务器端:PHP
7.1 AjaxAC(自从2005年4月)
网址是:/,用单个的PHP类封装了完整的应用程序。
7.2 JPSpan
网址是:http,直接把Javascript调用传递到PHP函数。
7.3 XAJAX
服务器端:Ruby
Ruby On Rails/)是一个通常的强力支持Ajax的web框架:
实例展示XMLHttpRequest 对象
通过使用 XMLHttpRequest 对象,web 开发者可以做到在页面已加载后从服务器更新页面!
在 2005 年 AJAX 被 Google 推广开来(Google Suggest)。
Google 建议使用 XMLHttpRequest 对象来创建一种动态性极强的 web 界面:当您开始在 Google 的搜索框中输入查询时,JavaScript 会向某个服务器发出这些字词,然后服务器会返回一系列的搜索建议。
XMLHttpRequest 对象得到下列浏览器的支持:Internet Explorer 5.0+、Safari 1.2、Mozilla 1.0 / Firefox、Opera 8+ 以及 Netscape 7。
AJAX Http 请求
Previous PageNext Page
AJAX 使用 Http 请求 在传统的 JavaScript 编程中,假如您希望从服务器上的文件或数据库中得到任何的信息,或者向服务器发送信息的话,就必须利用一个 HTML 表单向服务器 GET 或 POST 数据。而用户则需要单击“提交”按钮来发送/获取信息,等待服务器的响应,然后一张新的页面会加载结果。
由于每当用户提交输入后服务器都会返回一张新的页面,传统的 web 应用程序变得运行缓慢,且越来越不友好。
通过利用 AJAX,您的 JavaScript 会通过 JavaScript 的
XMLHttpRequest对象,直接与服务器来通信。
通过使用 HTTP 请求,web 页可向服务器进行请求,并得到来自服务器的响应,而不加载页面。用户可以停留在同一个页面,他或她不会注意到脚本在后台请求过页面,或向服务器发送过数据。
您的第一个 AJAX 应用程序
为了让您理解 AJAX 的工作原理,我们将创建一个小型的 AJAX 应用程序。
首先,我们需要一个带有两个文本框的 HTML 表单:用户名和时间。用户名文本框由用户填写,而时间文本框使用 AJAX 进行填写。
此 HTML 文件名为 "testAjax.htm"(请注意这个 HTML 表单没有提交按钮!):
8
<
html
body
>
formname
"myForm"
>
用户:<
inputtype
"text"
name
"username"
/>
时间:<
"time"
/>
form
>
>
我们将在下一节解释 AJAX 的基本原理。
AJAX 浏览器支持
AJAX - 浏览器支持 AJAX 的要点是 XMLHttpRequest 对象。
不同的浏览器创建 XMLHttpRequest 对象的方法是有差异的。
IE 浏览器使用
ActiveXObject,而其他的浏览器使用名为
XMLHttpRequest的 JavaScript 内建对象。
如需针对不同的浏览器来创建此对象,我们要使用一条 "try and catch" 语句。您可以在我们的 JavaScript 教程中阅读更多有关try 和 catch 语句的内容。
让我们用这段创建 XMLHttpRequest 对象的 JavaScript 来更新一下我们的 "testAjax.htm" 文件:
27
scripttype
"text/javascript"
functionajaxFunction(){
varxmlHttp;
try{//Firefox,Opera8.0+,Safari
xmlHttp=newXMLHttpRequest();
}catch(e){//InternetExplorer
try{
xmlHttp=newActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
xmlHttp=newActiveXObject("Microsoft.XMLHTTP");
}catch(e){
alert("您的浏览器不支持AJAX!");
returnfalse;
}
script
>
>
/>
/>
>
>
例子解释:
首先声明一个保存 XMLHttpRequest 对象的 xmlHttp 变量。
然后使用 XMLHttp=new XMLHttpRequest() 来创建此对象。这条语句针对 Firefox、Opera 以及 Safari 浏览器。假如失败,则尝试针对 Internet Explorer 6.0+ 的 xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"),假如也不成功,则尝试针对 Internet Explorer 5.5+ 的 xmlHttp=new ActiveXObject("Microsoft.XMLHTTP")。
假如这三种方法都不起作用,那么这个用户所使用的浏览器已经太过时了,他或她会看到一个声明此浏览器不支持 AJAX 的提示。
注释:上面这些浏览器定制的代码很长,也很复杂。不过,每当您希望创建 XMLHttpRequest 对象时,这些代码就能派上用场,因此您可以在任何需要使用的时间拷贝粘贴这些代码。上面这些代码兼容所有的主流浏览器:Internet Explorer、Opera、Firefox 以及 Safari。
下一节为您展示如何使用 XMLHttpRequest 对象与服务器进行通信。
AJAX - XMLHttpRequest 对象
AJAX - 更多有关 XMLHttpRequest 对象的知识
在向服务器发送数据之前,我们有必要解释一下 XMLHttpRequest 对象的三个重要的属性。
onreadystatechange 属性
onreadystatechange 属性存有处理服务器响应的函数。下面的代码定义一个空的函数,可同时对 onreadystatechange 属性进行设置:
xmlHttp.onreadystatechange=
(){
readyState 属性
readyState 属性存有服务器响应的状态信息。每当 readyState 改变时,onreadystatechange 函数就会被执行。
这是 readyState 属性可能的值:
?
0
请求未初始化(在调用 open() 之前)
1
请求已提出(调用 send() 之前)
2
请求已发送(这里通常可以从响应得到内容头部)
3
请求处理中(响应中通常有部分数据可用,但是服务器还没有完成响应)
4
请求已完成(可以访问服务器响应并使用它)
我们要向这个 onreadystatechange 函数添加一条 If 语句,来测试我们的响应是否已完成(意味着可获得数据):
5
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4){
//从服务器的response获得数据
}
responseText 属性
可以通过 responseText 属性来取回由服务器返回的数据。
在我们的代码中,我们将把时间文本框的值设置为等于 responseText:
(){
if
(xmlHttp.readyState==4){
document.myForm.time.value=xmlHttp.responseText;
}
下一节,我们会介绍如何向服务器请求数据!
AJAX - 请求服务器
AJAX - 向服务器发送一个请求
要想把请求发送到服务器,我们就需要使用 open() 方法和 send() 方法。
open() 方法需要三个参数。第一个参数定义发送请求所使用的方法(GET 还是 POST)。第二个参数规定服务器端脚本的 URL。第三个参数规定应当对请求进行异步地处理。
send() 方法可将请求送往服务器。如果我们假设 HTML 文件和 ASP 文件位于相同的目录,那么代码是这样的:
xmlHttp.open("GET","time.asp",true);xmlHttp.send(null);
我们必须决定何时执行 AJAX 函数。当用户在用户名文本框中键入某些内容时,我们会令函数“在幕后”执行。
34
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4){
document.myForm.time.value=xmlHttp.responseText;
}
}
xmlHttp.open("GET",true);
xmlHttp.send(null);
}
>
>
"username"
onkeyup
"ajaxFunction();"
/>
/>
>
>
下一节介绍 "time.asp" 的脚本,这样我们完整的 AJAX 应用程序就搞定了。
AJAX -服务器端的脚本
AJAX - 服务器端的脚本
现在,我们要创建可显示当前服务器时间的脚本。
responseText 属性会存储从服务器返回的数据。在这里,我们希望传回当前的时间。
这是 "time.asp" 的代码:
<% response.expires=-1;response.write(time)%>
注释:Expires 属性可设置在页面缓存失效前页面被缓存的时间(分钟)。Response.Expires=-1 指示页面不会被缓存。
运行您的 AJAX 应用程序
请在下面的文本框中键入一些文本,然后单击时间文本框:
用户: 时间:
时间文本框可在不加载页面的情况下从 "time.asp" 获得服务器的时间!
问题及对策浏览器兼容性问题
Ajax在本质上是一个浏览器端的技术,首先面临无可避免的第一个问题即是浏览器的兼容性问题。各家浏览器对于JavaScript/DOM/CSS的支持总有部分不太相同或是有Bug,甚至同一浏览器的各个版本间对于JavaScript/DOM/CSS的支持也有可能部分不一样。这导致程序员在写Ajax应用时花大部分的时间在调试浏览器的兼容性而非在应用程序本身。因此,目大部分的Ajax链接库或开发框架大多以js链接库的形式存在,以定义更高阶的JavaScript API 、JavaScript对象(模板)、或者JavaScript Widgets来解决此问题。如
prototype.js。
业务逻辑分散
Ajax技术之主要目的在于局部交换客户端及服务器之间的数据。如同传统之主从架构,无可避免的会有部分的
业务逻辑会实现在客户端,或部分在客户端部分在服务器。由于业务逻辑可能分散在客户端及服务器,且以不同之
程序语言实现,这导致Ajax应用程序极难维护。如有用户接口或业务逻辑之更动需求,再加上前一个JavaScript/DOM/CSS之兼容性问题,Ajax应用往往变成程序员的梦魇。针对业务逻辑分散的问题,Ajax开发框架大致可分为两类:
[1]将业务逻辑及表现层放在浏览器,数据层放在服务器:因为所有的程序以JavaScript执行在客户端,只有需要数据时才向服务器要求服务,此法又称为胖客户端(fat client)架构。服务器在此架构下通常仅用于提供及储存数据。此法的好处在于程序员可以充分利用JavaScript搭配业务逻辑来做出特殊的用户接口,以符合终端用户的要求。但是问题也不少,主因在第一,JavaScript语言本身之能力可能不足以处理复杂的业务逻辑。第二,JavaScript的执行效能一向不好。第三,JavaScript访问服务器数据,仍需适当的服务器端程序之配合。第四,浏览器兼容性的问题又出现。有些Ajax开发框架如DWR企图以自动生成JavaScript之方式来避免兼容的问题,并开立通道使得JavaScript可以直接调用服务器端的Java程序来简化数据的访问。但是前述第一及第二两个问题仍然存在,程序员必须费相当的力气才能达到应用程序之规格要求,或可能根本无法达到要求。
[2]将表现层、业务逻辑、及数据层放在服务器,浏览器仅有用户接口引擎(User Interface engine);此法又称为
瘦客户端(thin client)架构,或中心服务器(server-centric)架构。浏览器的用户接口引擎仅用于反映服务器的表现层以及传达用户的输入回到服务器的表现层。由浏览器所触发之事件亦送回服务器处理,根据业务逻辑来更新表现层,然后反映回浏览器。因为所有应用程序完全在服务器执行,数据及表现层皆可直接访问,程序员只需使用服务器端相对较成熟之程序语言(如
Java语言)即可,不需再
学习JavaScript/DOM/CSS,在开发应用程序时相对容易。缺点在于用户接口引擎以及表现层通常以标准组件的形式存在,如需要特殊组件(用户接口)时,往往须待原框架之开发者提供,缓不济急。如开源码Ajax开发框架ZK支持
XUL及
XHTML组件,尚无XAML之支持。多进程或多线程的竞争问题
Ajax是以异步的方式向
服务器提交需求。对服务器而言,其与传统的提交
窗体需求并无不同,而且由于是以异步之方式提交,如果同时有多个Ajax需求及窗体提交需求,将无法保证哪一个需求先获得服务器的响应。这会造成应用程序典型的多进程(process)或多线程(thread)的竞争(racing)问题。程序员因此必须自行处理或在JavaScript里面动手脚以避免这类竞争问题的发生(如Ajax需求未响应之前,先disable送出按钮),这又不必要的增加了程序员的负担。已知有自动处理此问题之开发框架似乎只有ZK。
AJAX中文传值乱码问题解决方法
在浏览器端对要传递的中文参数进行编码处理.代码如下:
xmlhttp.open("POST","AjaxServlet",true);//请求参数初始化
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.send("str="+encodeURI(encodeURI("安安DIY创作室")));//
向服务器端发送参数
在服务器端代码:
4
PrintWriterout=response.getWriter();
Stringstr=request.getParameter(
"str"
);
Stringstr2=URLDecoder.decode(str,
"utf-8"
//对得到的参数进行解码
System.
out
.print(str);
|
|
应用
?SAP OnDemand Solutions |
?Google Apps |
?Microsoft Online |
?NetSuite |
?SalesForce |
|
|
|
平台
?App Engine
?Windows Azure |
?Engine Yard |
?Force.com |
?Heroku |
?MTurk |
?RightScale |
?Amazon S3 |
?SimpleDB |
?SQS |
|
|
|
|
|
基础设施
?EC2
?Eucalyptus |
?FlexiScale |
?GoGrid |
?Nimbus |
?OpenStack |
?Rackspace Cloud |
?VPC |
|
|
|
技术
?网络
?数据中心 |
?分散式档案系统 |
?硬件虚拟化 |
?Web服务 |
?虚拟设备 |
?多租户技术 |
|
|
|
|
标准
?Ajax
?Atom |
?HTML5 |
?REST |
?XMPP |
?BitTorrent |
|
|
|
|
|