AJAX入门

匿名 (未验证) 提交于 2019-12-03 00:20:01

一、AJAX概述

二、AJAX技术

var xmlHttp = new XMLHttpRequest()来创建对象;但IE有所不同,IE5.5以及更早版本需要:var xmlHttp = new ActiveXObject(“Microsoft.XMLHTTP”)来创建对象;而IE6中需要:var xmlHttp = new ActiveXObject(“Msmxl2.XMLHTTP”)来创建对象;而IE7以及更新版本也支持DOM2规范。

	function createXMLHttpRequest() { 		var xmlHttp; 		// 适用于大多数浏览器,以及IE7和IE更高版本 		try{ 			xmlHttp = new XMLHttpRequest(); 		} catch (e) { 			// 适用于IE6 			try { 				xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 			} catch (e) { 				// 适用于IE5.5,以及IE更早版本 				try{ 					xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 				} catch (e){} 			} 		}			 		return xmlHttp; 	}

method:请求方式,通常为GET或POST;

url:请求的服务器地址,例如:/ajaxdemo1/AServlet,若为GET请求,还可以在URL后追加参数;

:这个参数可以不给,默认值为true,表示异步请求;

		var xmlHttp = createXMLHttpRequest(); 		xmlHttp.open("GET", "/ajaxdemo1/AServlet", true);

send()方法发送请求了。send()方法的参数为POST请求参数,即对应HTTP协议的请求体内容,若是GET请求,需要在URL后连接参数。

        xmlHttp.send(null);

  下面代码会被执行四次!对应XMLHttpRequest的四种状态!

		xmlHttp.onreadystatechange = function() { 			alert('hello'); 		};

		xmlHttp.onreadystatechange = function() { 			if(xmlHttp.readyState == 4 && xmlHttp.status == 200) { 				alert(xmlHttp.responseText);	 			} 		};


<script type="text/javascript"> 		function check(){ 			//1.得到异步对象 			var xmlHttp = new XMLHttpRequest(); 			//2.打开与服务器的连接。指定请求方式、url和是否为异步请求 			xmlHttp.open("POST", "<c:url value='/RegistServlet'/>", "true"); 			//3.发送请求 			xmlHttp.setRequestHeader("Content-Type", 					"application/x-www-form-urlencoded"); 			var username=document.getElementById("username").value; 			xmlHttp.send("username="+username); 			//4.给异步对象的onreadystatechange事件注册监听器 			xmlHttp.onreadystatechange = function() { 				//双重判断:当xmlHttp的状态为4,服务器响应的状态码为200 				if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { 					//将响应过来的文本发送给div1标签 					document.getElementById("div1").innerHTML = xmlHttp.responseText; 				} 			}; 		} </script> </head>  <body> 	<form> 		用户名:<input id="username" type="text" name="username" onblur="check()" /> 		<div id="div1"></div><br />  		密 码:<input type="password" name="password" /><br />  		<input type="submit" value="提交" /> 	</form> </body>
package cn.yfy.ajax;  import java.io.IOException;  import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;  public class RegistServlet extends HttpServlet {   	public void doPost(HttpServletRequest request, HttpServletResponse response) 			throws ServletException, IOException { 		request.setCharacterEncoding("utf-8"); 		response.setContentType("text/html;charset=utf-8"); 		String username=request.getParameter("username"); 		if(username.contains("yfy")){ 			response.getWriter().print("用户名正确"); 		}else{ 			response.getWriter().print("用户名错误"); 		} 	}  } 

  并且为<select name=”province”>元素添加onchange事件监听。当选择的省份发生变化时,再向服务器发送异常请求,得到当前选中的省份下所有城市(XML数据)。然后客户端解析XML文档,使用每个城市名称创建<option>,添加到<select name=”city”>元素中。


select.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>   <head>     <title>My JSP 'ajax5.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"> 	<!-- 	<link rel="stylesheet" type="text/css" href="styles.css"> 	--> <script type="text/javascript"> function createXMLHttpRequest() { 	try { 		return new XMLHttpRequest();//大多数浏览器 	} catch (e) { 		try { 			return ActvieXObject("Msxml2.XMLHTTP");//IE6.0 		} catch (e) { 			try { 				return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本	 			} catch (e) { 				throw e; 			} 		} 	} } /*  * 1. 在文档加载完毕时发送请求,得到所有省份名称,显示在<select name="province"/>中  * 2. 在选择了新的省份时,发送请求(参数为省名称),得到xml文档,即<province>元素  *   解析xml文档,得到其中所有的<city>,再得到每个<city>元素的内容,即市名,使用市名生成<option>,插入到<select name="city">元素中  */  window.onload = function() { 	/* 	ajax四步,请求ProvinceServlet,得到所有省份名称 	使用每个省份名称创建一个<option>元素,添加到<select name="province">中 	*/ 	var xmlHttp = createXMLHttpRequest(); 	xmlHttp.open("GET", "<c:url value='/ProvinceServlet'/>", true); 	xmlHttp.send(null); 	xmlHttp.onreadystatechange = function() { 		if(xmlHttp.readyState == 4 && xmlHttp.status == 200) { 			// 获取服务器的响应 			var text = xmlHttp.responseText; 			// 使用逗号分隔它,得到数组 			var arr = text.split(","); 			// 循环遍历每个省份名称,每个名称生成一个option对象,添加到<select>中 			for(var i = 0; i < arr.length; i++) { 				var op = document.createElement("option");//创建一个指名名称元素 				op.value = arr[i];//设置op的实际值为当前的省份名称 				var textNode = document.createTextNode(arr[i]);//创建文本节点 				op.appendChild(textNode);//把文本子节点添加到op元素中,指定其显示值 				 				document.getElementById("p").appendChild(op); 			} 		} 	}; 	 	 	/* 	第二件事情:给<select name="province">添加改变监听 	使用选择的省份名称请求CityServlet,得到<province>元素(xml元素)!!! 	获取<province>元素中所有的<city>元素,遍历之!获取每个<city>的文本内容,即市名称 	使用每个市名称创建<option>元素添加到<select name="city"> 	*/ 	var proSelect = document.getElementById("p"); 	proSelect.onchange = function() { 		var xmlHttp = createXMLHttpRequest(); 		xmlHttp.open("POST", "<c:url value='/CityServlet'/>", true); 		xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 		xmlHttp.send("pname=" + proSelect.value);//把下拉列表中选择的值发送给服务器! 		xmlHttp.onreadystatechange = function() { 			if(xmlHttp.readyState == 4 && xmlHttp.status == 200) { 				/* 				把select中的所有option移除(除了请选择) 				*/ 				var citySelect = document.getElementById("c"); 				// 获取其所有子元素 				var optionEleList = citySelect.getElementsByTagName("option"); 				// 循环遍历每个option元素,然后在citySelect中移除 				while(optionEleList.length > 1) {//子元素的个数如果大于1就循环,等于1就不循环了! 					citySelect.removeChild(optionEleList[1]);//总是删除1下标,因为1删除了,2就变成1了! 				} 				 				 				var doc = xmlHttp.responseXML; 				// 得到所有名为city的元素 				var cityEleList = doc.getElementsByTagName("city"); 				// 循环遍历每个city元素 				for(var i = 0; i < cityEleList.length; i++) { 					var cityEle = cityEleList[i];//得到每个city元素 					var cityName; 					// 获取市名称 					if(window.addEventListener) {//处理浏览器的差异 						cityName = cityEle.textContent;//支持FireFox等浏览器 					} else { 						cityName = cityEle.text;//支持IE 					} 					 					// 使用市名称创建option元素,添加到<select name="city">中 					var op = document.createElement("option"); 					op.value = cityName; 					// 创建文本节点 					var textNode = document.createTextNode(cityName); 					op.appendChild(textNode);//把文本节点追加到op元素中 					 					//把op添加到<select>元素中 					citySelect.appendChild(op); 				} 			} 		};		 	}; }; </script>   </head>      <body> <h1>省市联动</h1> <select name="province" id="p">   <option>===请选择省===</option> </select>     <select name="city" id="c">   <option>===请选择市===</option> </select>   </body> </html> 
CityServlet.java
public class CityServlet extends HttpServlet {  	public void doPost(HttpServletRequest request, HttpServletResponse response) 			throws ServletException, IOException { 		request.setCharacterEncoding("utf-8"); 		response.setContentType("text/xml;charset=utf-8");//注意:发送xml这里要修改!!! 		 		/* 		 * 获取省份名称,加载该省对应的<province>元素! 		 * 把元素转换成字符串发送给客户端 		 */ 		/* 		 * 1. 获取省份的名称 		 * 2. 使用省份名称查找到对应的<province>元素 		 * 3. 把<province>元素转换成字符串,发送! 		 */ 		try { 			/* 			 * 得到Document 			 */ 			SAXReader reader = new SAXReader(); 			InputStream input = this.getClass().getResourceAsStream("/china.xml"); 			Document doc = reader.read(input); 			 			/* 			 * 获取参数 			 */ 			String pname = request.getParameter("pname");//获取省份名称 			Element proEle = (Element) doc.selectSingleNode("//province[@name='" + pname + "']"); 			String xmlStr = proEle.asXML();//把元素转换成字符串 			response.getWriter().print(xmlStr); 		} catch(Exception e) { 			throw new RuntimeException(e); 		} 	} }
ProvinceServlet.java
public class ProvinceServlet extends HttpServlet {  	public void doGet(HttpServletRequest request, HttpServletResponse response) 			throws ServletException, IOException { 		response.setContentType("text/html;charset=utf-8"); 		/* 		 * 响应所有省份名称,使用逗号分隔! 		 */ 		/* 		 * 1. Document对象 		 *   * 创建解析器对象 		 *   * 调用解析器的读方法,传递一个流对象,得到Document 		 */ 		try { 			SAXReader reader = new SAXReader(); 			InputStream input = this.getClass().getResourceAsStream("/china.xml"); 			Document doc = reader.read(input); 			 			/* 			 * 查询所有province的name属性,得到一堆的属性对象 			 * 循环遍历,把所有的属性值连接成一个字符串,发送给客户端 			 */ 			List<Attribute> arrList = doc.selectNodes("//province/@name"); 			StringBuilder sb = new StringBuilder(); 			for(int i = 0; i < arrList.size(); i++) { 				sb.append(arrList.get(i).getValue());//把每个属性的值存放到sb中。 				if(i < arrList.size() - 1) { 					sb.append(","); 				} 			} 			response.getWriter().print(sb); 		} catch(Exception e) { 			throw new RuntimeException(e); 		} 	} } 
china.xml
<?xml version="1.0" encoding="utf-8"?> <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> ... ... ... </china>

三、XStream

xstream.alias("china", List.class):让List类型生成的元素名为china

xstream.alias("province", Province.class):让Province类型生成的元素名为province

xstream.useAttributeFor(Province.class, "name"):把Province类的名为name成员,生成<province>元素的name属性

xstream.addImplicitCollection(Province.class, "cities"):让Province类的名为cities(它是List类型的,它的内容还会生成元素)的成名不生成元素

xstream.omitField(City.class, "description"):在生成的xml中不会出现City类的名为description的对应的元素!

代码演示:
City.java
public class City { 	private String name;//市名 	private String description;//描述 	public String getName() { 		return name; 	} 	public void setName(String name) { 		this.name = name; 	} 	public String getDescription() { 		return description; 	} 	public void setDescription(String description) { 		this.description = description; 	} 	@Override 	public String toString() { 		return "City [name=" + name + ", description=" + description + "]"; 	} 	public City() { 		super(); 		// TODO Auto-generated constructor stub 	} 	public City(String name, String description) { 		super(); 		this.name = name; 		this.description = description; 	} } 
Province.java
public class Province { 	private String name;// 省名 	private List<City> cities = new ArrayList<City>();  	public String getName() { 		return name; 	}  	public void setName(String name) { 		this.name = name; 	}  	public List<City> getCities() { 		return cities; 	}  	public void setCities(List<City> cities) { 		this.cities = cities; 	}  	public void addCity(City city) { 		cities.add(city); 	} } 
Demo.java
public class Demo1 { 	// 返回javabean集合 	public List<Province> getProinvceList() { 		Province p1 = new Province(); 		p1.setName("北京"); 		p1.addCity(new City("东城区", "DongChengQu")); 		p1.addCity(new City("昌平区", "ChangPingQu")); 		 		Province p2 = new Province(); 		p2.setName("辽宁"); 		p2.addCity(new City("沈阳", "shenYang")); 		p2.addCity(new City("葫芦岛", "huLuDao")); 		 		List<Province> provinceList = new ArrayList<Province>(); 		provinceList.add(p1); 		provinceList.add(p2); 		 		return provinceList; 	}  <china>   <province name="北京">     <city>       <name>东城区</name>     </city>     <city>       <name>昌平区</name>     </city>   </province>   <province name="辽宁">     <city>       <name>沈阳</name>     </city>     <city>       <name>葫芦岛</name>     </city>   </province> </china>  */ 	@Test 	public void fun1() { 		List<Province> proList = getProinvceList(); 		XStream xstream = new XStream(); 		xstream.alias("china", List.class);//给List类型指定别名为china 		xstream.alias("province", Province.class);//给Province指定别名为province 		xstream.alias("city", City.class);//给City类型指定别名为city 		xstream.useAttributeFor(Province.class, "name");//把Province类型的name属性,生成<province>元素的属性 		xstream.addImplicitCollection(Province.class, "cities");//去除Provice类的名为cities的List类型的属性!	 		xstream.omitField(City.class, "description");//让City类的,名为description属性不生成对应的xml元素 		 		String s = xstream.toXML(proList); 		System.out.println(s);		 	} } 

四、JSON

var person = {"name":"zhangSan", "age":"18", "sex":"male"}; alert(person.name + ", " + person.age + ", " + person.sex);

var person = {"name":"zhangSan", "age":"18", "sex":"male", "hobby":["cf", "sj", "ddm"]}; alert(person.name + ", " + person.age + ", " + person.sex + ", " + person.hobby);
带有方法的JSON对象:
var person = {"name":"zhangSan", "getName":function() {return this.name;}}; alert(person.name); alert(person.getName());

json-lib小工具,它可以方便的使用Java语言来创建JSON字符串。也可以把JavaBean转换成JSON字符串。



		JSONObject jo = new JSONObject(); 		jo.put("name", "zhangSan"); 		jo.put("age", "18"); 		jo.put("sex", "male"); 		//输出为:{"name":"zhangSan","age":"18","sex":"male"} 		System.out.println(jo.toString());
		Person person = new Person("liSi", 18, "female"); 		//把JavaBean对象转换成json 		JSONObject jo = JSONObject.fromObject(person); 		System.out.println(jo.toString());
		Map map = new HashMap(); 		map.put("name", "wangWu"); 		map.put("age", "81"); 		map.put("sex", "male");  		//把Map转换成JSON 		JSONObject jo = JSONObject.fromObject(map); 		System.out.println(jo.toString());


		JSONArray ja = new JSONArray(); 		Person p1 = new Person("zhangSan", 18, "male"); 		Person p2 = new Person("liSi", 23, "female"); 		ja.add(p1); 		ja.add(p2); 		 		System.out.println(ja.toString());
		Person p1 = new Person("zhangSan", 18, "male"); 		Person p2 = new Person("liSi", 23, "female"); 		List<Person> list = new ArrayList<Person>(); 		list.add(p1); 		list.add(p2); 		 		//把list转换成JSONArray 		JSONArray ja = JSONArray.fromObject(list); 		 		System.out.println(ja.toString());
		Person p1 = new Person("zhangSan", 18, "male"); 		Person p2 = new Person("liSi", 23, "female"); 		Person[] persons = {p1, p2}; 		 		把数组转换成JSONArray 		JSONArray ja = JSONArray.fromObject(persons); 		 		System.out.println(ja.toString());

var json = "{\"name\":\"zhangSan\", \"age\":\"18\", \"sex\":\"male\"}"; var person = eval("(" + json + ")"); alert(person.name + ", " + person.age + ", " + person.sex);


文章来源: AJAX入门
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!