本文給大家分享的是如何實作AJAX的非同步功能,非常的詳細,也很實用,適合JavaScript的初學者,有需要的朋友參考下。
為了實驗ajax的非同步
性,先建一個Web項目,結構大概是這個樣子
TestServlet.java(主要是提供ajax後台呼叫的程式)
import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class TestServelet */ @WebServlet("/TestServelet") public class TestServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * Default constructor. */ public TestServlet() { } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //为了体现程序的异步性,先让它睡3s try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } response.setCharacterEncoding("utf-8"); //打印出程序运行的时间 System.out.println("异步程序运行时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS") .format(new Date())); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
testAjax.jsp(前台頁面和js,觸發非同步呼叫)
<%@ page language="java" contentType="text/html;charset=UTF-8" %> <html > <head></head> <body onload="testajax()"> Hello Ajax!<br> </body> </html> <SCRIPT LANGUAGE="JavaScript"> function testajax(){ fnGetAjaxReturn('http://localhost:8080/TestProject/TestServlet?a='+Math.random()); } function fnGetAjaxReturn(url) { var userAgent = navigator.userAgent; var http_request = false; //开始初始化XMLHttpRequest对象 if(window.XMLHttpRequest) { //Mozilla 浏览器 http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) {//设置MiME类别 http_request.overrideMimeType("text/xml"); } } //else if (window.ActiveXObject) { // IE浏览器 else if (window.ActiveXObject||userAgent.indexOf("Trident") > -1){ try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {alert("错了吧");} } } if (!http_request) { // 异常,创建对象实例失败 window.alert("不能创建XMLHttpRequest对象实例."); return false; } http_request.open("GET", url, true);//true 异步 false 同步 http_request.send(); alert("异步请求之后执行时间:"+new Date +'\n毫秒数:'+ new Date().getMilliseconds()); }</script>
說明:jsp頁面載入之後呼叫一個js,js中會先發出一個非同步請求,再執行一個alert彈出操作。
下面開始試驗
使用IE瀏覽器,執行URL
http://localhost:8080/TestProject/testAjax.jsp
發現,程式先彈出了alert,過了3s鐘,ajax才回傳了後台結果,充分證明了ajax的非同步性。
運行結果:
從時間的差異性,發現程式先執行結束(執行了alert),過了3s鐘,非同步程式才回傳結果。
反過來,如果把jsp檔案中的
http_request.open("GET", url, true);
#true 改為 false呢?
執行URL,發現程式在苦苦等待Servlet後台請求回傳之後,才執行了js中的最後一段程式碼alert,正是所謂的同步呼叫。
運行結果如下:
The end!
以上是如何實現AJAX 的非同步功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!