AJAX学习(2)实战

来源:互联网 发布:心动网络面试题 编辑:程序博客网 时间:2024/06/05 17:08

AJAX开发框架:

  • AJAX实质上也是遵循Request/Server模式,所以这个框架基本的流程是:
    • 对象初始化
    • 发送请求
    • 服务器接收
    • 服务器返回
    • 客户端接收
    • 修改客户端页面内容。
  • 只不过这个过程是异步的。

A 、初始化XMLHttpRequest对象

function ajaxFunction(){    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;}

B、 指定响应处理函数

  • 指定当服务器返回信息时客户端的处理方式。只要将相应的处理函数名称赋给XMLHttpRequest对象的onreadystatechange属性就可以了.比如:  XMLHttpReq.onreadystatechange = processResponse;
  • 注意:这个函数名称不加括号,不指定参数。也可以用Javascript函数直接量方式定义响应函数。
    • 比如:XMLHttpReq.onreadystatechange = function() { };
    • // 处理返回信息的函数
      function   processResponse() {

      }

C、发出HTTP请求 

  • 向服务器发出HTTP请求了。这一步调用XMLHttpRequest对象的open和send方法。
    •  http_request.open('GET', 'http://www.example.org/some.file', true);
    • http_request.send(null)
  • 按照顺序,open调用完毕之后要调用send方法。send的参数如果是以Post方式发出的话,可以是任何想传给服务器的内容。
  • 注意:如果要传文件或者Post内容给服务器,必须先调用setRequestHeader方法,修改MIME类别。如下:
  • http_request.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”); 这时资料则以查询字符串的形式列出,作为send的参数,例如:name=value&anothername=othervalue&so=on

D、处理服务器返回的信息 

处理响应处理函数都应该做什么。 
  首先,它要检查XMLHttpRequest对象的readyState值,判断请求目前的状态。参照前文的属性表可以知道,readyState值为4的时候,代表服务器已经传回所有的信息,可以开始处理信息并更新页面内容了。如下:
if (http_request.readyState == 4) {
    // 信息已经返回,可以开始处理
} else {
    // 信息还没有返回,等待
}
  服务器返回信息后,还需要判断返回的HTTP状态码,确定返回的页面没有错误。所有的状态码都可以在W3C的官方网站上查到。其中,200代表页面正常。
if (http_request.status == 200) {
      // 页面正常,可以开始处理信息
} else {
    // 页面有问题
}
  • XMLHttpRequest对成功返回的信息有两种处理方式:
  • responseText:将传回的信息当字符串使用;
  • responseXML:将传回的信息当XML文档使用,可以用DOM处理。

实战:

使用ajax模拟网页中的加载页面:


testload.jsp

<%@ page language="java"  pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>     <script type="text/javascript" src="./load.js"></script>  </head>  <body>     <form action="" enctype="application/x-www-form-urlencoded">          <div id="divcheck"></div>          <input type="button" name="ok" id="ok" value="测试加载">      </form>  </body></html>

load.js

//创建一个XMLHttpRequest对象 ,利用此对象域服务器进行通信 是AJAX技术的核心function ajaxFunction(){    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;}window.onload = function(){document.getElementById("ok").onclick = function(){//获取div对象var divcheck = document.getElementById("divcheck");//1.创建ajax引擎var xmlHttp = ajaxFunction();//2.事件处理函数(监听器)xmlHttp.onreadystatechange = function(){if(xmlHttp.readyState==1){divcheck.innerHTML = "<img src='./loading1.gif' width='200',height='200'/>正在与服务器取得连接";alert("xxxxx");}else if(xmlHttp.readyState==2){divcheck.innerHTML = "<img src='./loading3.gif' width='200',height='200'/>正在发送请求";alert("xxxxx");}else if(xmlHttp.readyState==3){divcheck.innerHTML = "<img src='./loading33.gif' width='200',height='200'/>正在处理数据";alert("xxxxx");}else if(xmlHttp.readyState==4){if(xmlHttp.status == 200 || xmlHttp.status == 304){var data = xmlHttp.responseText;divcheck.innerHTML = data;}}else{divcheck.innerHTML = "网络比较繁忙,请稍后再试";}}//3.打开一个链接xmlHttp.open("POST","../loadServlet",true);xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");//4.发送请求数据xmlHttp.send(null);}}
LoadServlet.java
package cn.itcast.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/loadServlet")public class LoadServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();System.out.println("访问土豆服务器成功");out.println("放映电影《天下乌贼》");out.flush();out.close();}}
运行效果:

使用ajax,在注册页面进行用户名校验


GET方式:

