Ajax应用工做模式/过程:
javascript
第一步,初始化XMLHttpRequest对象;
html
第二步,打开与服务器的链接。打开链接时,指定发送请求的方法: 采用GET或POST; 指定是否采用异步方式;
java
第三部,设置监听XMLHttpRequest状态改变的事件处理函数;
浏览器
第四部,发送请求。如采用POST方式发送请求,可发送带参数的请求。
缓存
下面给出一个示例: 级联菜单。页面中两个下拉框,选择或改变下拉框1的值将影响下拉框2中所加载的值。服务器
<!DOCTYPE html> <html> <head> <title>XMLHttpRequest -- Test</title> </head> <body> <select name="first" id="first" onchange="change(this.value);"> <option value="1">中国</option> <option value="2">美国</option> <option value="3">日本</option> </select> <select name="second" id="second"></select> <div id="output"></div> <script type="text/javascript"> // 定义XMLHttpRequest对象 var xmlrequest; // 初始化XMLHttpRequest对象 function createXMLHttpRequest() { if (window.XMLHttpRequest) { xmlrequest = new XMLHttpRequest(); } else if (window.ActiveXObject) { try { xmlrequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlrequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { } } } } function change(id) { // 初始化XMLHttpRequest对象 createXMLHttpRequest(); // 设置请求相应的URL var uri = "second.jsp?id=" + id; // 打开与服务器响应地址的链接 xmlrequest.open("POST", uri, true); // 设置请求头 xmlrequest.setRequestHeader("Content-Type", "application/x-www.form-urlencoded"); // 设置处理相应的回调函数 xmlrequest.onreadystatechange = processResponse; // 发送请求 xmlrequest.send(null); } // 定义处理响应的回调函数 function processResponse() { // 响应完成且响应正常 if (xmlrequest.readyState == 4) { if (xmlrequest.status == 200) { var cities = xmlrequest.responseText.split('$'); var displaySelect = document.getElementById("second"); displaySelect.innerHTML = null; for (var i=0; i<cities.length; i++) { var opt = document.createElement("option"); opt.innerHTML = cities[i]; displaySelect.appendChild(opt); } // 信息已经成功返回,开始处理信息 //var headers = xmlrequest.getAllResponseHeaders(); // 经过警告框输出响应头 //alert("响应头类型: " + typeof headers + "\n" + headers); // 在页面输出全部响应头 //document.getElementById("output").innerHTML = headers; } } else { // 页面不正常 //window.alert("状态信息: " + xmlrequest.readyState + " -- 服务器响应状态信息: " + xmlrequest.status + "-- 服务器状态信息描述: " + xmlrequest.statusText + "-- 请求页面有异常!"); } } </script> </body> </html>
XMLHttpRequest对象定义:
app
XMLHttpRequest是一套能够在JavaScript、VBScript、JScript等脚本语言中使用的API,它经过HTTP协议异步地向服务器发送请求,获取服务器返回的响应。XMLHttpRequest的用处是: 提供与服务器异步通讯的能力。
异步
XMLHttpRequest的方法和属性:jsp
XMLHttpRequest包含了一些基本的属性和方法,XMLHttpRequest正是经过这些属性和方法与服务器通讯的。
async
XMLHttpRequest的方法:
XMLHttpRequest对象的方法并很少,如下是其基本方法:
abort(): 中止发送当前对象。
getAllResponseHeaders(): 获取服务器返回的所有响应头。
getResponseHeader("headerLabel"): 根据响应头的名字,获取对应的响应头。
open("method", "URL"[,asyncFlag[,"userName"[,"password"]]]): 创建与服务器URL的链接,并设置请求的方法,以及是否使用异步请求。若是远程服务须要使用用户名、密码,则提供对应的信息。
send(content): 发送请求。其中content是请求参数。
setRequestHeader("label", "value"): 在发送请求以前,先设置请求头。
XMLHttpRequest的属性:
onreadystatechange: 该属性用于指定XMLHttpRequest对象状态改变时的事件处理函数。
readyState: 该属性用于获取XMLHttpRequest对象的处理状态。
responseText: 该属性用于获取服务器的响应文本。
responseXML: 该属性用于获取服务器相应的XML文档对象。
status: 该属性是服务器返回的状态吗,只有服务器的响应已经完成时,才会有该状态码。
statusText: 该属性是服务器返回的状态文本信息,只有当服务器的响应已经完成时,才会有该状态文本信息。
属性详解:
onreadystatechange:
onreadystatechange属性用于指定XMLHttpRequest对象的状态改变函数。当XMLHttpRequest对象的状态改变时,该函数将被触发。onreadystatechange属性的做用与按钮对象的onclick属性同样,都是事件处理属性。也就是说,XMLHttpRuquest对象是事件源,它能够引起readystatechange事件。当程序讲一个函数引用赋给XMLHttpRequest对象的onreadystatechange属性后,该函数即成为XMLHttpRequest对象的事件处理器。每次XMLHttpRequest发生readystatechange事件,都会触发监听该事件的事件处理器。
readyState:
XMLHttpRequest对象有以下几种状态,这些状态可经过readyState属性得到:
0:XMLHttpRequest对象尚未完成初始化
1:XMLHttpRequest对象开始发送请求
2:XMLHttpRequest对象的请求发送完成
3:XMLHttpRequest对象开始读取服务器的响应
4:XMLHttpRequest对象读取服务器响应结束
XMLHttpRequest对象的这几种状态信息可经过readyState属性读取。每当XMLHttpRequest对象的readyState属性改变时,其onreadystatechange属性指定的方法都会被触发。
status和statusText:
服务器的响应完成后(readyState=4),依然不能直接获取服务器响应。由于服务器响应也有不少种状况。为了判断服务器的响应是否正确,能够检测XMLHttpRequest的status或statusText属性。当服务器的响应正常时,JavaScript才应该读取服务器响应信息,并将响应信息动态加载到目标页面。
服务器经常使用的状态码及其对应的含义以下:
200:服务器响应正常
304:该资源在上次请求以后没有任何修改。这一般用于浏览器的缓存机制,使用GET请求时尤为须要注意
400:没法找到请求的资源
401:访问资源的权限不够
403:没有权限访问资源
404:须要访问的资源不存在
405:须要访问的资源被禁止
407:访问的资源须要代理身份验证
414:请求的URL太长
500:服务器内部错误
若是想经过JavaScript获取服务器响应,必须先判断服务器响应是否完成。要判断服务器的响应是否完成,只需判断XMLHttpRequest对象的readyState属性便可,当readyState值为4,表明响应完成;服务器响应完成后,还应判断服务器响应是否正确,要判断服务器响应是否正确,可经过判断XMLHttpRequest对象的status属性进行。当status值为200时,服务器响应正确,不然响应不正常。
发送请求:
发送GET请求:
一般状况下,GET请求用于从服务器上获取数据,POST请求用于向服务器发送数据。GET请求将全部请求参数转换成一个查询字符串,并将该字符串添加到请求的URL以后,于是可在请求的URL后看到请求参数名、请求参数值。若是将某个表单的action属性设置为GET,则请求会将表单中个字段的名和值转换为字符串,并附加到URL以后。
GET 和 POST异同:
GET请求传送的数据量较小,通常不能大于2KB。POST传送的数据量较大,一般认为POST请求参数的大小不受限制,但每每取决于服务器的限制。一般来讲,POST请求的数据量总比GET请求的数据量大。
POST请求则经过HTTP POST机制,将请求的参数以及对应的值放在HTML Header中传输,用户看不到明码的请求参数值。
当使用Ajax发送异步请求时,建议使用POST请求,而不是GET请求。发送GET请求需注意以下两点:
经过open方法开与服务器的链接时,设置使用GET方法。
如须要发送请求参数,应将请求参数转成查询字符串,并追加到请求URL以后。
注意:
虽然GET请求的请求参数附加在URL以后的,但使用send方法时,仍是应该为send方法传入参数。若是调用send方法时无须发送请求参数,则使用null做为参数便可。
发送POST请求:
POST请求的适应性更广,可以使用更大的请求参数,且POST请求的请求参数一般不能直接看到。
发送POST请求一般须要一下三个步骤:
第一步,使用open方法打开链接时,指定使用POST方式发送请求;
第二步,设置正确的请求头,POST请求一般应设置Content-Type请求头;
第三步,发送请求,把请求参数转换为查询字符串,将该字符串做为send()方法的参数。
注意: 使用POST方法发送请求,同样能够将请求参数附加到URL以后。