AJAX概述

AJAX(Asynchronous Javascript And Xml)

百度關(guān)于ajax的介紹

Ajax即Asynchronous Javascript And XML(異步JavaScript和XML)在 2005年被Jesse James Garrett提出的新術(shù)語,用來描述一種使用現(xiàn)有技術(shù)集合的‘新’方法夷蚊,包括: HTMLXHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。使用Ajax技術(shù)網(wǎng)頁應(yīng)用能夠快速地將增量更新呈現(xiàn)在用戶界面上度硝,而不需要重載(刷新)整個頁面实蔽,這使得程序能夠更快地回應(yīng)用戶的操作卷扮。

AJAX本質(zhì)

  • AJAX不能稱為一種技術(shù)羞迷,它是多種技術(shù)的綜合產(chǎn)物。
  • AJAX代碼屬于WEB前端的JS代碼画饥。和后端的java沒有關(guān)系,后端也可以是php語言浊猾,也可以是C語言抖甘。
  • AJAX可以讓瀏覽器發(fā)送一種特殊的請求,這種請求可以是:異步

為什么要發(fā)送異步的請求?

我們來假設(shè)一下這樣一個業(yè)務(wù)場景:

互聯(lián)網(wǎng)開荒的2G時代葫慎,Jack非常喜歡在知名二次元網(wǎng)站Bilibili上觀看電影衔彻,有一天,Jack在B站觀看《肖申克的救贖》這部影片時偷办,界面彈出一個小框艰额,需要大會員才能觀看完整電影,Jack二話不說椒涯,立刻沖了一個大會員柄沮,并進(jìn)行登錄,如果此時我們重新加載頁面废岂,Jack當(dāng)前電影的緩存就要重新從0加載祖搓,讓他一夜回到解放前。此時如果登錄會員賬戶這個操作不會影響已經(jīng)加載好的網(wǎng)頁湖苞,那么Jack的用戶體驗就會提高許多拯欧,我們可以用ajax發(fā)送異步請求來解決這個問題。

異步與同步的區(qū)別

  • 什么是異步财骨,什么是同步镐作?
    • 假設(shè)有t1和t2線程藏姐,t1和t2線程并發(fā),就是異步该贾。
    • 假設(shè)有t1和t2線程羔杨,t2在執(zhí)行的時候,必須等待t1線程執(zhí)行到某個位置之后t2才能執(zhí)行靶庙,那么t2在等t1问畅,顯然他們是排隊的,排隊的就是同步六荒。
    • AJAX是可以發(fā)送異步請求的护姆。也就是說,在同一個瀏覽器頁面當(dāng)中掏击,可以發(fā)送多個ajax請求卵皂,這些ajax請求之間不需要等待,是并發(fā)的砚亭。

AJAX的效果

  • AJAX 應(yīng)用程序可能使用 XML 來傳輸數(shù)據(jù)灯变,但將數(shù)據(jù)作為純文本或 JSON 文本傳輸也同樣常見。
  • AJAX可以更新網(wǎng)頁的部分捅膘,而不需要重新加載整個頁面添祸。(頁面局部刷新)
  • AJAX可以做到在同一個網(wǎng)頁中同時啟動多個請求,類似于在同一個網(wǎng)頁中啟動“多線程”寻仗,一個“線程”一個“請求”刃泌。
  • 對AJAX異步請求的理解.png

AJAX同步與異步的區(qū)別

  • AJAX同步請求
  • AJAX同步請求.png
  • AJAX異步請求
  • AJAX異步請求.png

XMLHttpRequest對象

  • XMLHttpRequest對象是AJAX的核心對象,發(fā)送請求以及接收服務(wù)器數(shù)據(jù)的返回署尤,全靠它了耙替。

  • XMLHttpRequest對象,現(xiàn)代瀏覽器都是支持的曹体,都內(nèi)置了該對象俗扇。直接用即可。

  • 創(chuàng)建XMLHttpRequest對象

    • var xhr = new XMLHttpRequest();
      
  • XMLHttpRequest對象的方法

