我用一个简单的用户名验证的例子来谈一谈我对Ajax的了解:

这个例子用到了两个JSP和一个JS,我没有用后台来验证,因为原理是一样的.

1.用户注册表单页:ajaxCheckUser.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>商账追收
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Ajax检测用户名</title>
<script type="text/javascript" src="../js/ajaxCheckUser.js"></script>
</head>
<body>
    <form action="">
        用户名:<input type="text" id="username" οnblur="checkUserAjax();"/><br/>
        <div id="msg"></div>
        密&nbsp;&nbsp;码:<input type="password" id="password"/><br/>
        Email:<input type="text" id="email"/><br/>
        <input type="button" id="submit" value="submit" />&nbsp;&nbsp;
        <input type="button" id="reset" value="reset" />
    </form>
</body>
</html>

2.用于说明Ajax技术的基本原理的JS文件:ajaxCheckUser.js

//当输入框失去焦点时触发些函数
function checkUserAjax(){
    //第一步:创建XMLHttpRequest对象
    var xhr = createXmlHttpRequest() ;
    //第二步:建立对服务器的调用
    /**
     * open(method,url,asynch)方法和属性介绍
     * 1.XMLHttpRequest 对象的 open 方法允许程序员用一个Ajax调用向服务器发送请求。
     * 2.method:请求类型,类似 "GET"或"POST"的字符串。
     *       若只想从服务器检索一个文件,而不需要发送任何数据,使用GET(可以在GET请求里通过附加在URL上的查询字符串来发送数据,不过数据大小限制为2000个字符)。
     *    若需要向服务器发送数据,用POST。
     * 3.url:路径字符串,指向你所请求的服务器上的那个文件。可以是绝对路径或相对路径。
     *       在某些情况下,有些浏览器会把多个XMLHttpRequest请求的结果缓存在同一个URL。
     *    如果对每个请求的响应不同,这就会带来不好的结果。把当前时间戳追加到URL的最后,就能确保URL的惟一性,从而避免浏览器缓存结果。
     *       例如:var&nbsp;url&nbsp;=&nbsp;"GetAndPostExample?timeStamp="&nbsp;+&nbsp;new&nbsp;Date().getTime();
     * 4.asynch:表示请求是否要异步传输,默认值为true(异步)。
     *    指定true,在读取后面的脚本之前,不需要等待服务器的相应。
     *    指定false,当脚本处理过程经过这点时,会停下来,一直等到Ajax请求执行完毕再继续执行。
     */
    var username = document.getElementById("username").value ;//获得输入的用户名
    xhr.open("post","checkUser.jsp?username="+username,true) ;
   
    /**
     * setRequestHeader()方法和属性介绍
     * 1.当浏览器向服务器请求页面时,它会伴随这个请求发送一组首部信息。这些首部信息是一系列描述请求的元数据(metadata)。
     *      首部信息用来声明一个请求是 GET 还是 POST
     * 2.Ajax 请求中,发送首部信息的工作可以由 setRequestHeader完成
     * 3.参数header: 首部的名字;  参数value:首部的值。
     * 4.如果用 POST 请求向服务器发送数据,需要将 "Content-type" 的首部设置为 "application/x-www-form-urlencoded".它会告知服务器正在发送数据,并且数据已经符合URL编码了。
     * 5.该方法必须在open()之后才能调用
     */
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded")//如果发送方式为POST时,需要设置首部信息 ;
   
    //第三步:向服务器发送请求
    /**
     * send(data)方法和属性介绍
     * 1.open 方法定义了 Ajax 请求的一些细节。send 方法可为已经待命的请求发送指令
     * 2.data:将要传递给服务器的字符串
     * 3.若选用的是 GET 请求,则不会发送任何数据, 给 send 方法传递 null 即可:xhr.send(null);
     * 4.当向send()方法提供参数时,要确保open()中指定的方法是POST,如果没有数据作为请求体的一部分发送,则使用null.
     */
    xhr.send(null) ;
    //第四步:接收服务器的处理结果
    /**
     * 用 XMLHttpRequest 的方法可向服务器发送请求。在 Ajax 处理过程中,XMLHttpRequest 的如下属性可被服务器更改:
     * 1.readyState:
     *         该属性表示Ajax请求的当前状态。它的值用数字代表:
     *         (1).0 代表未初始化。 还没有调用 open 方法
     *         (2).1 代表正在加载。 open 方法已被调用,但 send 方法还没有被调用
     *         (3).2 代表已加载完毕。send 已被调用。请求已经开始
     *         (4).3 代表交互中。服务器正在发送响应
     *         (5).4 代表完成。响应发送完毕
     *         每次 readyState 值的改变,都会触发 readystatechange 事件。
     *         如果把 onreadystatechange 事件处理函数赋给一个函数,那么每次 readyState 值的改变都会引发该函数的执行。
     *         readyState 值的变化会因浏览器的不同而有所差异。但是,当请求结束的时候,每个浏览器都会把 readyState 的值统一设为 4
     * 2.status:
     *         服务器发送的每一个响应也都带有首部信息。三位数的状态码是服务器发送的响应中最重要的首部信息,并且属于超文本传输协议中的一部分。
     *         常用状态码及其含义:
     *         (1).404 没找到页面(not found)
     *         (2).403 禁止访问(forbidden)
     *         (3).500 内部服务器出错(internal service error)
     *         (4).200 一切正常(ok)
     *         (5).304 没有被修改(not modified)(服务器返回304状态,表示源文件没有被修改 )
     *         在 XMLHttpRequest 对象中,服务器发送的状态码都保存在 status 属性里。通过把这个值和 200 或 304 比较,可以确保服务器是否已发送了一个成功的响应
     * 3.responseText:
     *         该属性包含了从服务器发送的数据。它是一个HTML,XML或普通文本,这取决于服务器发送的内容。
     *         当 readyState 属性值变成 4 时, responseText 属性才可用,表明 Ajax 请求已经结束。
     * 4.responseXML:
     *         如果服务器返回的是 XML, 那么数据将储存在 responseXML 属性中。
     *         只用服务器发送了带有正确首部信息的数据时, responseXML 属性才是可用的。 MIME 类型必须为 text/xml
     */
    //指定响应处理函数
    xhr.onreadystatechange = function(){
        //对象的状态为4表示已完成
        if(xhr.readyState==4){
            //成功返回200,没有修改返回304
            if(xhr.status==200||xhr.status==304){
                //开始处理信息
                //alert(xhr.responseText) ;
                document.getElementById("msg").innerHTML = xhr.responseText ;
            }
        }
    }

}

