一、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的对应的元素!
代码演示: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);