Ajax -- 原理及简单示例

1. 什么是Ajax

Ajax 被认为是 (AsynchronousJavaScript and XML 的缩写)。现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做 Ajax.
2. Ajax 原理
AJAX 采用异步交互过程。 AJAX 在用户与服务器之间引入一个中间媒介,从而消除了网络交互过程中的处理 等待 处理 等待缺点。
用户的浏览器在执行任务时即装载了 AJAX 引擎。 AJAX 引擎用 JavaScript 语言编写,通常藏在一个隐藏的框架中。它负责编译用户界面及与服务器之间的交互。
AJAX 引擎允许用户与应用软件之间的交互过程异步进行,独立于用户与网络服务器间的交流 现在,可以用 Javascript 调用 AJAX 引擎来代替产生一个 HTTP 的用户动作, 内存中的数据编辑、页面导航、数据校验这些不需要重新载入整个页面的需求可以交给 AJAX 来执行。
使用 AJAX ,可以为 JSP 、开发人员、终端用户带来可见的便捷:
3. Ajax的缺陷

AJAX不是完美的技术。也存在缺陷

AJAX大量使用了JavascriptAJAX引擎,而这个取决于浏览器的支持。IE5.0及以上、Mozilla1.0NetScape7及以上版本才支持,Mozilla虽然也支持AJAX,但是提供XMLHttpRequest的方式不一样。所以,使用AJAX的程序必须测试针对各个浏览器的兼容性。

AJAX更新页面内容的时候并没有刷新整个页面,因此,网页的后退功能是失效的;有的用户还经常搞不清楚现在的数据是旧的还是已经更新过的。这个就需要在明显位置提醒用户数据已更新

对流媒体的支持没有FLASHJava Applet好。

一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax

4. XMLHttpRequest对象


