ajax心得3--编写ajax同用工具代码以及案例分析

1. 初始化XMLHttpRequest对象模版
function   createXmlHttpRequest(){
   var xmlHttp;
   try{    //Firefox,Opera 8.0+,Safari
           xmlHttp=new XMLHttpRequest();
    }catch (e){
           try{    //Internet Explorer
                  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
            }catch (e){
                  try{
                          xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                  }catch (e){}  
           }
    }
   return xmlHttp;
 }
2.手动编写ajax通用工具代码
//通过id获取dom对象
function $(id) {
	return document.getElementById(id);
}

// ajax技术必须创建XMLHTTPRequest对象 ,获取XMLHTTPRequest对象的操作
function createXHR() {
	var xhr;
	var aVersion = [ "MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp" ];
	try {
		// 高版本ie、firefox、opera等浏览器直接new出ajax对象
		xhr = new XMLHttpRequest();
	} catch (e) {
		// 低版本的IE,ie6以下版本需要通过以下操作创建ajax对象
		for ( var i = 0; i < aVersion.length; i++) {
			try {
				xhr = new ActiveXObject(aVersion[i]);
				return xhr;
			} catch (e) {
				continue;
			}
		}
	}
	return xhr;
}
3.ajax处理分页技术案例
window.onload = function() {
	// 获取按钮对象
	var queryBtnDom = $("queryBtn");

	// 给按钮设置点击事件操作
	queryBtnDom.onclick = function() {

		var content = "pagination.nowPage=" + 1;
		var url = "./csdn/UserAction_query.action?time=" + new Date().getTime();
		// 调用ajax处理过的请求发送操作
		sendPost(content,url,managerSuccess,managerFail);

		// 处理成功的方法
		function managerSuccess(xhr) {
			// 创建出XML dom对象
			var XMLDom = xhr.responseXML;
			// 创建xml的跟对象
			var root = XMLDom.documentElement;
			// 获取跟对象的子节点
			var users = root.getElementsByTagName("user");
			// 显示数据操作
			showUsers(users);

			// 分页操作
			// 首页
			$("firstPage").onclick = function() {
				// 给请求的数据重新设一下值,然后重新发送一回请求
				content = "pagination.nowPage=" + 1;
				sendPost(content,managerFail);
			};
			// 上一页
			$("backPage").onclick = function() {
				// 给请求的数据重新设一下值,然后重新发送一回请求
				content = "pagination.nowPage="
						+ eval(root.getAttribute("nowPage") + "-" + 1);
				sendPost(content,managerFail);

			};
			// 下一页
			$("nextPage").onclick = function() {
				// 给请求的数据重新设一下值,然后重新发送一回请求
				content = "pagination.nowPage="
						+ eval(root.getAttribute("nowPage") + "+" + 1);
				sendPost(content,managerFail);

			};
			// 末页
			$("lastPage").onclick = function() {
				// 给请求的数据重新设一下值,然后重新发送一回请求
				content = "pagination.nowPage="
						+ root.getAttribute("countPage");
				sendPost(content,managerFail);
			};
		}

		function managerFail(xhr) {
			alert("处理失败");
		}

	};
};

// 封装一个创建Element元素的方法
function CE(tag) {
	return document.createElement(tag);
}
// 封装一个创建文本节点的方法
function CT(t) {
	return document.createTextNode(t);
}

// 发送请求的方法
function sendPost(content,success,fail) {
	var xhr = createXHR();
	// 触发器
	xhr.onreadystatechange = function() {
		if (xhr.readyState == 4) {
			if (xhr.status == 200 || xhr.status == 304) {
				success(xhr);
			} else {
				fail(xhr);
			}
		}
	};
	// 打开请求
	xhr.open("POST",true);
	// 设置类型
	xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	// 发送请求

	xhr.send(content);
	// };
}

