`

Ajax技术的基本原理(步骤)

    博客分类:
  • 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" onblur="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 url = "GetAndPostExample?timeStamp=" + new 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;
}

 3.用于处理显示结果的JSP文件:checkUser.jsp

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

 

以上就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.

 

在后台Action中可以用request.getParameter("参数名称") ; 方法获取。

 

 

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

 

 

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

 

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

1
2
分享到:
评论
4 楼 ysj5125094 2011-05-26  
badboyer 写道
ysj5125094 写道
ekea0407 写道
你这是基本步骤 不是基本原理

呵呵,误会误会...其实原理也没啥吧?就是异步刷新呗,还有什么呢?我是刚刚学Ajax,还请多多指教啊.


异步刷新和同步刷新只是一部分,


哈哈,俺要走的步还很长...
3 楼 badboyer 2011-05-26  
ysj5125094 写道
ekea0407 写道
你这是基本步骤 不是基本原理

呵呵,误会误会...其实原理也没啥吧?就是异步刷新呗,还有什么呢?我是刚刚学Ajax,还请多多指教啊.


异步刷新和同步刷新只是一部分,
2 楼 ysj5125094 2011-05-26  
ekea0407 写道
你这是基本步骤 不是基本原理

呵呵,误会误会...其实原理也没啥吧?就是异步刷新呗,还有什么呢?我是刚刚学Ajax,还请多多指教啊.
1 楼 ekea0407 2011-05-26  
你这是基本步骤 不是基本原理

相关推荐

    java web技术开发大全(最全最新)

    4.7.4 实例:用AJAX技术发送和接收中文信息 4.7.5 实例:在请求消息头和响应消息头中转输中文 4.8 小结 第5章 JSP技术 5.1 用MyEclipse编写第一个JSP程序 5.1.1 实例:编写显示服务器当前时间的JSP程序 ...

    RSS新闻聚合型网站的数据分析系统

    Internet的迅猛发展带来了一次又一次的技术革命,而这场...从数据分析这一基础概念谈起,分析了它的基本概念、分析步骤、过程实施等几个方面,然后围绕这一核心概念,将数据分析系统的组成、特征、分类进行了深入的剖析……

    java web开发技术大全

    4.7.4 实例:用AJAX技术发送和接收中文信息 4.7.5 实例:在请求消息头和响应消息头中转输中文 4.8 小结 第5章 JSP技术 5.1 用MyEclipse编写第一个JSP程序 5.1.1 实例:编写显示服务器当前时间的JSP...

    PHP入门到精通

    PHP与Ajax技术(教学录像:32分47秒) 24.1了解AJAX 24.2AJAX使用的技术 24.3Ajax开发需要注意的几个问题 24.4在PHP中应用AJAX技术的典型应用 Web Service与SOAP技术(教学录像:31分1秒) 25.1Web Service技术 25.2...

    PHP入门到精通02

    PHP与Ajax技术(教学录像:32分47秒) 24.1了解AJAX 24.2AJAX使用的技术 24.3Ajax开发需要注意的几个问题 24.4在PHP中应用AJAX技术的典型应用 Web Service与SOAP技术(教学录像:31分1秒) 25.1Web Service技术 25.2...

    Java基础知识点总结.docx

    十九、 Ajax原理及实现步骤★★★★★ 130 Ajax概述 130 Ajax工作原理 130 Ajax实现步骤 130 详解区分请求类型: GET或POST 131 $.ajax标准写法 134 二十、 正则表达式:其实是用来操作字符串的一些规则★★★☆ 135 ...

    亮剑.NET深入体验与实战精要2

    8.1.2 Ajax技术的核心 325 8.1.3 Ajax的工作原理 326 8.1.4 Ajax的优点 326 8.1.5 Ajax的问题 327 8.1.6 Ajax适用场景 327 8.1.7 Ajax不适用场景 329 8.1.8 XMLHttpRequest开发实例 329 8.2 微软VS.NET的Ajax开发 ...

    亮剑.NET深入体验与实战精要3

    8.1.2 Ajax技术的核心 325 8.1.3 Ajax的工作原理 326 8.1.4 Ajax的优点 326 8.1.5 Ajax的问题 327 8.1.6 Ajax适用场景 327 8.1.7 Ajax不适用场景 329 8.1.8 XMLHttpRequest开发实例 329 8.2 微软VS.NET的Ajax开发 ...

    asp.net知识库

    技术基础 New Folder 多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则...

    整理后java开发全套达内学习笔记(含练习)

    原则,原理,主义 ['prinsipl] priority n. 优先级 [prai'ɒriti] process n. 程序, 进程 ['prɒses] protected (关键字) 受保护的,私有的 [prә'tektid] provide v.规定(供应,准备,预防)[prә'vaid] refer to v....

    J2EE应用开发详解

    91 6.2 CSS 92 6.3 XSLT 94 6.4 小结 96 第7章 Ajax简介 97 7.1 Ajax简介 97 7.2 Ajax技术核心 100 7.2.1 XMLHttpRequest对象的常用方法 100 7.2.2 标准的XMLHttpRequest属性 101 7.3 一个简单的Ajax实例 101 7.4 小...

    千方百计笔试题大全

    38、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 12 39、String s=new String(“xyz”);创建了几个String Object? 12 40、接口是否可继承接口? 抽象类是否...

    java面试宝典

    38、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 12 39、String s=new String(“xyz”);创建了几个String Object? 12 40、接口是否可继承接口? 抽象类是否...

    JAVA上百实例源码以及开源项目

    2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性...

    最新Java面试宝典pdf版

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    Java面试笔试资料大全

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    JAVA面试宝典2010

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    Java面试宝典-经典

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    java面试题大全(2012版)

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    Java面试宝典2010版

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

Global site tag (gtag.js) - Google Analytics