registerGet.jsp
<%@ page language="java"  pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>校验用户名是否存在</title><script type="text/javascript" src="./registerGet.js"> </script></head><body><center><form action=""  enctype="application/x-www-form-urlencoded"><h3>请填写用户注册信息</h3><table  border="1"><tr><td>用户名:</td><td><input type="text" name="username" value="" id="username">  <div id="divcheck"></div>  <input type="button" name="checkusername" value="查看用户名" id="checkusername"></td></tr><tr><td>密码:</td><td><input type="password" name="psw" value=""></td></tr><tr><td>确认密码:</td><td><input type="password" name="confpsw" value=""></td></tr><tr><td>出生日期:</td><td><input type="text" name="birthday" value=""></td></tr></table> </form> </center></body></html>
registerGet.js
//创建一个XMLHttpRequest对象 ,利用此对象域服务器进行通信 是AJAX技术的核心function ajaxFunction(){    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;}window.onload = function(){document.getElementById("checkusername").onclick = function(){/**<input type="text" name="username" value="" id="username">*/var username = document.getElementById("username").value;//1、创建ajax引擎var xmlHttp = ajaxFunction();//2、事件处理函数xmlHttp.onreadystatechange = function(){if(xmlHttp.readyState == 4){if(xmlHttp.status == 200 || xmlHttp.status == 304){var data = xmlHttp.responseText;document.getElementById("divcheck").innerHTML = data;}}}//3、打开一个连接//第一种方案://username = encodeURI(username,"UTF-8");/** * 第二种方案:使用UTF-8的编码,让传递的参数转换成二进制的形式* URLEncoder.encode(username,"UTF-8") 编码* URLDecoder.decode(username,"UTF-8") 解码*///这里要连续编码两次username = encodeURI(username,"UTF-8");username = encodeURI(username,"UTF-8");xmlHttp.open("GET","../registerServlet?username="+username,true);//4、发送数据xmlHttp.send(null);}}
RegisterServlet.java
package cn.itcast.servlet;import java.io.IOException;import java.io.PrintWriter;import java.net.URLDecoder;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/registerServlet")public class RegisterServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();System.out.println("正在进行校验");// 获取用户名String username = request.getParameter("username");// 第一种方案:// username = new String(username.getBytes("iso-8859-1"),"UTF-8");// 第二种方案:username = URLDecoder.decode(username, "UTF-8");// 正常操作数据库,查看当前用户名是否存在String message = "";if (username != null && "sa".equals(username)) {message = "<font color='red'>用户名【" + username + "】已存在</font>";} else {message = "<font color='green'>用户名【" + username+ "】不存在,可以使用该用户名</font>";}out.println(message);out.flush();out.close();}}
运行效果:

POST方式:

register.jsp
<%@ page language="java"  pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>校验用户名是否存在</title><script type="text/javascript" src="./register.js"> </script></head><body><center><form action=""  enctype="application/x-www-form-urlencoded" method="post"><h3>请填写用户注册信息</h3><table  border="1"><tr><td>用户名:</td><td><input type="text" name="username" value="" id="username">  <div id="divcheck"></div>  <input type="button" name="checkusername" value="查看用户名" id="checkusername"></td></tr><tr><td>密码:</td><td><input type="password" name="psw" value=""></td></tr><tr><td>确认密码:</td><td><input type="password" name="confpsw" value=""></td></tr><tr><td>出生日期:</td><td><input type="text" name="birthday" value=""></td></tr></table> </form> </center></body></html>
register.js
//创建一个XMLHttpRequest对象 ,利用此对象域服务器进行通信 是AJAX技术的核心function ajaxFunction(){    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;}window.onload = function(){document.getElementById("checkusername").onclick = function(){var username = document.getElementById("username").value;//1.创建ajax引擎var xmlHttp = ajaxFunction();//2.事件处理函数xmlHttp.onreadystatechange = function(){if(xmlHttp.readyState == 4){if(xmlHttp.status == 200 || xmlHttp.status == 304){var data = xmlHttp.responseText;document.getElementById("divcheck").innerHTML = data;}}}//3、打开一个连接xmlHttp.open("POST","../registerServlet",true);xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");//4、发送数据xmlHttp.send("username="+username);}}
RegisterServlet.java
package cn.itcast.servlet;import java.io.IOException;import java.io.PrintWriter;import java.net.URLDecoder;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/registerServlet")public class RegisterServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();System.out.println("正在进行校验");//获取用户名String username = request.getParameter("username");//正常操作数据库,查看当前用户名是否存在String message = "";if(username!=null && "sa".equals(username)){message = "<font color='red'>用户名【"+username+"】已存在</font>";}else{message = "<font color='green'>用户名【"+username+"】不存在,可以使用该用户名</font>";}out.println(message);out.flush();out.close();}}
运行效果:



使用ajax传递xml数据,完成级联菜单:


cities.xml

