AJAX


AJAX

简介

AJAX 是 异步 JavaScript 及 XML(Asynchronous JavaScript and XML)的缩写。AJAX 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术,一种独立于 Web 服务器软件的浏览器技术。但同时,AJAX不是一种单独的技术,实际上它是几种技术的结合使用。

通过 AJAX,JavaScript 可使用 XMLHttpRequest 对象来直接与服务器进行通信。通过这个对象, JavaScript 可在不重载页面的情况与 Web 服务器使用异步数据传输(HTTP 请求)交换数据,这样就可使网页从服务器请求少量的信息,而不是整个页面。AJAX 可使因特网应用程序更小、更快,更友好。

11.2  基本原理和技术

AJAX 基于下列 Web 标准:

  • JavaScript
  • XML
  • HTML
  • CSS

11.2.1  AJAX 使用 Http 请求

在传统的 JavaScript 编程中,假如您希望从服务器上的文件或数据库中得到任何的信息,或者向服务器发送信息的话,就必须利用一个 HTML 表单向服务器 GET 或 POST 数据。而用户则需要单击“提交”按钮来发送/获取信息,等待服务器的响应,然后一张新的页面会加载结果。

由于每当用户提交输入后服务器都会返回一张新的页面,传统的 web 应用程序变得运行缓慢,且越来越不友好。

图 11.1 AJAX与传统Web应用的区别

通过利用 AJAX,JavaScript 会通过 JavaScript 的 XMLHttpRequest 对象,直接与服务器来通信。

通过使用 HTTP 请求,web 页可向服务器进行请求,并得到来自服务器的响应,而不加载页面。用户可以停留在同一个页面,他或她不会注意到脚本在后台请求过页面,或向服务器发送过数据。

11.2.2  第一个AJAX应用程序

为了理解 AJAX 的工作原理,我们将创建一个小型的 AJAX 应用程序。

首先,我们需要一个带有两个文本框的 HTML 表单:用户名和时间。用户名文本框由用户填写,而时间文本框使用 AJAX 进行填写。

此HTML 文件名为 "testAjax.htm"(请注意这个 HTML 表单没有提交按钮!):

<html>

<body>

<form name="myForm">

用户:<input type="text" name="username"/>

时间:<input type="text" name="time"/>

</form>

</body>

</html>

表 11.1

AJAX 的要点是 XMLHttpRequest 对象。不同的浏览器创建 XMLHttpRequest 对象的方法是有差异的。IE 浏览器使用 ActiveXObject,而其他的浏览器使用名为 XMLHttpRequest 的 JavaScript 内建对象。

如需针对不同的浏览器来创建此对象,我们要使用一条 "try and catch" 语句。您可以在我们的 JavaScript 教程中阅读更多有关 try 和 catch 语句 的内容。

让我们用这段创建 XMLHttpRequest 对象的 JavaScript 来更新一下我们的 "exam.htm" 文件:

<html>

<body>

<script type="text/javascript">

function ajaxFunction() {

//首先声明一个保存 XMLHttpRequest 对象的 xmlHttp 变量

var xmlHttp;

try {

// Firefox, Opera 8.0+, Safari

xmlHttp=new XMLHttpRequest();

}   catch (e) {

// Internet Explorer

try {

xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");

} catch (e) {

try {

xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");

} catch (e) {

alert("您的浏览器不支持AJAX!");

return false;

}

}

}

/** 然后使用 XMLHttp=new   XMLHttpRequest() 来创建此对象。

这条语句针对   Firefox、Opera 以及 Safari 浏览器。假如失败,则尝试针对 Internet Explorer 6.0+ 的 xmlHttp=new   ActiveXObject("Msxml2.XMLHTTP"),假如也不成功,则尝试针对 Internet Explorer 5.5+ 的 xmlHttp=new   ActiveXObject("Microsoft.XMLHTTP")。

假如这三种方法都不起作用,那么这个用户所使用的浏览器已经太过时了,他或她会看到一个声明此浏览器不支持 AJAX 的提示。**/

}

</script>

<form name="myForm">

用户:<input type="text" name="username"/>

时间:<input type="text" name="time"/>

</form>

</body>

</html>

表 11.2

注意:上面这些浏览器定制的代码很长,也很复杂。不过,每当您希望创建 XMLHttpRequest 对象时,这些代码就能派上用场,因此您可以在任何需要使用的时间拷贝粘贴这些代码。上面这些代码兼容所有的主流浏览器:Internet Explorer、Opera、Firefox 以及 Safari。

11.2.3  更多有关 XMLHttpRequest 对象的知识

在向服务器发送数据之前,我们有必要解释一下 XMLHttpRequest 对象的三个重要的属性。