// 显示数据的方法
function showUsers(users) {
	// 获取tbody的dom对象
	var tbodyDom = $("showUsers");
	// 清空数据
	if (tbodyDom.hasChildNodes()) {
		for ( var jj = 0; jj < tbodyDom.childNodes.length;) {
			tbodyDom.removeChild(tbodyDom.childNodes[jj]);
		}
	}

	// 遍历添加数据
	for ( var i = 0; i < users.length; i++) {
		var user = users[i];
		if (user.nodeType == 1) {
			// 创建tr元素节点
			var tr = CE("tr");

			// 创建td元素节点
			// 创建一个复选框节点
			var td1 = CE("td");
			var input = CE("input");
			// 为td1设置属性
			input.setAttribute("type","checkbox");
			input.setAttribute("value",user.getAttribute("id"));

			var td2 = CE("td");
			var td3 = CE("td");
			var td4 = CE("td");
			var td5 = CE("td");
			var td6 = CE("td");
			var td7 = CE("td");

			// 将文本节点追加到td上;这里要注意不能使用方法链追加,否则界面会让你很难受
			td1.appendChild(input);
			td2.appendChild(CT(user.getAttribute("id")));
			td3
					.appendChild(CT(user.getElementsByTagName("name")[0].firstChild.nodeValue));
			td4
					.appendChild(CT(user.getElementsByTagName("sex")[0].firstChild.nodeValue));
			td5
					.appendChild(CT(user.getElementsByTagName("email")[0].firstChild.nodeValue));
			td6
					.appendChild(CT(user.getElementsByTagName("birthday")[0].firstChild.nodeValue));

			// 将td追加到tr上
			tr.appendChild(td1);
			tr.appendChild(td2);
			tr.appendChild(td3);
			tr.appendChild(td4);
			tr.appendChild(td5);
			tr.appendChild(td6);
			tr.appendChild(td7);
			// 将tr节点添加到tbody中
			tbodyDom.appendChild(tr);
		}
	}
}

用户名注册时使用ajax验证处理
window.onload=function(){
	//根据id获取需要用ajax技术处理的数据的dom对象,util.js和reg.js位于同一包下,固可以相互引用
	var uNameDom = $("userName");
	//为uNameDom注册失去焦点的事件
	uNameDom.onblur=function(){
		//将获取到的用户名名称封装成请求数据
		var content = "uName="+uNameDom.value;
		//设置请求路径,并通过时间戳的形式产生唯一url
		var url = "./csdn/UserAction_checkName.action?time="+new Date().getTime();
		//创建ajax对象
		var xhr = createXHR();
		
		//这里状态为0,状态吗的默认值是0,说明从0变1时才触发onreadystatechange事件
		//alert(xhr.readyState);
		//为xhr对象设置一个触发器事件,改事件服务器自己处理
		xhr.onreadystatechange=function(){
			//alert(xhr.readyState);状态从1-4执行
			if(xhr.readyState==4){
				if(xhr.status==200||xhr.status==304){
					$("name").innerHTML=xhr.responseText;
				}
			}
		};
		//打开请求
		xhr.open("POST",true);
		//如果是post请求需要进行如下操作,告诉浏览器正在发送符合url编码的数据;括号内一个单词不能错,错一个就不能将数据传给servlet了
		xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		//发送数据
		xhr.send(content);
	};
};