/**
 * 创建XMLHttpRequest实例(兼容IE和Firefox等浏览器)
 */
function createXmlHttpRequest(){
    var xmlhttp = null;
    try{
        //适用的浏览器Firefox, Opera 8.0+, Safari
        xmlhttp=new XMLHttpRequest();
    }catch(e){
        //IEIE7.0以下的浏览器以ActiveX组件的方式来创建XMLHttpRequest对象
        var MSXML =
        ['MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.5.0',
        'MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0',
        'MSXML2.XMLHTTP','Microsoft.XMLHTTP'];
        for(var n = 0; n < MSXML.length; n ++){
            try{
                //根据MSXML数组循环获得支持ActiveX插件的IE版本号,如果抛出异常,那么继续判断下一个否则产生XMLHttpRequest对象跳出循环
                xmlhttp = new ActiveXObject(MSXML[n]);
                break;
            }catch(e){}}
        }
    return xmlhttp;
}

以上就OK了,我也是为了学习ExtJS所以才看了看Ajax,现在我把我的学习笔记贴上了,供大家参考,同时给予指正.

如果在后台想往前台传XML格式的结果,那么可以在上面的JS文件中加入这个方法.并且修改返回结果的JSP文件.具体如下:

ajaxCheckUser.js文件增加函数如下:

//适用于返回结果为XML格式
function checkUserAjaxXML(){
    //第一步:创建XMLHttpRequest对象
    var xhr = createXmlHttpRequest() ;
    //第二步:建立对服务器的调用
    xhr.open("post","checkUserXML.jsp",true) ;
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded")//如果发送方式为POST时,需要设置首部信息 ;
   
    //第三步:向服务器发送请求
    var username = document.getElementById("username").value ;//获得输入的用户名
    xhr.send("username="+username) ;
    //第四步:接收服务器的处理结果
    //指定响应处理函数
    xhr.onreadystatechange = function(){
        //对象的状态为4表示已完成
        if(xhr.readyState==4){
            //成功返回200,没有修改返回304
            if(xhr.status==200||xhr.status==304){
                //开始处理信息
                //document.getElementById("msg").innerHTML = xhr.responseText ;
                //此处用XML专有的方式接收
                var xmlResult = xhr.responseXML ;
                /*
                第一种拆分XML的方法 start
                var root = xmlResult.documentElement ;//获得XML的根节点
                var codeNode = root.firstChild ;//获得Code节点
                var msgNode = root.lastChild ;//获得Msg节点
                if(codeNode.firstChild.nodeValue){
                    document.getElementById("msg").innerHTML = lastNode.msgNode.nodeValue ;
                }
                第一种拆分XML的方法 end
                */
               
                //第二种拆分XML的方法DOM start
                var codeNode = xmlResult.getElementsByTagName("code")[0] ;//获得code节点
                var msgNode = xmlResult.getElementsByTagName("msg")[0] ;//获得msg节点
                if(codeNode.firstChild.nodeValue){
                    document.getElementById("msg").innerHTML = msgNode.firstChild.nodeValue ;
                }
                //第二种拆分XML的方法DOM end
               
            }
        }
    }

}

注意:此处的下面部分,已经做了修改.

xhr.open("post","checkUserXML.jsp",true) ;

接收方式也改为.

var xmlResult = xhr.responseXML ;

之后重新建立一个checkUserXML.jsp文件,用于返回XML格式的结果.代码如下:

<%@ page language="java" contentType="text/xml; charset=UTF-8"
    pageEncoding="UTF-8"%><?xml version="1.0" encoding="UTF-8"?>
<%
    String username = request.getParameter("username") ;
    String msg = "" ;
    int code = 0 ;
    if(username!=null){
        if("admin".equals(username)){
            msg = "用户名已经存在" ;
            code = 0 ;
        }else{
            msg = "用户名可以使用" ;
            code = 1 ;
        }
    }else{
        username = "" ;
    }
    //out.print(msg) ;
%><result><code><%=code%></code><msg><%=msg%></msg></result>

注意 :

1.<?xml version="1.0" encoding="UTF-8"?>这个XML首部分,必须追加到脚本末尾,不能有回车,不然会出现意想不到的结果.... ....

2.contentType="text/xml; charset=UTF-8"中已经由原来的text/html改为text/xml了.如果不改为xml会很麻烦.

如果想在后台往回传JSON格式的内容,那么请在ajaxCheckUser.js文件中增加下面这个函数:

//适用于返回结果为JSON格式
function checkUserAjaxJSON(){
    //第一步:创建XMLHttpRequest对象
    var xhr = createXmlHttpRequest() ;
    //第二步:建立对服务器的调用
    xhr.open("post","checkUserJSON.jsp",true) ;
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded")//如果发送方式为POST时,需要设置首部信息 ;
   
    //第三步:向服务器发送请求
    var username = document.getElementById("username").value ;//获得输入的用户名
    xhr.send("username="+username) ;
    //第四步:接收服务器的处理结果
    //指定响应处理函数
    xhr.onreadystatechange = function(){
        //对象的状态为4表示已完成
        if(xhr.readyState==4){
            //成功返回200,没有修改返回304
            if(xhr.status==200||xhr.status==304){
                //开始处理信息
                var xmlResult = xhr.responseText ;
                var msgJson = eval("("+xmlResult+")") ;//注意此处必须写"("和")",目的是先解析xmlResult的内容,再将其转换
                if(msgJson){
                    document.getElementById("msg").innerHTML = msgJson.msg ;
                    if(msgJson.code==1){
                        //如果用户名已经存在那么将光标重新定位
                        document.getElementById("msg").focus ;
                    }
                }
            }
        }
    }

}

checkUserJSON.jsp文件内容如下:

<%@ page language="java" contentType="text/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String username = request.getParameter("username") ;
    String msg = "" ;
    int code = 0 ;
    if(username!=null){
        if("admin".equals(username)){
            msg = "用户名已经存在" ;
            code = 0 ;
        }else{
            msg = "用户名可以使用" ;
            code = 1 ;
        }
    }else{
        username = "" ;
    }
    //out.print(msg) ;
%>{"code":"<%=code %>","msg":"<%=msg %>"}

注意 :需要将contentType="text/html; charset=UTF-8"中的text/html改为text/json.

其他的没啥了,请做试验... ...

当然,我已经通过试验了.

刚才有个哥们第一时间给我指出了错误,说我这个不是原理是步骤,我也是比较赞同的,呵呵.不过我还属于菜鸟,刚开始接触Ajax,所以还得大家多多指教啊.呵呵,我自己认为Ajax就是异步刷新的代名词吧,且是局部刷新,呵呵.

转载于:https://www.cnblogs.com/ctou45/archive/2011/05/26/2059043.html