利用 XMLHttpRequest 实例与服务器进行通信包含以下 3 个关键部分:
onreadystatechange:
该事件处理函数由服务器触发,而不是用户
Ajax 执行过程中,服务器会通知客户端当前的通信状态。这依靠更新 XMLHttpRequest 对象的 readyState 来实现。 改变 readyState 属性是服务器对客户端连接操作的一种方式。
每次 readyState 属性的改变都会触发 readystatechange 事件
open(method,url, asynch)
XMLHttpRequest 对象的 open 方法允许程序员用一个 Ajax 调用向服务器发送请求
method :请求类型,类似 “ GET” 或” POST” 的字符串。若只想从服务器检索一个文件,而不需要发送任何数据,使用 GET( 可以在 GET 请求里通过附加在 URL 上的查询字符串来发送数据,不过数据大小限制为 2000 个字符 ) 。若需要向服务器发送数据,用 POST
在某些情况下,有些浏览器会把多个 XMLHttpRequest 请求的结果缓存在同一个 URL 。如果对每个请求的响应不同,这就会带来不好的结果。把当前时间戳追加到 URL 的最后,就能确保 URL 的惟一性,从而避免浏览器缓存结果
url :路径字符串,指向你所请求的服务器上的那个文件。可以是绝对路径或相对路径。
asynch :表示请求是否要异步传输,默认值为 true( 异步 ) 。指定 true ,在读取后面的脚本之前,不需要等待服务器的相应。指定 false ,当脚本处理过程经过这点时,会停下来,一直等到 Ajax 请求执行完毕再继续执行
send(data)
open 方法定义了 Ajax 请求的一些细节。 send 方法可为已经待命的请求发送指令
data :将要传递给服务器的字符串。
若选用的是 GET 请求,则不会发送任何数据, 给 send 方法传递 null 即可 request.send(null);
当向 send() 方法提供参数时,要确保 open() 中指定的方法是 POST ,如果没有数据作为请求体的一部分发送,则使用 null.
setRequestHeader(header,value)
当浏览器向服务器请求页面时,它会伴随这个请求发送一组首部信息。这些首部信息是一系列描述请求的元数据 (metadata) 首部信息用来声明一个请求是 GET 还是 POST
Ajax 请求中,发送首部信息的工作可以由 setRequestHeader 完成
参数 header : 首部的名字 参数 value :首部的值。
如果用 POST 请求向服务器发送数据,需要将“ Content-type” 的首部设置为“ application/x-www-form-urlencoded”. 它会告知服务器正在发送数据,并且数据已经符合 URL 编码了。
该方法必须在 open() 之后才能调用
readyState
readyState 属性 表示 Ajax 请求的当前状态 。它的值用数字代表
0 代表未初始化。 还没有调用 open 方法
1 代表正在加载。 open 方法已被调用,但 send 方法还没有被调用
2 代表已加载完毕。 send 已被调用。请求已经开始
3 代表交互中。服务器正在发送响应
4 代表完成。响应发送完毕
每次 readyState 值的改变,都会触发 readystatechange 事件 。如果把 onreadystatechange 事件处理函数赋给一个函数,那么每次 readyState 值的改变都会引发该函数的执行。
readyState 值的变化会因浏览器的不同而有所差异。 但是,当请求结束的时候,每个浏览器都会把 readyState 的值统一设为 4
status
服务器发送的每一个响应也都带有首部信息。三位数的状态码是服务器发送的响应中最重要的首部信息,并且属于超文本传输协议中的一部分。
常用状态码及其含义:
404 没找到页面 (not found)
403 禁止访问 (forbidden)
500 内部服务器出错 (internal service error)
200 一切正常 (ok)
304 没有被修改 (not modified)( 服务器返回 304 状态,表示源文件没有被修改 )
XMLHttpRequest 对象中,服务器发送的状态码都保存在 status 属性里。通过把这个值和 200 304 比较,可以确保服务器是否已发送了一个成功的响应
responseText
XMLHttpRequest responseText 属性 包含了从服务器发送的数据 。它是一个 HTML,XML 或普通文本,这取决于服务器发送的内容。
readyState 属性值变成 4 , responseText 属性才可用,表明 Ajax 请求已经结束。
responseXML
如果服务器返回的是 XML , 那么数据将储存在 responseXML 属性中。
只用服务器发送了带有正确首部信息的数据时, responseXML 属性才是可用的。 MIME 类型必须为 text/xml

示例:
页面显示 load.jsp
<%@ page language="java"  pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
     <script type="text/javascript" src="./load.js"></script>
  </head>
  <body>
     <form action="" enctype="application/x-www-form-urlencoded">
          <div id="divcheck"></div>
          <input type="button" name="ok" id="ok" value="测试加载">
      </form>
  </body>
</html>
js文件 load.js
//当页面加载完毕之后,执行以下代码
window.onload = function(){
	document.getElementById("ok").onclick = function(){
		 var xhr = ajaxFunction();
		
		 xhr.onreadystatechange = function(){
			if(xhr.readyState==1){
				document.getElementById("divcheck").innerHTML = "<img src='loading33.gif'></img> 正在连接";
				alert("xxx");
			}else if(xhr.readyState==2){
				document.getElementById("divcheck").innerHTML = "<img src='loading33.gif'></img> 正在加载";
				alert("xxx");
			}else if(xhr.readyState==3){
				document.getElementById("divcheck").innerHTML = "<img src='loading33.gif'></img> 正在处理";
				alert("xxx");
			}else if(xhr.readyState==4){
				document.getElementById("divcheck").innerHTML = "显示视频页面";
			}else{
				document.getElementById("divcheck").innerHTML = "视频页面加载失败";
			}
		 }
		
		 xhr.open("POST","../loadServlet?timeStamp="+new Date().getTime(),true);
		 
		 xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		
		 xhr.send(null);
	}
}

function ajaxFunction(){
   var xmlHttp;
   try{ // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
    }
    catch (e){
	   try{// Internet Explorer
	         xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
	      }
	    catch (e){
	      try{
	         xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	      }
	      catch (e){}
	      }
    }

	return xmlHttp;
 }







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值