1.  onreadystatechange 属性

onreadystatechange 属性存有处理服务器响应的函数。下面的代码定义一个空的函数,可同时对 onreadystatechange 属性进行设置:

xmlHttp.onreadystatechange=function(){  // 我们需要在这里写一些代码  }

表 11.3

2.  readyState 属性

readyState 属性存有服务器响应的状态信息。每当 readyState 改变时,onreadystatechange 函数就会被执行。

这是 readyState 属性可能的值:

状态

描述

0

请求未初始化(在调用 open() 之前)

1

请求已提出(调用 send() 之前)

2

请求已发送(这里通常可以从响应得到内容头部)

3

请求处理中(响应中通常有部分数据可用,但是服务器还没有完成响应)

4

请求已完成(可以访问服务器响应并使用它)

表 11.4

我们要向这个 onreadystatechange 函数添加一条 If 语句,来测试我们的响应是否已完成(意味着可获得数据):

xmlHttp.onreadystatechange=function() {

if(xmlHttp.readyState==4){

//从服务器的response获得数据 }

}

表 11.5

3.  responseText 属性

可以通过 responseText 属性来取回由服务器返回的数据。

在我们的代码中,我们将把时间文本框的值设置为等于 responseText:

xmlHttp.onreadystatechange=function() {

if(xmlHttp.readyState==4) {

document.myForm.time.value=xmlHttp.responseText;

}

}

表 11.6

下一节,我们会介绍如何向服务器请求数据。

11.2.4  向服务器发送一个请求

要想把请求发送到服务器,我们就需要使用 open() 方法和 send() 方法。

open() 方法需要三个参数。第一个参数定义发送请求所使用的方法(GET 还是 POST)。第二个参数规定服务器端脚本的 URL。第三个方法规定应当对请求进行异步地处理。

send() 方法可将请求送往服务器。如果我们假设 HTML 文件和 JSP 文件位于相同的目录,那么代码是这样的:

xmlHttp.open("GET","time.jsp",true);

xmlHttp.send(null);

表 11.7

现在,我们必须决定何时执行 AJAX 函数。当用户在用户名文本框中键入某些内容时,我们会令函数“在幕后”执行。

<html>

<body>

<script type="text/javascript">

function ajaxFunction() {

var xmlHttp;

try {

// 检查浏览器是否是Firefox,   Opera 8.0+, Safari

xmlHttp=new XMLHttpRequest();

} catch (e) {

// 检查浏览器是否是Internet   Explorer

try {

xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");

} catch (e){

try {

xmlHttp=new   ActiveXObject("Microsoft.XMLHTTP");

} catch (e) {

alert("您的浏览器不支持AJAX!");

return false;

}

}

}

xmlHttp.onreadystatechange=function() {

if(xmlHttp.readyState==4) {

document.myForm.time.value=xmlHttp.responseText;

}

}

xmlHttp.open("GET","time.jsp",true);

xmlHttp.send(null);

}

</script>

<form name="myForm">

用户:<input type="text" name="username" onkeyup="ajaxFunction();"/>

时间:<input type="text" name="time"/>

</form>

</body>

</html>

例 11.1

下一节介绍 "time.jsp" 的程序,这样我们完整的 AJAX 应用程序就搞定了。

11.2.5  服务器端的脚本

现在,我们要创建可显示当前服务器时间的脚本。

responseText 属性会存储从服务器返回的数据。在这里,我们希望传回当前的时间。这是 "exam.jsp" 的代码:

<%@page import="java.text.SimpleDateFormat"%>

<%@ page contentType="text/html;   charset=gb2312" %>

<%@ page import="java.util.Date"   %>

<%

Date d_Date = new Date();

SimpleDateFormat dateFormat = new SimpleDateFormat();

response.getWriter().write(dateFormat.format(d_Date));

%>

例 11.1

运行AJAX 应用程序, 请在下面的文本框中键入一些文本,然后单击时间文本框。时间文本框可在不加载页面的情况下从 "exam.jsp" 获得服务器的时间。

图 11.2

11.3  高级应用

11.3.1  表单提示

在下面的 AJAX 例子中,我们会演示当用户向一个标准的 HTML 表单中输入数据时网页如何与 web 服务器进行通信。

图 11.3

这是一个简单的带有名为 text 输入域的jsp文件。点击表单的按钮会触发一个sendReq()函数。表单下面的段落包含了一个id为 "rst" 的 td,这个 td 充当了由 web 服务器所取回的数据的位置占位符。

当用户输入数据后,点击右边按钮时,名为 "sendReq()" 的函数就会被执行。

Jsp文件的代码:

<%@ page contentType="text/html;   charset=UTF-8" %>

<html>

<head>

<title>Ajax Test</title>

<script   language=javascript>

function   sendReq() {

if (window.ActiveXObject)   {

try {

http_request = new ActiveXObject("Msxml2.XMLHTTP");

}   catch (e)   {

http_request = new ActiveXObject("Microsoft.XMLHTTP");

}

}

if (!http_request) {

window.alert("xmlhttp not supported!");

return   false;

}

http_request.onreadystatechange = processReq;

http_request.open("GET", "/ajax/user.action?uname="   + document.forms[0].uname.value,   true);

http_request.send(null);

}

function processReq() {

if (http_request.readyState == 4) {

if (http_request.status == 200) {

var doc = http_request.responseXml;

document.getElementById("username").innerHTML = doc.getElementsByTagName("uname")[0].firstChild.nodeValue;

document.getElementById("usersex").innerHTML =   doc.getElementsByTagName("sex")[0].firstChild.nodeValue;

} else {

alert("error status:" +   http_request.status);

}

}

}

</script>

</head>

<body>

<h2>根据用户名检索详细信息</h2>

<form action="../user.action">

<input type="text"   name="uname">

<input type="button"   onclick="sendReq()"   value="检索">

<table>

<tr><td>姓名:</td><td id="username"></td></tr>

<tr><td>性别:</td><td id="usersex"></td></tr>

</table>

</form>

</body>

</html>

例 11.2

在上面的例子中,servlet是一个简单的名为 "XMLServlet.java" 的 servlet 文件。

下面我们列出了这个服务器页面代码的实例,使用servlet 来编写。

package com.etc.servlet;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

public class XMLServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request,

HttpServletResponse   response) throws ServletException, IOException {

//获取页面提交的参数:用户名

String user =   request.getParameter("uname");

System.out.println(user);

if (user != null) {

response.setContentType("application/xml;charset=UTF-8");

//利用Dom4j创建XML Document对象

Document xml   = createXMLFile();

String sxml =   xml.asXML();

System.out.println(sxml);

response.getWriter().write(sxml);

}

}

/**创建XML   Document对象

**@return Document

**/

public Document createXMLFile() {

Document document =   DocumentHelper.createDocument();

Element userElement   = document.addElement("user");

Element unameElement   = userElement.addElement("uname");

unameElement.setText("张三");

Element sex =   userElement.addElement("sex");

sex.setText("1");

return document;

}

@Override

protected void doPost(HttpServletRequest arg0,   HttpServletResponse arg1)

throws ServletException, IOException {

doGet(arg0, arg1);

}

}