方法 描述
abort() 取消當(dāng)前請求
getAllResponseHeaders() 返回頭部信息
getResponseHeader() 返回特定的頭部信息
open(method, url, async, user, psw) 規(guī)定請求method:請求類型 GET 或 POSTurl:文件位置async:true(異步)或 false(同步)user:可選的用戶名稱psw:可選的密碼
send() 將請求發(fā)送到服務(wù)器箕别,用于 GET 請求
send(string) 將請求發(fā)送到服務(wù)器铜幽,用于 POST 請求
setRequestHeader() 向要發(fā)送的報頭添加標(biāo)簽/值對
  • XMLHttpRequest對象的屬性
屬性 描述
onreadystatechange 定義當(dāng) readyState 屬性發(fā)生變化時被調(diào)用的函數(shù)
readyState 保存 XMLHttpRequest 的狀態(tài)。0:請求未初始化 1:服務(wù)器連接已建立 2:請求已收到 3:正在處理請求 4:請求已完成且響應(yīng)已就緒
responseText 以字符串返回響應(yīng)數(shù)據(jù)
responseXML 以 XML 數(shù)據(jù)返回響應(yīng)數(shù)據(jù)
status 返回請求的狀態(tài)號200: "OK"403: "Forbidden"404: "Not Found"
statusText 返回狀態(tài)文本(比如 "OK" 或 "Not Found")

AJAX GET請求

AJAX請求四步法

  1. 第一步:創(chuàng)建AJAX核心對象

    我們通常頁面加載完畢串稀,并且某個事件發(fā)生后才需要發(fā)送ajax請求啥酱,顯然,這部分代碼要在具體事件注冊函數(shù)中

    var xhr = new XMLHttpRequest();   
    
  2. 第二步:注冊回調(diào)函數(shù)

    onreadystatechange函數(shù)在readystate屬性變化時調(diào)用厨诸,

    具體的readystate屬性值對應(yīng)的是镶殷,發(fā)送請求后服務(wù)器對該請求的處理所處的一個階段,見下圖

XMLHttpRequest的readyState屬性.png

我們通常在readystate == 4時(請求已完成且響應(yīng)已就緒的)注冊好相應(yīng)的函數(shù)

通常微酬,我們還會使用http狀態(tài)碼status來選擇響應(yīng)成功之后進(jìn)行的操作

xhr.onreadystatechange = function(){
    if (this.readyState == 4) {
        if (this.status == 200) {
           
        }else{
            alert(this.status)
        }
    }
}
  1. 打開服務(wù)器與瀏覽器之間的通道

    xhr.open("GET", "/項目名/請求路徑?name=value&name=value", true)
    // true --> 開啟異步
    // false --> 開啟同步
    
  2. 發(fā)送請求

     xhr.send()
    

AJAX get請求如何提交數(shù)據(jù)呢绘趋?

  • get請求提交數(shù)據(jù)是在“請求行”上提交颤陶,格式是:url?name=value&name=value&name=value....
  • 其實這個get請求提交數(shù)據(jù)的格式是HTTP協(xié)議中規(guī)定的,遵循協(xié)議即可

后端處理AJAX的GET請求

與正常處理前端發(fā)送的請求一致

@WebServlet("/前端訪問的路徑")
public class AjaxRequest2Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 設(shè)置響應(yīng)的內(nèi)容類型以及字符集
        response.setContentType("text/html;charset=UTF-8");
        // 獲取響應(yīng)流
        PrintWriter out = response.getWriter();
        // 響應(yīng)
        out.print("<font color='red'>后端處理AJAX的get請求</font>");
    }
}