Action处理代码
package www.csdn.project.action;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import www.csdn.project.domain.User;
import www.csdn.project.service.UserService;
import www.csdn.project.service.UserServiceImpl;
import www.csdn.project.utils.Pagination;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
	
	private String uName;
	
	//分页的当前页属性,这里一定要指明泛型所指向的类型,否则就会出错
	private Pagination<User> pagination;
	
	//声明一个事务对象
	private UserService service = new UserServiceImpl();

	// 通过ServletActionContext类获取response对象,将在action中的操作转向servlet的操作
	private HttpServletResponse response = ServletActionContext.getResponse();
	
	//声明一个输出对象
	private PrintWriter out;
	
	
	

	public Pagination<User> getPagination() {
		return pagination;
	}

	public void setPagination(Pagination<User> pagination) {
		this.pagination = pagination;
	}

	public String getUName() {
		return uName;
	}

	//一定要注意命名规范,set注入方法和get获值的方法首字母一定要大写,否则不起作用切记
	public void setUName(String uName) {
		this.uName = uName;
	}
	
	
	//登录操作
	public String login(){
		return SUCCESS;
	}

	//检查名字
	public String checkName() {
		
		response.setContentType("text/html;charset=utf-8");
		
		//实例化out对象
		try {
			out = response.getWriter();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		User entity = service.getObjectByName(uName);

		if (entity != null) {
			out.print("用户名已经存在");
		} else {
			out.print("用户名可以使用");
		}
		out.flush();
		out.close();
		return "reg";
	}
	
	
	//查找所有
	public String query(){
		
		response.setContentType("text/xml;charset=utf-8");
		System.out.println(pagination.getNowPage()+"====================");
		pagination = new Pagination<User>(User.class,pagination.getNowPage());
		//实例化out对象
		try {
			out = response.getWriter();
		} catch (IOException e) {
			e.printStackTrace();
		}

		//拼出xml文件,用来存放从数据库取出的数据
		out.println("<?xml version='1.0' encoding='UTF-8'?>");
		out.println("<users nowPage='"+pagination.getNowPage()+"' countPage='"+pagination.getCountPage()+"' countRecond='"+pagination.getCountRecond()+"'>");
		//遍历
		for(User entity: pagination.getEntities()){
			out.print("<user id='"+entity.getId()+"'>");
			out.print("<name>");
			out.print(entity.getName());
			out.print("</name>");
			out.print("<sex>");
			out.print(entity.getSex());
			out.print("</sex>");
			out.print("<birthday>");
			out.print(entity.getBirthday());
			out.print("</birthday>");
			out.print("<email>");
			out.print(entity.getEmail());
			out.print("</email>");
			out.print("</user>");
		}
		out.println("</users>");
		
		//刷新out对象,使数据不把缓存中存,直接显示
		out.flush();
		out.close();
		return "xml";
	}

}

分页显示界面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户管理界面</title>

<script type="text/javascript"
	src="${ pageContext.request.contextPath }/js/util.js"></script>

<script type="text/javascript"
	src="${ pageContext.request.contextPath }/js/user/query.js"></script>
</head>

<body>
	<div align="center">
		<div>
			<h3>用户管理界面</h3>
			<input type="button" value="会员管理" id="queryBtn" />
		</div>
		<hr>
		<div>
			<!-- 显示从数据库提取的信息然后放到一个xml中再取出遍历的数据 -->
			<h3>显示数据</h3>
			<table bordercolor="teal" border="1px" cellspacing="0"
				cellpadding="0" width="800px">
				<thead>
					<tr>
						<th>选择</th>
						<th>序号</th>
						<th>姓名</th>
						<th>性别</th>
						<th>邮箱</th>
						<th>生日</th>
						<th>操作</th>
					</tr>
				</thead>
				<tbody id="showUsers"></tbody>
			</table>
			<div>
			  <input type="button" value="首页" id="firstPage"/>
			  <input type="button" value="上一页" id="backPage"/>
			  <input type="button" value="下一页" id="nextPage"/>
			  <input type="button" value="末页" id="lastPage"/>
			</div>
		</div>
	</div>
</body>
</html>

首界面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>


<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">


<!--
	不能在同一个界面引用多个ajax判断的js,如果这样做会只让下面的js起作用,上面引用的js不在判断,
	但是可以在上面js没有window.onload方法的情况可以同存,并且还可以调用它
	-->


<script type="text/javascript"
	src="${ pageContext.request.contextPath }/js/util.js"></script>

<script type="text/javascript"
	src="${ pageContext.request.contextPath }/js/user/reg.js"></script>
</head>

<body>
	<div align="center">
		<div>
			<h3>后台管理登陆界面</h3>

			<s:form action="UserAction_login" namespace="/csdn" theme="simple">
				<table>
					<tr>
						<td>用户名:</td>
						<td><s:textfield id="userName" name="userName" /></td>
						<td style="color: red; font-size: 10px;" id="name"></td>
					</tr>
					<tr>
						<td>密码:</td>
						<td><s:password id="userPass" name="userPass" /></td>
						<td></td>
					</tr>
					<tr>
						<td>邮箱:</td>
						<td><s:textfield id="userEmail" name="userEmail" /></td>
						<td></td>
					</tr>
					<tr>
						<td colspan="3"><s:submit value="登录【注册】" />
						</td>
					</tr>
				</table>
			</s:form>
		</div>

	</div>
</body>
</html>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


