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>