AJAX GET請求的緩存問題

  • 對于低版本的IE瀏覽器來說陷遮,AJAX的get請求可能會走緩存滓走。存在緩存問題。對于現(xiàn)代的瀏覽器來說帽馋,大部分瀏覽器都已經(jīng)不存在AJAX get緩存問題了搅方。
  • 什么是AJAX GET請求緩存問題呢?
    • 在HTTP協(xié)議中是這樣規(guī)定get請求的:get請求會被緩存起來绽族。
    • 發(fā)送AJAX GET請求時姨涡,在同一個瀏覽器上,前后發(fā)送的AJAX請求路徑一樣的話吧慢,對于低版本的IE來說涛漂,第二次的AJAX GET請求會走緩存,不走服務(wù)器检诗。
  • POST請求在HTTP協(xié)議中規(guī)定的是:POST請求不會被瀏覽器緩存匈仗。
  • GET請求緩存的優(yōu)缺點:
    • 優(yōu)點:直接從瀏覽器緩存中獲取資源,不需要從服務(wù)器上重新加載資源逢慌,速度較快悠轩,用戶體驗好。
    • 缺點:無法實時獲取最新的服務(wù)器資源攻泼。
  • 瀏覽器什么時候會走緩存哗蜈?
    • 第一:是一個GET請求
    • 第二:請求路徑已經(jīng)被瀏覽器緩存過了。第二次發(fā)送請求的時候坠韩,這個路徑?jīng)]有變化,會走瀏覽器緩存炼列。
  • 如果是低版本的IE瀏覽器只搁,怎么解決AJAX GET請求的緩存問題呢?
    • 可以在請求路徑url后面添加一個時間戳俭尖,這個時間戳是隨時變化的氢惋。所以每一次發(fā)送的請求路徑都是不一樣的,這樣就不會走瀏覽器的緩存問題了稽犁。
    • 可以采用時間戳:"url?t=" + new Date().getTime()
    • 或者可以通過隨機(jī)數(shù):"url?t=" + Math.random()
    • 也可以隨機(jī)數(shù)+時間戳....

AJAX POST請求

AJAX POST請求和GET請求的代碼區(qū)別焰望?只是前端代碼有區(qū)別,后端代碼沒有區(qū)別

  1. AJAX的post請求需要提前設(shè)置好請求頭

    // 設(shè)置請求頭的內(nèi)容類型已亥。模擬form表單提交數(shù)據(jù)
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") 
    
  2. send()發(fā)送請求的時候需要將參數(shù)信息寫入

    // 獲取表單中的數(shù)據(jù)
    var username = document.getElementById("username").value;
    var password = document.getElementById("password").value;
    // send函數(shù)中的參數(shù)就是發(fā)送的數(shù)據(jù)熊赖,這個數(shù)據(jù)在“請求體”當(dāng)中發(fā)送。    
    xhr.send("username="+username+"&password="+passwor
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虑椎,一起剝皮案震驚了整個濱河市震鹉,隨后出現(xiàn)的幾起案子俱笛,更是在濱河造成了極大的恐慌,老刑警劉巖传趾,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迎膜,死亡現(xiàn)場離奇詭異,居然都是意外死亡浆兰,警方通過查閱死者的電腦和手機(jī)磕仅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來簸呈,“玉大人榕订,你說我怎么就攤上這事〉澹” “怎么了卸亮?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長玩裙。 經(jīng)常有香客問我兼贸,道長,這世上最難降的妖魔是什么吃溅? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任溶诞,我火速辦了婚禮,結(jié)果婚禮上决侈,老公的妹妹穿的比我還像新娘螺垢。我一直安慰自己,他們只是感情好赖歌,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布枉圃。 她就那樣靜靜地躺著,像睡著了一般庐冯。 火紅的嫁衣襯著肌膚如雪孽亲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天展父,我揣著相機(jī)與錄音返劲,去河邊找鬼。 笑死栖茉,一個胖子當(dāng)著我的面吹牛篮绿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吕漂,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亲配,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弃榨,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤菩收,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲸睛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娜饵,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年官辈,在試婚紗的時候發(fā)現(xiàn)自己被綠了箱舞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拳亿,死狀恐怖晴股,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肺魁,我是刑警寧澤电湘,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站鹅经,受9級特大地震影響寂呛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘾晃,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一贷痪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹦误,春花似錦劫拢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至偶洋,卻和暖如春熟吏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涡真。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留肾筐,地道東北人哆料。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像吗铐,于是被迫代替她去往敵國和親东亦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容