$.AJAX()方法中的PROCESSDATA参数 在使用jQuery的$.ajax()方法的时候参数processData默认为true(该方法为jQuery独有的) 默认情况下会将发送的数据序列化以适应默认的内容类型application/x-www-form-urlencoded 如果想发送不
form表单提交的几种方式 表单提交方式一:直接利用form表单提交 html页面代码: &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset=&quot;UTF-8&quot; /&gt; &lt;title&gt;Ins
文章浏览阅读1.3k次。AJAX的无刷新机制使得在注册系统中对于注册名称的检测能即时显示。常见的用户注册是用户输入用户名,后台程序检测数据库中用户名是否重复而做出注册的成功与失败之提示(当用户注册重名时将返回重新注册),或者稍微人性化一点就是在用户名文本框后添加一个检测按钮,让用户检测后再做注册。以上操作,对于用户体验方面来说是比较“差劲”的,一个很好的用户体验就是:当用户输入完注册用户名后,Web系统应能即时检查并即时_用户注册 实时异步检测
文章浏览阅读1.2k次。 本文将解释如何使用AJAX和JSON分析器在客户端和服务器之间创建复杂的JSON数据传输层。一、 引言毫无疑问,AJAX已经成为当今Web开发中一种强有力的用户交互技术,但是它的许多可能性应用仍然鲜为人知。在本文中,我们将来共同探讨如何 使用JavaScript对象标志(JSON)和JSON分析器在服务器和客户端AJAX引擎之间创建复杂而强有力的JSON数据传输层。我们将_ajax技术可行性
文章浏览阅读2.2k次。/************************** 创建XMLHttpRequest对象 **************************/function CreateRequest(){ var xmlObj = null; try { xmlObj = new XMLHttpRequest(); } catch(e) {
文章浏览阅读3.7k次。在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖 掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有 空闲的对象,则使用此对象,否则将创建一个新的对象。下面是我最近写的一个简单的类:* XMLHttpReques_xmlhttprequest发送多个请求
文章浏览阅读3.1k次。Ajax 同一页面如何同时执行多个 XMLHTTP 呢,比如博客页,需要同时利用 Ajax 读取作者信息、文章信息、评论信息……我们的第一反应可能是创建多个全局 XMLHTTP 对象,但这并不现实。其实实现方式非常简单,就是给 onreadystatechange 对应的回调函数加上参数,以下代码是解决方案中一个函数中的一段代码。xmlhttp.open("GET", "ajax_proc_ajax响应多个mxl文件
文章浏览阅读1.5k次。数据岛指的是存在Html网页中的xml代码段,它在Html中形成了一个数据的集合,数据岛允许我们在Html网页中集成xml,对xml编写脚本.数据岛有它特有的形式,由标记xml开始,在开始标记中要有一个ID属性,用于指定该指定数据岛的名称。 (当然要以/xml结束).元素xml包含的内容就是xml代码。数据岛也分为2种:1)内嵌的数据岛形式2)外嵌的数据岛形式说了那么多废话,还_数据中岛计算模式
文章浏览阅读2.1k次。AJAX 流行之后,总想好好学习一下。但是众多的框架实在难以选择。说明一下 ASP.NET AJAX 并不包括在 AJAX 框架之中。刚开始学了 JQuqery, 众多的 $get(),...等等符号早已把我搞晕了。暂时就放弃了。后来学习 ASP.NET AJAX ,在微软的领导下,逐渐由服务器端转向客户端编程。 激起我客户端编程的兴趣,才想起学习一下了 Jquery. 随着WEB2._jquery ajax asp.net 认证
文章浏览阅读1.7k次。前段时间在用google map api的函数库的时候,发现里面的downloadUrl函数非常好用,所以自己写了一个。用腻了那些什么框架什么池,到头来发现越简单的东西越是适合我这种懒人。downloadUrl(url, callback, data);参数说明: url不用说了; callback是回调函数,函数调用的时候会有两个参数:data, responseCode,data就_xmlhttprequest downloadurl
文章浏览阅读956次。前些时间写了几篇关于XMLHTTP运用的实例.(可以到http://dev.csdn.net/user/wanghr100看之前的几编关于XMLHTTP的介绍.)近来看论坛上经常有人提问关于如何无刷新,自动更新数据.传统上,我们浏览网页,如果加入最新的数据.只能是等我们重新向服务器端请求时才能显示出来.但是,对于一些时效性很强的网站.传统的这种做法是不能满足的.我们可以让程序自动刷新.定时_后端xml怎么实现数据有救新增,没有就更新
文章浏览阅读3.3k次。 XMLHttpRequest调用XMLHttpRequest Call ●●●调用,回调,下载,抓取,实时,查询,远程通信(Remoting),远程通信脚本(RemoteScripting),同步,上传,XMLHttpRequest图6-2:XMLHttpRequest调用 目标故事Reta正在一个批发商网站上购买商品。每次她添加一个商品到购物车时,web站点发出_createxmlhttpre
文章浏览阅读1.3k次。function clearitem(){ var drp1 = document.getElementById("drp1"); while(drp1.options.length>0) { drp1.options.remove(0); } }//动态更改方法(根据城市代码取得该市商业区并添加到DropDownList中_dropdownlist根據動態變化
文章浏览阅读1.9k次。因為 Json.net 是有附原始碼的,他也附了單元測試的專案,底下是我額外增加的UnitTest,我的目標就是讓底下的測試可以pass,而且原來的Test 也要都能通過。 ValueTypeTest.csusing System;using NUnit.Framework;namespace Newtonsoft.Json.Test { [TestFixture] public cl_vb 無效的 json 基本型別
文章浏览阅读844次。利用XMLHTTP无刷新获取数据. 客户端和服务器端数据的交互有几种方法.1.提交,通过提交到服务器端.也称"有刷新"吧.2.通过XMLHTTP无刷新提交到服务器端,并返回数据.也称"无刷新"吧.利用XMLHTTP我们可以实现很多很强大的应用.这文章主要介绍它的一些简单的应用.附:因为XMLHTTP是IE5.0+支持的对象.所以你必须要有IE5.0+才能看到效果.client.htm_xmlhttp取源码没有更新
文章浏览阅读1.8k次。Json.Net 無法序列基本型別(string, int),Asp.Net Ajax 無法正確序列日期,AjaxPro序列出我不想要的_type字串 1. Json.Net 是我最常使用的序列/反序列json套件,標榜速度快,對於一對多關係的object 也都能正常運作, 己能滿足我平日的需要,但前幾天突然有個情況,我要序列的是一個泛型參數,該參數不一定是物object型別,有可能是st_token string in state start
文章浏览阅读1.3k次。转载自:http://www.cnblogs.com/JeffreyZhao/archive/2007/01/31/update_the_updatepanels_by_js.html众 所周知,UpdatePanel是通过Trigger来更新的。被设定为Trigger的控件在PostBack之后会被客户端所截获,并且使用 XMLHttpRequest对象发送内容,然后服务器端由ScriptMan_web.ui.updatepanel 和 updatepanel 的区别
文章浏览阅读1.9k次。有些时候,只是需要更新页面的一个部分甚至只是更新中间的几个数据却需要从服务器DOWN整个页面,导致各种资源的浪费。使用数据岛技术可以很好的解决这个问题:通过定时器或用户事件触发数据岛(XML对象)象服务器获取数据,在数据获取完成后,适时更新相关数据。示例HTML部分:http://localhost/WebService/LoadData/FeaturedService.asmx/GetScore_web数据岛
文章浏览阅读1k次。在页面上使用ActiveXObject的代价是很大的,如果我们的无刷新页面使用xmlhttp技术,我们或许需要频繁的建立xmlhttp对象,当然 我们也可以使用全局变量来cache一个xmlhttp对象实例。但是这样的方法适合于同步方式xmlhttp通信,而对于异步方式xmlhttp通信将 会出现问题。由于没有了进程的堵塞,用户可能再次调用同一个xmlhttp实例,如果这时前一个通信未完成,那么就
文章浏览阅读998次。 by Lokesh Dhakar 译: croc查看原文概要:Lightbox JS 是一个简单而又谦恭的用来把图片覆盖在当前页面上的脚本. 它能被快速安装并且运作于所有流行的浏览器.最新更新 Version 2.0 图片集: 分组相关的图片并且能轻松的导航它们 视觉特效: 奇特的自适应调整 向后兼容: yes! 点击这里查看实例_on lightbox 2 by lokesh dhakar