<?xml version="1.0" encoding="GB2312"?><china><province name="吉林省"><city>长春</city><city>吉林市</city><city>四平</city><city>松原</city><city>通化</city></province><province name="辽宁省"><city>沈阳</city><city>大连</city><city>鞍山</city><city>抚顺</city><city>铁岭</city></province><province name="山东省"><city>济南</city><city>青岛</city><city>威海</city><city>烟台</city><city>潍坊</city></province></china>
xmlFile.jsp
<%@ page language="java"  pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>级联菜单</title><script type="text/javascript" src="./xmFile.js"> </script></head><body>     <select id="province" name="province">       <option value="">请选择....</option>     </select> <select id="city" name="city"> <option value="">请选择.....</option> </select>  </body></html>
xmlFile.js

//创建一个XMLHttpRequest对象 ,利用此对象域服务器进行通信 是AJAX技术的核心function ajaxFunction(){    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;}window.onload = function(){//1、创建ajax引擎var xmlHttp = ajaxFunction();//2、事件处理函数xmlHttp.onreadystatechange = function(){if(xmlHttp.readyState == 4){if(xmlHttp.status == 200 || xmlHttp.status == 304){var data = xmlHttp.responseXML;//alert(data);var xmlProvinces = data.getElementsByTagName("province");//alert(xmlProvinces.length);for(var i=0;i<xmlProvinces.length;i++){var xmlProvince = xmlProvinces[i];var xmlProvinceValue = xmlProvince.getAttribute("name");//alert(xmlProvinceValue);/** *   <select id="province" name="province">       <option value="">请选择....</option>     </select> */var option = document.createElement("option");option.setAttribute("value",xmlProvinceValue);var optionText = document.createTextNode(xmlProvinceValue);option.appendChild(optionText);document.getElementById("province").appendChild(option);}document.getElementById("province").onchange = function(){//情况city的下拉菜单,请选择需要留下var city = document.getElementById("city");var cityOptions = city.getElementsByTagName("option");//i=1,表示第一个请选择要留下//第一种:从前往后删//var len = cityOptions.length//for(var i=1;i<len;i++){//city.removeChild(cityOptions[1]);//}//第二种:从后往前删//for(var i=cityOptions.length-1;i>0;i--){//city.removeChild(cityOptions[i]);//}//第三种://while(cityOptions.length>1){// city.removeChild(cityOptions[1]);//}//第四种://while (cityOptions.length > 1) {//var myoption=city.lastChild;//city.removeChild(myoption);//}//alert("初始:"+city.length);//初始化,从新设置city的长度为1city.length=1;var provinceValue = this.value;//alert(xmlProvinces.length);var provinceObject = null;for(var i=0;i<xmlProvinces.length;i++){var xmlProvince = xmlProvinces[i];var xmlProvinceValue = xmlProvince.getAttribute("name");//alert(xmlProvinceValue);//判断当前下拉菜单选中的省的值与xml文件中遍历省的属性值进行对比,如果值匹配成功,就从当前省的节点获取对应的城市if(provinceValue == xmlProvinceValue){provinceObject = xmlProvince;break;}}if(provinceObject!=null){//遍历城市节点var xmlCities = provinceObject.getElementsByTagName("city");//alert(xmlCities.length);for(var i=0;i<xmlCities.length;i++){var xmlCity = xmlCities[i];//方法一://var xmlCityValue = xmlCity.firstChild.nodeValue;//方法二:var xmlCityValue = xmlCity.text;//alert(xmlCityValue);/** *  <select id="city" name="city">            <option value="">请选择.....</option>        </select> *///创建option节点var option = document.createElement("option");option.setAttribute("value",xmlCityValue);var optionText = document.createTextNode(xmlCityValue);option.appendChild(optionText);city.appendChild(option);//alert(""+city.length);}}}}}}//3、打开连接xmlHttp.open("POST","../xmlFileServlet",true);xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");//4、发送请求数据xmlHttp.send(null);}
XmlFileServlet.java
package cn.itcast.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/xmlFileServlet")public class XmlFileServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/xml;charset=utf-8");PrintWriter out = response.getWriter();out.println("<china>");out.println("<province name='吉林省'>");out.println("<city>长春</city>");out.println("<city>吉林市</city>");out.println("<city>四平</city>");out.println("<city>松原</city>");out.println("<city>通化</city>");out.println("</province>");out.println("<province name='辽宁省'>");out.println("<city>沈阳</city>");out.println("<city>大连</city>");out.println("<city>鞍山</city>");out.println("<city>抚顺</city>");out.println("<city>铁岭</city>");out.println("</province>");out.println("<province name='山东省'>");out.println("<city>济南</city>");out.println("<city>青岛</city>");out.println("<city>威海</city>");out.println("<city>烟台</city>");out.println("<city>潍坊</city>");out.println("</province>");out.println("</china>");out.flush();out.close();}}
运行效果:


























0 0
原创粉丝点击