1. 程式人生 > >AJAX:如何編寫一個關於AJAX的Hello World?(ajax傳送非同步請求(四步操作))

AJAX:如何編寫一個關於AJAX的Hello World?(ajax傳送非同步請求(四步操作))

用到的一個Servlet類:

package cn.edu.web.servlet;

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

@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//設定編碼
		response.setContentType("text/html;charset=utf-8");
		//在控制檯輸出Hello AJAX
		System.out.println("Hello AJAX");
		//在瀏覽器裡面點選按鈕區域性重新整理後輸出
		response.getWriter().print("Hello AJAX<br />"+"伺服器響應了頁面的區域性重新整理,這就是AJAX");
	}
}



ajax的jsp程式碼:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>AJAX的Hello World</title>
<script type="text/javascript">
//建立非同步物件的函式
function createXMLHttpRequest(){
	try {
		return new XMLHttpRequest();//大多數瀏覽器
	} catch (e) {
		try {
			return ActiveXObject("Msxml2.XMLHTTP");//IE6.0
		} catch (e) {
			try {
				return ActiveXObject("Micrsoft.XMLHTTP");//IE5.5
			} catch (e) {
				alert("哥們兒,你用的是什麼瀏覽器啊?");//太古老了
				throw e;
			}
		}
	}
}
	window.onload = function(){//文件載入完畢後執行
		var btn = document.getElementById("btn");
		btn.onclick = function(){//給按鈕的點選事件註冊監聽器
			/*
			AJAX四步操作,得到伺服器的響應
			把響應結果顯示到h1元素中
			*/
			//1.得到非同步物件
			var xmlHttp = createXMLHttpRequest();//呼叫建立xmlhttp的函式
			/*
			2.開啟與伺服器的連線
			*指定請求方式
			*指定請求的URL
			*指定是否為非同步請求
			//注意:到客戶端時已經沒有了jsp,jstl等標籤,伺服器處理為了html
			*/
			//伺服器吧jsp變成了html傳送過來了
			xmlHttp.open("GET","<c:url value='/AServlet' />",true);
			//3.傳送請求
			xmlHttp.send(null);//GET請求沒有請求體,但也要給出null,不然FireFox可能不能傳送
			//4.給非同步物件的onreadystatechange事件註冊監聽器
			xmlHttp.onreadystatechange = function(){//當xmlHttp的狀態發生變化時執行
				//雙重判斷:xmlHttp的狀態為4(伺服器響應結束),以及伺服器狀態碼為200(伺服器響應成功)
				if(xmlHttp.readyState==4&&xmlHttp.status==200){
					//獲取伺服器響應內容
					var text = xmlHttp.responseText;
					//獲取h1元素
					var h1 = document.getElementById("h1");
					h1.innerHTML = text;
				}
			}
		}
	}
</script>
</head>
<body>
	<button id="btn">點選這裡</button>
	<h1 id="h1"></h1>
</body>
</html>

瀏覽器的效果如下(點選這裡之後)

ajax傳送非同步請求(四步操作)

1. 第一步(得到XMLHttpRequest)
  * ajax其實只需要學習一個物件:XMLHttpRequest,如果掌握了它,就掌握了ajax!!!
  * 得到XMLHttpRequest
    > 大多數瀏覽器都支援:var xmlHttp = new XMLHttpRequest();
    > IE6.0:var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    > IE5.5以更早版本的IE:var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

  * 編寫建立XMLHttpRequest物件的函式
  function createXMLHttpRequest() {
      try {
          return new XMLHttpRequest();
      } catch(e) {
          try {
          return new ActiveXObject("Msxml2.XMLHTTP");
      } catch(e) {
          try {
              return new ActiveXObject("Microsoft.XMLHTTP");
          } catch(e) {
              alert("哥們兒,你用的是什麼瀏覽器啊?");
              throw e;
          }
      }
      }
  }

2. 第二步(開啟與伺服器的連線)
  * xmlHttp.open():用來開啟與伺服器的連線,它需要三個引數:
    > 請求方式:可以是GET或POST
    > 請求的URL:指定伺服器端資源,例如;/day23_1/AServlet
    > 請求是否為非同步:如果為true表示傳送非同步請求,否則同步請求!
  * xmlHttp.open("GET", "/day23_1/AServlet", true);

3. 第三步(傳送請求)
  * xmlHttp.send(null):如果不給可能會造成部份瀏覽器無法傳送!
    > 引數:就是請求體內容!如果是GET請求,必須給出null。

4. 第四步()
  * 在xmlHttp物件的一個事件上註冊監聽器:onreadystatechange
  * xmlHttp物件一共有5個狀態:
    > 0狀態:剛建立,還沒有呼叫open()方法;
    > 1狀態:請求開始:呼叫了open()方法,但還沒有呼叫send()方法
    > 2狀態:呼叫完了send()方法了;
    > 3狀態:伺服器已經開始響應,但不表示響應結束了!
    > 4狀態:伺服器響應結束!(通常我們只關心這個狀態!!!)
  * 得到xmlHttp物件的狀態:
    > var state = xmlHttp.readyState;//可能是0、1、2、3、4
  * 得到伺服器響應的狀態碼
    > var status = xmlHttp.status;//例如為200、404、500
  * 得到伺服器響應的內容1
    > var content = xmlHttp.responseText;//得到伺服器的響應的文字格式的內容
    > var content = xmlHttp.responseXML;//得到伺服器的響應的xml響應的內容,它是Document物件了!

  xmlHttp.onreadystatechange = function() {//xmlHttp的5種狀態都會呼叫本方法
      if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {//雙重判斷:判斷是否為4狀態,而且還要判斷是否為200
          // 獲取伺服器的響應內容
      var text = xmlHttp.responseText;
      }
  };