ajax异步调用
?
?
1、名稱:
ajax 的全稱是AsynchronousJavaScript and XML,其中,Asynchronous 是異步的意思,它有別于傳統(tǒng)web開發(fā)中采用的同步的方式。
2、同步和異步
?
異步傳輸是面向字符的傳輸,它的單位是字符;而同步傳輸是面向比特的傳輸,它的單位是楨,它傳輸?shù)臅r候要求接受方和發(fā)送方的時鐘是保持一致的。
舉個例子來說同步和異步,同步就好像排隊體檢,得做完一項(xiàng)再進(jìn)行下一項(xiàng),而異步相當(dāng)于vip會員,體檢完一項(xiàng)直接進(jìn)行下一項(xiàng),不需要排隊。
3、ajax所包含的技術(shù)
?
?大家都知道ajax并非一種新的技術(shù),而是幾種原有技術(shù)的結(jié)合體。它由下列技術(shù)組合而成。
???1.使用CSS和XHTML來表示。
???2.?使用DOM模型來交互和動態(tài)顯示。
???3.使用XMLHttpRequest來和服務(wù)器進(jìn)行異步通信。
???4.使用javascript來綁定和調(diào)用。
在上面幾中技術(shù)中,除了XmlHttpRequest對象以外,其它所有的技術(shù)都是基于web標(biāo)準(zhǔn)并且已經(jīng)得到了廣泛使用的,XMLHttpRequest雖然目前還沒有被W3C所采納,但是它已經(jīng)是一個事實(shí)的標(biāo)準(zhǔn),因?yàn)槟壳皫缀跛械闹髁鳛g覽器都支持它。
ajax的原理簡單來說通過XmlHttpRequest對象來向服務(wù)器發(fā)異步請求,從服務(wù)器獲得數(shù)據(jù),然后用javascript來操作DOM而更新頁面。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請求數(shù)據(jù)。要清楚這個過程和原理,我們必須對 XMLHttpRequest有所了解。
XMLHttpRequest是ajax的核心機(jī)制,是一種支持異步請求的技術(shù)。簡單的說,也就是javascript可以及時向服務(wù)器提出請求和處理響應(yīng),而不阻塞用戶。達(dá)到無刷新的效果。
4、XMLHttpRequest的工作原理。
? 首先,我們先來看看XMLHttpRequest這個對象的屬性。
??它的屬性有:
??onreadystatechange??每次狀態(tài)改變所觸發(fā)事件的事件處理程序。
??responseText?????從服務(wù)器進(jìn)程返回數(shù)據(jù)的字符串形式。
??responseXML????從服務(wù)器進(jìn)程返回的DOM兼容的文檔數(shù)據(jù)對象。
??status???????????從服務(wù)器返回的數(shù)字代碼,比如常見的404(未找到)和200(已就緒)
??status Text???????伴隨狀態(tài)碼的字符串信息
??readyState???????對象狀態(tài)值
0 (未初始化)?對象已建立,但是尚未初始化(尚未調(diào)用open方法)
1 (初始化)?對象已建立,尚未調(diào)用send方法
2 (發(fā)送數(shù)據(jù)) send方法已調(diào)用,但是當(dāng)前的狀態(tài)及http頭未知
3 (數(shù)據(jù)傳送中)?已接收部分?jǐn)?shù)據(jù),因?yàn)轫憫?yīng)及http頭不全,這時通過responseBody和responseText獲取部分?jǐn)?shù)據(jù)會出現(xiàn)錯誤,
4 (完成)?數(shù)據(jù)接收完畢,此時可以通過通過responseXml和responseText獲取完整的回應(yīng)數(shù)據(jù)
?
?但是,由于各瀏覽器之間存在差異,所以創(chuàng)建一個XMLHttpRequest對象可能需要不同的方法。這個差異主要體現(xiàn)在IE和其它瀏覽器之間。下面是一個比較標(biāo)準(zhǔn)的創(chuàng)建XMLHttpRequest對象的方法。
?
[javascript]?view plain?copy
?
[javascript]?view plain?copy
?
首先創(chuàng)建一個XMLHttpRequest對象,之后javaspcript方法檢查XMLHttpRequest的整體狀態(tài)并且保證它已經(jīng)完成(readyStatus=4),即數(shù)據(jù)已經(jīng)發(fā)送完畢。然后根據(jù)服務(wù)器的設(shè)定詢問請求狀態(tài),如果一切已經(jīng)就緒(status=200),那么就執(zhí)行下面需要的操作。
對于XmlHttpRequest的兩個方法,open和send,其中open方法指定了:
a、向服務(wù)器提交數(shù)據(jù)的類型,即post還是get。
b、請求的url地址和傳遞的參數(shù)。
c、傳輸方式,false為同步,true為異步。默認(rèn)為true。如果是異步通信方式(true),客戶機(jī)就不等待服務(wù)器的響應(yīng);如果是同步方式(false),客戶機(jī)就要等到服務(wù)器返回消息后才去執(zhí)行其他操作。我們需要根據(jù)實(shí)際需要來指定同步方式,在某些頁面中,可能會發(fā)出多個請求,甚至是有組織有計劃有隊形大規(guī)模的高強(qiáng)度的request,而后一個是會覆蓋前一個的,這個時候當(dāng)然要指定同步方式。
之后調(diào)用Send(content)方法用來發(fā)送請求。
?
send方法向服務(wù)器發(fā)出請求,如果采用異步方式,該方法會立即返回。
content可以指定為null表示不發(fā)送數(shù)據(jù),其內(nèi)容可以是DOM對象,輸入流或字符串。
通過這個示例我們看到Ajax 基本上就是把 JavaScript 技術(shù)和XMLHttpRequest對象放在 Web 表單和服務(wù)器之間。當(dāng)用戶向服務(wù)器請求時,數(shù)據(jù)發(fā)送給一些 JavaScript 代碼而不是直接發(fā)送給服務(wù)器。JavaScript代碼在幕后發(fā)送異步請求,然后服務(wù)器將數(shù)據(jù)返回 JavaScript 代碼,后者決定如何處理這些數(shù)據(jù),它可以迅速更新表單數(shù)據(jù)。這就是Ajax的原理所在。
5、用圖來理解Ajax原理
6、ajax的優(yōu)點(diǎn)
?
Ajax的給我們帶來的好處大家基本上都深有體會,在這里我只簡單的講幾點(diǎn):
???1、最大的一點(diǎn)是頁面無刷新,在頁面內(nèi)與服務(wù)器通信,給用戶的體驗(yàn)非常好。
?2、使用異步方式與服務(wù)器通信,不需要打斷用戶的操作,具有更加迅速的響應(yīng)能力。
?3、可以把以前一些服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)嫁到客戶端,利用客戶端閑置的能力來處理,減輕服務(wù)器和帶寬的負(fù)擔(dān),節(jié)約空間和寬帶租用成本。并且減輕服務(wù)器的負(fù)擔(dān),ajax的原則是“按需取數(shù)據(jù)”,可以最大程度的減少冗余請求,和響應(yīng)對服務(wù)器造成的負(fù)擔(dān)。
??4、基于標(biāo)準(zhǔn)化的并被廣泛支持的技術(shù),不需要下載插件或者小程序。
7、ajax的缺點(diǎn)
?
下面所闡述的ajax的缺陷都是它先天所產(chǎn)生的。
???1、ajax干掉了back按鈕,即對瀏覽器后退機(jī)制的破壞。后退按鈕是一個標(biāo)準(zhǔn)的web站點(diǎn)的重要功能,但是它沒法和js進(jìn)行很好的合作。這是ajax所帶來的一個比較嚴(yán)重的問題,因?yàn)橛脩敉窍M軌蛲ㄟ^后退來取消前一次操作的。那么對于這個問題有沒有辦法?答案是肯定的,用過Gmail的知道,Gmail下面采用的ajax技術(shù)解決了這個問題,在Gmail下面是可以后退的,但是,它也并不能改變ajax的機(jī)制,它只是采用的一個比較笨但是有效的辦法,即用戶單擊后退按鈕訪問歷史記錄時,通過創(chuàng)建或使用一個隱藏的IFRAME來重現(xiàn)頁面上的變更。(例如,當(dāng)用戶在Google Maps中單擊后退時,它在一個隱藏的IFRAME中進(jìn)行搜索,然后將搜索結(jié)果反映到Ajax元素上,以便將應(yīng)用程序狀態(tài)恢復(fù)到當(dāng)時的狀態(tài)。)
但是,雖然說這個問題是可以解決的,但是它所帶來的開發(fā)成本是非常高的,和ajax框架所要求的快速開發(fā)是相背離的。這是ajax所帶來的一個非常嚴(yán)重的問題。
?2、安全問題
技術(shù)同時也對IT企業(yè)帶來了新的安全威脅,ajax技術(shù)就如同對企業(yè)數(shù)據(jù)建立了一個直接通道。這使得開發(fā)者在不經(jīng)意間會暴露比以前更多的數(shù)據(jù)和服務(wù)器邏輯。ajax的邏輯可以對客戶端的安全掃描技術(shù)隱藏起來,允許黑客從遠(yuǎn)端服務(wù)器上建立新的攻擊。還有ajax也難以避免一些已知的安全弱點(diǎn),諸如跨站點(diǎn)腳步攻擊、SQL注入攻擊和基于credentials的安全漏洞等。
??3、對搜索引擎的支持比較弱。
??4、破壞了程序的異常機(jī)制。至少從目前看來,像ajax.dll,ajaxpro.dll這些ajax框架是會破壞程序的異常機(jī)制的。關(guān)于這個問題,我曾經(jīng)在開發(fā)過程中遇到過,但是查了一下網(wǎng)上幾乎沒有相關(guān)的介紹。后來我自己做了一次試驗(yàn),分別采用ajax和傳統(tǒng)的form提交的模式來刪除一條數(shù)據(jù)……給我們的調(diào)試帶來了很大的困難。
?5、另外,像其他方面的一些問題,比如說違背了url和資源定位的初衷。例如,我給你一個url地址,如果采用了ajax技術(shù),也許你在該url地址下面看到的和我在這個url地址下看到的內(nèi)容是不同的。這個和資源定位的初衷是相背離的。
?6、一些手持設(shè)備(如手機(jī)、PDA等)現(xiàn)在還不能很好的支持ajax,比如說我們在手機(jī)的瀏覽器上打開采用ajax技術(shù)的網(wǎng)站時,它目前是不支持的,當(dāng)然,這個問題和我們沒太多關(guān)系。
8、ajax的幾種框架
?
?目前我們采用的比較多的ajax框架主要有ajax.dll,ajaxpro.dll,magicajax.dll?以及微軟的atlas框架。Ajax.dll和Ajaxpro.dll這兩個框架差別不大,而magicajax.dll只是封裝得更厲害一些,比如說它可以直接返回DataSet數(shù)據(jù)集,前面我們已經(jīng)說過,ajax返回的都是字符串,magicajax只是對它進(jìn)行了封裝而已。但是它的這個特點(diǎn)可以給我們帶來很大的方便,比如說我們的頁面有一個列表,而列表的數(shù)據(jù)是不斷變化的,那么我們可以采用magicajax來處理,操作很簡單,添加magicajax之后,將要更新的列表控件放在magicajax的控件之內(nèi),然后在pageload里面定義更新間隔的時間就ok了,atlas的原理和magicajax差不多。但是,需要注意的一個問題是,這幾種框架都只支持IE,沒有進(jìn)行瀏覽器兼容方面的處理,用反編譯工具察看他們的代碼就可以知道。
?除了這幾種框架之外,我們平時用到的比較多的方式是自己創(chuàng)建xmlHttpRequest對象,這種方式和前面的幾種框架相比更具有靈活性。另外,在這里還提一下aspnet2.0自帶的異步回調(diào)接口,它和ajax一樣也可以實(shí)現(xiàn)局部的無刷新,但它的實(shí)現(xiàn)實(shí)際上也是基于xmlhttprequest對象的,另外也是只支持IE,當(dāng)然這是微軟的一個競爭策略。
9.什么是回調(diào)
軟件模塊之間總是存在著一定的接口,從調(diào)用方式上,可以把他們分為三類:同步調(diào)用、回調(diào)和異步調(diào)用。同步調(diào)用是一種阻塞式調(diào)用,調(diào)用方要等待對方執(zhí)行完畢才返回,它是一種單向調(diào)用;回調(diào)是一種雙向調(diào)用模式,也就是說,被調(diào)用方在接口被調(diào)用時也會調(diào)用對方的接口;異步調(diào)用是一種類似消息或事件的機(jī)制,不過它的調(diào)用方向剛好相反,接口的服務(wù)在收到某種訊息或發(fā)生某種事件時,會主動通知客戶方(即調(diào)用客戶方的接口)。回調(diào)和異步調(diào)用的關(guān)系非常緊密,通常我們使用回調(diào)來實(shí)現(xiàn)異步消息的注冊,通過異步調(diào)用來實(shí)現(xiàn)消息的通知。同步調(diào)用是三者當(dāng)中最簡單的,而回調(diào)又常常是異步調(diào)用的基礎(chǔ)(引用自網(wǎng)絡(luò))?
?
10、回調(diào)函數(shù)
回調(diào)函數(shù),就是由你自己寫的。你需要調(diào)用另外一個函數(shù),而這個函數(shù)的其中一個參數(shù),就是你的這個回調(diào)函數(shù)名。這樣,系統(tǒng)在必要的時候,就會調(diào)用你寫的回調(diào)函數(shù),這樣你就可以在回調(diào)函數(shù)里完成你要做的事。例如:模塊A有一個函數(shù)foo,它向模塊B傳遞foo的地址,然后在B里面發(fā)生某種事件(event)時,通過從A里面?zhèn)鬟f過來的foo的地址調(diào)用foo,通知A發(fā)生了什么事情,讓A作出相應(yīng)反應(yīng)。 那么我們就把foo稱為回調(diào)函數(shù)。?
總結(jié)
- 上一篇: Spring Security Oaut
- 下一篇: 【KnewOne Talk】Zoom.Q