ajax和JSon使用
一、AJAX是什么?
- 1、Asynchronous JavaScript And XML指异步 JavaScript 及 XML
- 2、不是编程语言,而是老技术(JS、HTML、XML和CSS)的新用法
- 3、出现的意义:用于创建更好更快以及交互性更强的 Web 应用程序的技术
二、同步 VS 异步?
1:同步开发流程图
2:异步开发流程图
3;ajxa交互模型
三、JS对象XmlHttpRequest(重点)
1、如何获取该对象(从W3CSchool中拷贝)
会看到如下代码:
<html>
<body>
<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert("您的浏览器不支持AJAX!");
return false;
}
}
}
}
</script>
<form name="myForm">
用户: <input type="text" name="username" />
时间: <input type="text" name="time" />
</form></body>
</html>
做一个简单的工具类util.js
1 /**
2 * 获取XMLHttpRequest对象,即AJAX引擎
3 */
4 function getXmlHttpRequest() {
5 var xhr;
6 try {
7 // Firefox, Opera 8.0+, Safari
8 xhr = new XMLHttpRequest();
9 } catch (e) {
10 // Internet Explorer
11 try {
12 xhr = new ActiveXObject("Msxml2.XMLHTTP");
13 } catch (e) {
14 try {
15 xhr = new ActiveXObject("Microsoft.XMLHTTP");
16 } catch (e) {
17 alert("您的浏览器不支持AJAX!");
18 return null;
19 }
20 }
21 }
22 return xhr;
23 }
24 //JavaScript的原型:prototype
25 //string是Js中的核心对象,没有提供trim方法,替换掉首位空格
26 //给string类对象添加一个trim方法,去掉首尾空格。每个对象都有一个属性,prototype,指向了原来的代码。
27 String.prototype.trim=function(){
28 return this.replace(/(^\s*)|(\s*$)/g,"");
29 }
2、该对象的属性
readyState:short类型的,只读的。他标识着XHR这个对象的当前状态。
0:XHR对象还没有准备好。 1:调用了该对象的 open方法,但是还没有send。 2:向服务器发出了请求。 3:收到了服务器返回的响应消息头。 4:收到了服务器返回的响应正文。干完了。
- responseText:string类型的,只读的。存放了响应正文,响应正文的类型是文本类型
- responseXML:Document(XML DOM)类型的,只读的。存放了响应正文,响应正文的类型是XML。
- status:short类型的,只读的。服务器返回的响应状态码。
- statusText:string类型的,只读的。服务器返回的响应状态码描述。
3、该对象的方法
- String getAllResponseHeaders():返回所有的响应消息头。
- String getResponseHeader(String headerName):得到指定的响应消息头值
void open(String method,String url,boolean async):计划要访问的链接。
method:请求方式。常用的GET和POST url:请求的地址 async:是否是异步交互。默认是true,异步的
void send(Object body):向服务器发出请求,并传递请求正文的内容
body:请求正文的内容。没有传null
void setRequestHeader(String name,String value):设置请求消息头。
name:请求头名 value:请求头值
4、事件处理
onreadystatechange:指向一个函数。当XHR对象的readyState属性值每次发生变化,该处理器都会执行。
四、编写第一个AJAX应用(记住编码步骤)
1、向服务器发出GET请求
html代码
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8">
5 <title>Insert title here</title>
6
7 <script type="text/javascript" src="js/util.js"></script>
8
9 <script type="text/javascript">
10 window.onload = function(){
11 //异步发出请求,访问ServletDemo1
12 document.getElementById("bt1").onclick = function(){
13 //1获取xhr对象
14 var xhr = getXmlHttpRequest();
15 //2;给用户友好的提示
16 xhr.onreadystatechange = function(){
17 if(xhr.redayState==4){
18 //ajax引擎获取到服务器相应
19 if(xhr.status == 200){
20 //服务器成功进行了响应
21 alert("服务器已经响应成功了,快点打开控制台看看吧");
22 }
23 }
24 }
25 //3、建立与服务器的链接:计划要访问什么?
26 xhr.open("GET","/ajaxdemo/ServletDemo1?time="+ new Date().getTime());
27 //4、发出请求
28 xhr.send(null);//null代表没有请求正文,get方式不可能有正文数据。
29 }
30 }
31
32 </script>
33 </head>
34 <body>
35 <input type="button" id="bt1" value="测试与服务器的异步交互"/>
36 </body>
37 </html>
Servlet就一个输出:
public class ServletDemo1 extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletDemo1执行了");
}
效果:
2、向服务器发出POST请求。
五ajax案例demo
1:判断用户名是否可用(模仿用户注册时判断用户是否注册)
HTML代码
1 <script type="text/javascript" src="js/util.js"></script>
2 <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
3 <script type="text/javascript">
4 //当用户名失去焦点时,向服务器发出异步请求,监测用户名是否存在
5 window.onload=function(){
6 document.getElementById("username").onblur=function(){
7 //得到当前用户名的值,做出判断
8 var username = this.value;
9 if(username.trim()==""){
10 alert("请输入用户名");
11 this.focus();
12 return;
13 }
14 //用户输入了
15 var xhr = getXmlHttpRequest();
16 xhr.onreadystatechange=function(){
17 //做出处理,把响应正文的内容搞到id=s1中。DOM编程
18 if(xhr.readyState==4){
19 if(xhr.status==200){
20 //获取服务器返回的数据
21 var data = xhr.responseText;
22 document.getElementById("s1").innerHTML=data;
23 }
24 }
25 }
26 xhr.open("POST","/ajaxdemo/ServletDemo3?time="+new Date().getTime());
27 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
28 xhr.send("username="+username);
29 }
30 }
31 </script>
32 </head>
33
34 <body>
35 <form action="" method="post">
36 用户名:<input type="text" id="username" name="username"/><span id="s1"></span><br/>
37 密码:<input type="password" id="password" name="password"/><br/>
38 <input type="submit" value="注册"/>
39 </form>
40 </body>
servlet
1 public class ServletDemo3 extends HttpServlet {
2
3 public void doGet(HttpServletRequest request, HttpServletResponse response)
4 throws ServletException, IOException {
5 request.setCharacterEncoding("UTF-8");//要求客户端用POST方式提交
6 response.setContentType("text/html;charset=UTF-8");//告知客户端响应正文的MIME类型和编码
7 String username = request.getParameter("username");
8 PrintWriter out = response.getWriter();
9 if(username.equals("wsj")){
10 //用户名存在了
11 out.write("<font color='red'>用户名已经存在了</font>");
12 }else{
13 //用户名可以使用
14 out.write("<font color='green'>用户名可以使用</font>");
15 }
16 }
效果:
2:查询所有的商品
HTML
1 <script type="text/javascript" src="js/util.js"></script>
2 <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
3 <script type="text/javascript">
4 window.onload=function(){
5 document.getElementById("a1").onclick=function(){
6 var xhr = getXmlHttpRequest();
7 xhr.onreadystatechange=function(){
8 if(xhr.readyState==4){
9 if(xhr.status==200){
10 var data = xhr.responseText;
11 document.getElementById("d1").innerHTML=data;
12 }
13 }
14 }
15 xhr.open("GET","/ajaxdemo/ServletDemo4?time="+new Date().getTime());
16 xhr.send(null);
17 }
18 }
19 </script>
20 </head>
21
22 <body>
23 <a id="a1" href="javascript:void(0)">显示商品信息</a>
24 <hr/>
25 <div id="d1"></div>
26 </body>
servlet
public class ServletDemo4 extends HttpServlet {
private List<Product> products = new ArrayList<Product>();
public void init() throws ServletException {
products.add(new Product(1001, "打气筒", 10));
products.add(new Product(1002, "金瓶梅", 20));
products.add(new Product(1003, "葵花宝典", 30));
products.add(new Product(1004, "肥皂", 40));
products.add(new Product(1005, "卫生纸", 50));
}
//Servlet控制器;JSP负责显示
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("ps", products);
request.getRequestDispatcher("/listProduct.jsp").forward(request, response);
}
3:省市二级联动
这里用到了XStream
下载jar包后使用
HTML代码
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8">
5 <title>Insert title here</title>
6 <script type="text/javascript" src="js/util.js"></script>
7 <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
8 <script type="text/javascript">
9 window.onload=function(){
10 var xmlDoc;
11 //在页面加载完毕后,发出异步请求,得到xml数据
12 var xhr = getXmlHttpRequest();
13 xhr.onreadystatechange=function(){
14 if(xhr.readyState==4){
15 if(xhr.status==200){
16 xmlDoc = xhr.responseXML;
17 //XML DOM解析:取出省份
18 var xmlProvinces = xmlDoc.getElementsByTagName("province");
19 for(var i=0;i<xmlProvinces.length;i++){
20 var provinceName = xmlProvinces[i].getAttribute("name");
21 var provinceCode = xmlProvinces[i].getAttribute("code");
22 //给省份的下拉选择框添加元素:HTML DOM
23 var provinceSelect = document.getElementById("ps");
24 var option = new Option(provinceName,provinceCode);//<option value="37">山东</option>
25 provinceSelect.add(option);
26 }
27 }
28 }
29 }
30 xhr.open("GET","/ajaxdemo/ServletDemo5?time="+new Date().getTime());
31 xhr.send(null);
32
33 //给省份下拉选择添加变更事件
34 document.getElementById("ps").onchange=function(){
35 var citySelect = document.getElementById("cs");
36 citySelect.length=1;
37 //根据选择的省份,显示对应的城市
38 var provinceCode = this.value;
39 //找xml文档,
40 var xmlProvinces = xmlDoc.getElementsByTagName("province");
41 for(var i=0;i<xmlProvinces.length;i++){
42 if(xmlProvinces[i].getAttribute("code")==provinceCode){
43 //在xml中找到了对应的省份
44 var xmlCitys = xmlProvinces[i].getElementsByTagName("city");
45 for(var j=0;j<xmlCitys.length;j++){
46
47 var option = new Option(xmlCitys[j].getAttribute("name"),xmlCitys[j].getAttribute("code"));//<option value="37">山东</option>
48 citySelect.add(option);
49 }
50 }
51 }
52 }
53
54 }
55
56 </script>
57 </head>
58
59 <body>
60 <select id="ps">
61 <option value="">--请选择--</option>
62 </select>
63 <select id="cs">
64 <option value="">--请选择--</option>
65 </select>
66 </body>
67 </html>
Servlet
1 package wsj;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.util.ArrayList;
6 import java.util.List;
7
8 import javax.servlet.ServletException;
9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13
14
15
16 import wsj.domain.City;
17 import wsj.domain.Province;
18
19 import com.thoughtworks.xstream.XStream;
20
21 public class ServletDemo5 extends HttpServlet {
22 private List<Province> provinces = new ArrayList<Province>();
23 public void init() throws ServletException {
24 Province sd = new Province();
25 sd.setCode("37");
26 sd.setName("山东省");
27
28 City jn = new City();
29 jn.setCode("0531");
30 jn.setName("济南市");
31
32 City qd = new City();
33 qd.setCode("0532");
34 qd.setName("青岛市");
35
36 sd.getCitys().add(jn);
37 sd.getCitys().add(qd);
38
39 Province hb = new Province();
40 hb.setCode("42");
41 hb.setName("湖北省");
42
43 City wh = new City();
44 wh.setCode("027");
45 wh.setName("武汉市");
46
47 City jz = new City();
48 jz.setCode("0716");
49 jz.setName("荆州市");
50
51 hb.getCitys().add(wh);
52 hb.getCitys().add(jz);
53
54 provinces.add(sd);
55 provinces.add(hb);
56 }
57
58 public void doGet(HttpServletRequest request, HttpServletResponse response)
59 throws ServletException, IOException {
60 response.setContentType("text/xml;charset=UTF-8");
61 PrintWriter out = response.getWriter();
62 //把省份和城市以xml的形式返回给客户端
63 /*
64 <provinces>
65 <province name="山东省" code="37">
66 <city code="0531" name="济南市"/>
67 <city code="0532" name="青岛市"/>
68 </province>
69 <province name="湖北省" code="42">
70 <city code="027" name="武汉市"/>
71 <city code="0716" name="荆州市"/>
72 </province>
73 </provinces>
74 */
75 XStream xs = new XStream();
76 xs.alias("provinces", List.class);
77 // xs.alias("province", Province.class);
78 // xs.alias("city", City.class);
79 xs.autodetectAnnotations(true);//自动检测相关类的注解
80 String xml = xs.toXML(provinces);
81 out.write(xml);
82 }
83
84 public void doPost(HttpServletRequest request, HttpServletResponse response)
85 throws ServletException, IOException {
86 doGet(request, response);
87 }
88
89 }
结果:
六Json
Json是一种轻量级的格式。
有三种形式:
- 定义对象var j = {name:”liuyou”,gender:”man”};
- 定义数组 var j = [{name:”liuyou”,gender:”man”},{name:”liuyou”,gender:”man”}];
- 定义含有数组的对var j = {name:”liuyou”,gender:”man”,hobby:[“吃饭”,”泡妞”,”打豆豆”]};取值方式J.name j[1].name (角标从1开始)
这里用到jsonlib相关的jar包实现JSon串的返回和处理
jar包:在Apache官网和JSon官网都可以下载
JSONDemo测试类
1 public class JSONDemo {
2 @Test
3 public void test1(){
4 Product p = new Product(10001, "西门外传", 10);
5 JSONArray ja = JSONArray.fromObject(p);//[{"name":"西门外传","num":10001,"price":10}]
6 System.out.println(ja);
7 }
8 @Test
9 public void test2(){
10 Product p = new Product(10001, "西门外传", 10);
11 JSONObject ja = JSONObject.fromObject(p);//{"name":"西门外传","num":10001,"price":10}
12 System.out.println(ja);
13 }
14 @Test
15 public void test3(){
16 List<Product> products = new ArrayList<Product>();
17 products.add(new Product(1001, "打气筒", 10));
18 products.add(new Product(1002, "金瓶梅", 20));
19 products.add(new Product(1003, "葵花宝典", 30));
20 products.add(new Product(1004, "肥皂", 40));
21 products.add(new Product(1005, "卫生纸", 50));
22 JSONArray ja = JSONArray.fromObject(products);
23 System.out.println(ja);
24 }
25 //属性过滤
26 @Test
27 public void test4(){
28 Product p = new Product(10001, "西门外传", 10);
29 JsonConfig jc = new JsonConfig();
30 jc.setExcludes(new String[]{"num","price"});
31 JSONObject ja = JSONObject.fromObject(p,jc);//{"name":"西门外传","price":10}
32 System.out.println(ja);
33 }
34 }
改写商品列表:
HTML
1 <script type="text/javascript" src="js/util.js"></script>
2 <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
3 <script type="text/javascript">
4 window.onload=function(){
5 document.getElementById("a1").onclick=function(){
6 var xhr = getXmlHttpRequest();
7 xhr.onreadystatechange=function(){
8 if(xhr.readyState==4){
9 if(xhr.status==200){
10 var data = xhr.responseText;//JSON串当做了文本对待
11 //把文本转成js代码
12 var products = eval("("+data+")");
13 //HTML DOM(挑浏览器)或XML DOM编程
14 for(var i=0;i<products.length;i++){
15 var tr = document.getElementById("t1").insertRow();//<tr></tr>
16 var td1 = tr.insertCell();//<td></td>
17 td1.innerHTML=products[i].num;// <td>1001</td>
18 var td2 = tr.insertCell();//<td></td>
19 td2.innerHTML=products[i].name;// <td>XXX</td>
20 var td3 = tr.insertCell();//<td></td>
21 td3.innerHTML=products[i].price;// <td>10</td>
22 }
23 }
24 }
25 }
26 xhr.open("GET","/day21_00_ajax/servlet/ServletDemo6?time="+new Date().getTime());
27 xhr.send(null);
28 }
29 }
30 </script>
31 </head>
32
33 <body>
34 <a id="a1" href="javascript:void(0)">显示商品信息</a>
35 <hr/>
36 <div id="d1">
37 <table id="t1" border="1" width="438">
38 <tr>
39 <th>编号</th>
40 <th>名称</th>
41 <th>价格</th>
42 </tr>
43
44 </table>
45 </div>
46 </body>
Servlet
public class ServletDemo6 extends HttpServlet {
private List<Product> products = new ArrayList<Product>();
public void init() throws ServletException {
products.add(new Product(1001, "打气筒", 10));
products.add(new Product(1002, "金瓶梅", 20));
products.add(new Product(1003, "葵花宝典", 30));
products.add(new Product(1004, "肥皂", 40));
products.add(new Product(1005, "卫生纸", 50));
}
//组成JSON串打给客户端
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain;charset=UTF-8");
PrintWriter out = response.getWriter();
JSONArray ja = JSONArray.fromObject(products);
out.write(ja.toString());
}