AJAX初探,XMLHttpRequest介紹


AJAX初探,XMLHttpRequest介紹

AJAX

     AJAX = Asynchronous JavaScript and XML. 異步的JavaScript和XML.
     AJAX是一種在不需要重新加載整個頁面的情況下,與服務器交換數據並更新部分網頁的技術.
     之前傳統的網頁如果需要更新內容,必須重新加載整個頁面.
 
     AJAX基於已有標准,已被使用多年. 2005年的Google Suggest使其流行起來,當你輸入關鍵字時,會返回搜索建議的列表.
     優點:更快,給用戶的體驗更好,減少了傳輸的流量.
     舉例:
     在百度,Google的搜索框輸入文字時,可以看到已經發送出請求,所以有搜索建議列表;
     百度地圖,在拖動地圖的時候,也可以看到它在不斷地發出請求,頁面內容在發生改變,但是整個頁面並沒有被刷新.
 

AJAX中的重要對象:XMLHttpRequest

     這個對象是微軟最先在ie里面提供的,使用的是ActiveX對象(IE5和IE6):
     variable=new ActiveXObject("Microsoft.XMLHTTP");
  現在,所有的現代瀏覽器(IE7+,Firefox,Chrome,Safari 以及 Opera)均內建XMLHttpRequest對象:
     variable=new XMLHttpRequest();

 

     為了應對所有的現代瀏覽器,包括 IE5 和 IE6,請檢查瀏覽器是否支持 XMLHttpRequest 對象.
     如果支持,則創建 XMLHttpRequest 對象.如果不支持,則創建 ActiveXObject:
var xmlHttpRequest;
if (window.XMLHttpRequest) {//in JavaScript, if it exists(not null and undifine), it is true.
    // code for IE7+, Firefox, Chrome, Opera, Safari
    xmlHttpRequest = new XMLHttpRequest();
} else {
    // code for IE6, IE5
    xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}

 

     也可以先判斷IE6,5的情況:          
if (window.ActiveXObject) {
    //code for IE6, IE5
}
else {
    //code for others
}

 

 

使用AJAX跟服務器端通信

     1.准備階段:
     
xmlHttpRequest.open("GET", "AjaxServlet", true);

     open方法的原型是:XMLHttpRequest.prototype.open = function(method,url,async,user,password) {};

     我們這里只指定了三個參數:方法,路徑和發送異步請求為true.
 
     2.關聯好回調函數:
     當狀態改變的時候,進入處理器,這里是一個回調方法:
xmlHttpRequest.onreadystatechange = ajaxCallback;

  狀態分為多種,被數字標識.參見: http://www.w3school.com.cn/ajax/ajax_xmlhttprequest_onreadystatechange.asp

  readyState存有 XMLHttpRequest 的狀態,從 0 到 4 發生變化:
0: 請求未初始化
1: 服務器連接已建立
2: 請求已接收
3: 請求處理中
4: 請求已完成,且響應已就緒

 

     3.真正地向服務器端發送數據:
     
xmlHttpRequest.send();

 

     這里使用GET方法,可以不傳入參數,或者寫send(null),發送POST請求時,需要在這里傳入參數.
 
     4.處理回調:  
function ajaxCallback() {
    //alert("test");//this alert will show several times when click the button.
    if (4 == xmlHttpRequest.readyState && 200 == xmlHttpRequest.status) {
        var responseText = xmlHttpRequest.responseText;
        document.getElementById("div1").innerHTML = responseText;
    }
}

  先判斷readyState再判斷響應的返回值為4,表示請求已完成,status返回200表示響應的返回值為200,即HTTP請求成功.

     這里將服務器返回的內容設置入div節點,顯示出來.
 
 

完整代碼

服務器端程序:
package com.mengdd.servlets;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;


public class HelloAjaxServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet invoked!");
        PrintWriter out = response.getWriter();
        out.println("Hello World");
        out.flush();
    }
}

 

 
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello Ajax</title>
    <script type="text/javascript">
        var xmlHttpRequest;
        function ajaxSubmit() {
            if (window.XMLHttpRequest) {//in JavaScript, if it exists(not null and undifine), it is true.
                // code for IE7+, Firefox, Chrome, Opera, Safari
                xmlHttpRequest = new XMLHttpRequest();
            } else if (window.ActiveXObject) {
                // code for IE6, IE5
                xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } else {
                //very rare browsers, can be ignored.
            }

            //also, we can handle IE5,6 first using:
            /*
             if (window.ActiveXObject) {
             //code for IE6, IE5
             }
             else {
             //code for others
             }
             */

            //send request
            if (null != xmlHttpRequest) {

                //1. prepare request
                xmlHttpRequest.open("GET", "AjaxServlet", true);
                // XMLHttpRequest.prototype.open = function(method,url,async,user,password) {};

                //2. set callback function to handle events
                xmlHttpRequest.onreadystatechange = ajaxCallback;

                //3. do sending request action
                xmlHttpRequest.send();//POST requset needs params here, for GET, just leave params empty or set it to null.


            }


        }

        function ajaxCallback() {
            //alert("test");//this alert will show several times when click the button.
            if (4 == xmlHttpRequest.readyState && 200 == xmlHttpRequest.status) {
                var responseText = xmlHttpRequest.responseText;
                document.getElementById("div1").innerHTML = responseText;
            }
        }
    </script>

</head>
<body>
<input type="button" value="get content from server" onclick="ajaxSubmit();">

<div id="div1"></div>
</body>
</html>

 

web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>HelloAjaxServlet</servlet-name>
        <servlet-class>com.mengdd.servlets.HelloAjaxServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloAjaxServlet</servlet-name>
        <url-pattern>/AjaxServlet</url-pattern>
    </servlet-mapping>
</web-app>
 

 

參考資料:

  聖思園張龍老師JavaWeb視頻教程63: AJAX深度剖析,XMLHttpRequest對象大揭秘.
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM