Ajax技术的基本原理

我用一个简单的用户名验证的例子来谈一谈我对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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是二叉树?以及二叉树如何遍历?

像现实当中的树一样&#xff0c;需要把现实当中的树反过来看。 树根&#xff08;4偏移&#xff09; 左子树(0偏移) 右子树&#xff08;8偏移&#xff09; (树根) (树根) 左子树 右子树 左子树 右子树 (树根) (树根…

python装饰器带参数函数_当我使用带参数的python装饰器时,如何将参数传递给最内部的函数?...

当Func返回不是真时&#xff0c;我的装饰器用于召回Func。def deco_retry(retry_times): def _deco_retry(func): def wrapper(*args, **kwargs): while retry_times > 0: ret func(*args, **kwargs) if ret: return ret retry_times - 1 return wrapper return _deco_retr…

[html] 进入编辑页面时,如何把光标聚焦到第一个input?

[html] 进入编辑页面时&#xff0c;如何把光标聚焦到第一个input&#xff1f; <title>Insert title here</title> <script> window.onload function () { var input document.getElementById("username"); input.focus(); } </script> 个…

GODADDY主机用tar命令通过SSH远程打包20M以上的文件

GODADDY的虚拟主机控制面板虽然使用起来非常方便&#xff0c;对于文件管理的很多操作也非常到位&#xff0c;但是有一个非常令人头疼的问题&#xff0c;就是GODADDY在 主机控制面板中只支持小于20M的文件打包&#xff0c;这对于大部分的站长朋友来说&#xff0c;是非常不方便的…

[html] 你有使用过MediaRecorder吗?说说它的运用场景有哪些?

[html] 你有使用过MediaRecorder吗&#xff1f;说说它的运用场景有哪些&#xff1f; 录屏个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

python链表怎么定义_python:链表定义以及实现

链表&#xff08;linked list&#xff09;是一组数据项的集合&#xff0c;其中每个数据项都是一个节点的一部分&#xff0c;每个节点还包含指向下一个节点的链接. 链表的数据结构如下图所示在链表中删除操作可以通过修改指针来实现,如下图所示:插入则是调整,插入点的前后两个指…

NetCore 依赖注入之服务之间的依赖关系

简单介绍,直接官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?viewaspnetcore-2.2 public interface IOperation {Guid OperationId { get; } }public interface IOperationTransient : IOperation { }public interface IOperatio…

安卓注册手机短信验证码验证的案例-01

为了实现注册手机验证验证码 在网上百度了许久的注册手机验证码发送验证的案例要么是太过时要么就是不能用了 在此把我最近几天研究的成果发到这里希望 能够给遇到相同问题的人给予帮助 首先看看运行的效果图&#xff1a; 简单的介绍下博主用的是mod 的sdk来短信验证 使用的…

项目管理理论与实践系列文章索引

项目管理理论与实践&#xff08;1&#xff09;——企业项目管理介绍 项目管理理论与实践&#xff08;2&#xff09;——软件需求分析 项目管理理论与实践&#xff08;3&#xff09;——如何进行有效的项目管理 项目管理理论与实践&#xff08;4&#xff09;——UML应用&#xf…

Gym - 100543L

Gym - 100543Lhttps://vjudge.net/problem/153854/origin区间dp&#xff0c;要从区间长度为1开始dp #include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include<set> #in…

安卓注册手机短信验证码验证的案例-02

本部分我们将讲述如何实现手机注册验证码的代码 首先我们得有一个验证码的界面如下图所示&#xff1a; 代码如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/an…

[html] input上传图片怎样触发默认拍照功能?

[html] input上传图片怎样触发默认拍照功能&#xff1f; 使用 capture 属性&#xff0c;capture 的值可以是&#xff1a;camera 打开摄像头user 打开前置摄像头environment 打开后置摄像头以上几个属性都不能保证设备会按照设置的一样打开前置或后置摄像头&#xff0c;如果设备…

推荐阅读《大话设计模式》的策划编辑陈禹成写的新书《电脑使用说明书》

三年前&#xff0c;我很幸运能与陈禹成&#xff08;当年叫陈冰&#xff0c;曾是清华大学出版社策划编辑&#xff09;合作&#xff0c;完成了《大话设计模式》的创作和出版工作。应该说&#xff0c;没有陈禹成的帮助&#xff0c;也不可能有《大话设计模式》的成功。非常感谢他&a…

python复利计算_使用Python函数计算复利

写一个函数&#xff0c;在给定的年数后&#xff0c;用给定的初始余额和利率计算银行帐户的余额。假设利息每年复利。在 出现错误“ValueError:索引28处不支持格式字符I&#xff08;0x49&#xff09;” 这是我目前为止的代码。在def BankBalance(): InputB 1000 return InputB …

c# asp.net mvc 开发的正方教务助手(一)

在网上百度了很多模拟登陆教务教务助手的教程 要么是java要么是php要么就是python 难得查找到一个c#的结果又是客户端的&#xff0c;一个网页版的都没看到 于是楼主决定在研究&#xff0c;自行写一个网页版方正教务助手 历时一个星期终于完成&#xff0c;效果如下所示&…

[html] input上传文件可以同时选择多张吗?怎么设置?

[html] input上传文件可以同时选择多张吗&#xff1f;怎么设置&#xff1f; <input type"file" multiple"multiple" value"浏览" />个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷…

C# 解析 Targa文件 (TGA) 图形

使用方法 ImageTGA _Tga new ImageTGA(); Bitmap _Bitmap new Bitmap(124, 234); this.DrawToBitmap(_Bitmap, new Rectangle(0, 0, 124, 234)); _Tga.Image _Bitmap; _Tga.SaveImage("C:\1.tga"); 保存的时候只实现了非RLE的 8位 24位 32位 有需要的自己改写下 S…

python中读写excel_python读写Excel

Python读写excel 对于python 处理excel 表格&#xff0c;这个日常工作的需求还是不少&#xff0c;于是查查资料&#xff0c;自己写写&#xff0c;总结一下&#xff0c;记录一下&#xff0c;下次遇到直接拿过来用&#xff0c;方便自己&#xff0c;方便大家。 好在python有读写ex…

c# asp.net mvc 开发的正方教务助手(二)

在上一篇文章展示了项目实际运行情况 现在我们来分析该项目如何完成的&#xff1a; 第一步&#xff1a;登陆你们的教务&#xff0c;这是我们学习的教务的主页http://jw.svtcc.edu.cn/Default2.aspx&#xff0c;进去之后&#xff0c;打开使用火狐浏览器进行登陆分析 在火狐浏览…

[html] 如何禁止input输入的历史记录?

[html] 如何禁止input输入的历史记录&#xff1f; 给form加上 autocompleteoff 可以禁止整个表单的历史记录给单个input加上 autocompleteoff 可禁止这个input的历史记录个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。…