例 11.2

该servlet在接受到客户端传来的姓名输入后,生成一个XML文档,并将该XML文档返回给客户端。

图 11.4

11.4  总结

  • AJAX通过 JavaScript 的 XMLHttpRequest 对象,直接与服务器来通信, 获取/传输数据。
  • 不同的浏览器创建 XMLHttpRequest 对象的方法是有差异的。IE 浏览器使用 ActiveXObject,而其他的浏览器使用名为 XMLHttpRequest 的 JavaScript 内建对象

最新文章

  1. 如何在高并发环境下设计出无锁的数据库操作(Java版本)
  2. 在Python中使用可变长参数列表
  3. rabbitmq
  4. ATPCS和AAPCS
  5. Windows Azure HandBook (3) 浅谈Azure安全性
  6. Android DisplayMetrics类获取屏幕大小
  7. 自动装箱(boxing)和自动拆箱(unboxing)
  8. cocos2dx 安卓编译问题收集
  9. android中sharedPreferences的用法
  10. cmd命令行查看windows版本
  11. Intellisense in Visual Studio for Microsoft Dynamics CRM 2016
  12. [转] Web 前端优化最佳实践之 Mobile(iPhone) 篇
  13. linux —— 搭建网页项目笔记
  14. html5新标签布局应用指南
  15. ASP.NET的版本?
  16. mysql 的链接字符
  17. python-django(创建项目、应用、运行)
  18. mysql distinct 用法详解及优化
  19. 使用ASP.NET Core的User Secrets特性
  20. GeoJSON 和 TopoJSON

热门文章

  1. jeasyUI treegrid 的 reload 和 getChanges
  2. OTN / SONET / SDH
  3. C# oracle 参数传递的多种方式 留着复习
  4. P3199 [HNOI2009]最小圈 01分数规划
  5. 洛谷 P1965 转圈游戏 —— 快速幂
  6. bzoj2466
  7. activity工作流表结构分析
  8. Hibernate的表之间的关系
  9. 赋予option元素点击事件后,点击select时却触发了option事件。如何解决?
  10. VF 查表