Ajax技术的基本原理相关推荐

  1. 2007最受欢迎的十大Ajax技术文章

    DeveloperWorks 中国网站 Ajax 技术资源中心在 2007 年上半年里发表了很多和 Ajax 相关的技术文章.教程.多媒体课堂和专栏.我们特地整理出 2007 上半年最受读者欢迎的内容 ...

  2. AJAX技术简介及入门实例[收藏]

    最近在学校参加暑期实习,参与的是一个社交网站项目,学长那边分配给的任务是前端开发,需要学习AJAX技术. 对于一个像我一样刚刚接触Web开发且无多少实际项目经验的新手而言,AJAX技术显得复杂而又深奥 ...

  3. php动态网站开发 唐四薪 答案,ASP动态网页设计与Ajax技术 (唐四薪谭晓兰) pdf扫描版_IT教程网...

    <asp动态网页设计与ajax技术>全面介绍了asp动态网页设计与ajax技术,采用asp作为开发环境结合基于jquery的ajax技术,显著降低了ajax的入门难度.在叙述有关原理时安排 ...

  4. PHP Wbe程序设计与Ajax,PHP Web程序设计与Ajax技术(第2版)

    章Web应用程序开发概述 1.1网络应用程序结构的演变 1.1.1B/S结构和C/S结构 1.1.2Web应用程序 1.1.3Web的有关概念 1.2网页的类型和工作原理 1.2.1静态 章Web应用 ...

  5. Ajax技术群英会,火热报名中!

    Ajax技术群英会 --说说你最爱的Ajax框架 一.会议介绍 Ajax不仅仅是一种技术,更是Web 2.0时代最具创意的思想之一,它对Web世界的影响极其深远.随着Ajax技术的发展,各种Ajax框 ...

  6. 如何使用Ajax技术开发Web应用程序(2)

    在上一篇文章中,我们讨论了如何通过javascript从一个远程XML文件中取得数据.在这篇文章中,我们将学会怎样对数据作更复杂的处理.作为一个示例,我们会准备一组XML数据,将数据分割成独立的片断并 ...

  7. Asp.net中的AJAX学习记录之一 AJAX技术的崛起与Asp.net AJAX的诞生

      最近开始学习Asp.net中的AJAX,可能我的高手朋友们会说:"走还不稳呢!怎么就想学跑了?"呵呵!主要是我在做项目中体会到AJAX真的是很好的一门技术,应该好好的学习一下, ...

  8. AJAX技术其实就是多年前我就使用过的XMLHTTP

    AJAX技术其实就是多年前我就使用过的XMLHTTP: 1)<BODY οnlοad='setInterval("getDaytime()",(GetCookie(" ...

  9. php与ajax技术

    web2.0的到来,ajax逐渐成为主流,什么是ajax,ajax的开发模式,优点,使用技术.(ajax概述,ajax使用的技术,需要注意的 问题,在PHP应用ajax技术的应用) 什么是ajax,a ...

最新文章

  1. python好学嘛-马哥教育官网-专业Linux培训班,Python培训机构
  2. Cocos2dx学习笔记9:cocos2dx锚点(Anchor Point)
  3. oracle结果集过大,多重子查询/大结果集查询问题
  4. php 保护变量,保护PHP中的“包含污染”变量
  5. VTK:相互作用之KeypressObserver
  6. 2018实用前端面试问题集锦
  7. Spring MVC静态资源实例
  8. flutter 拖拽布局_使用Flutter模仿SOUL可任意拖动的悬浮按钮
  9. UI使用素材模板|login登录界面
  10. 安卓期末大作业(AndroidStudio开发),日记本app,代码注释详细,能正常运行
  11. ads1115多片并联
  12. 红警2科技时代2.7正式版
  13. 【CST】贴片天线阵列设计
  14. 因违反《竞业协议》,三年白忙活了!赔偿 97.6 万元,返还 15.8 万元
  15. 公司法人代表变更需要多少钱?
  16. 高德地图嵌入到threejs全景中的踩坑指南
  17. Word如何交叉引用以及交叉引用参考文献后使用逗号分隔
  18. MySQL进阶:触发器
  19. Vue 表情输入组件,微信face表情组件
  20. 使用Docker安装HomeAssistant

热门文章

  1. 基于 Spring Cloud 完整的微服务架构实战
  2. python一步将npy数据保存成mat
  3. 高德地图如何将比例尺放大到10米?
  4. Shadow Brokers 公布 2.1 万美元的 0day 订阅服务
  5. 《CCIE路由和交换认证考试指南(第5版) (第1卷)》——1.6节虚拟交换系统
  6. 使用curl登陆上网账号
  7. 谷歌笔试题(Google十二岁生日晚)
  8. 英法德三门语言同时达到c1,【分享】插翅而飞的孩子(转载)
  9. api地理编码_通过地理编码API使您的数据更有意义
  10. 北方工业大学gpa计算_北方大学联盟仓库的探索性分析