一、當用戶點擊具體省份后,出發onchange()方法,處理到javascript中
1 var xhr = false; 2 3 function getCity() 4 { 5 //1.創建XMLHttpRequest對象 6 //非IE瀏覽器 7 if(window.XMLHttpRequest) 8 { 9 xhr = new XMLHttpRequest(); 10 } 11 //IE瀏覽器 12 else if(window.ActiveXObject) 13 { 14 xhr = new ActiveXObject("Microsoft.XMLHTTP"); 15 } 16 if(xhr) 17 { 18 /* 19 GET請求 20 */ 21 //2.定義url連接 22 /* var proObj = document.getElementById("province"); 23 var proId = proObj.options[proObj.selectedIndex].value; 24 var url = "GetCityServlet?proId="+proId; 25 //3.打開到服務器的連接 26 xhr.open("get", url, true); 27 //4.綁定回調函數(響應回來了,可以處理響應內容的函數) 28 xhr.onreadystatechange = callback; 29 //5.向服務器發送請求 30 xhr.send(null); */ 31 /* 32 POST請求 33 */ 34 //2.定義url連接 35 var url = "GetCityServlet"; 36 //3.打開到服務器的連接 37 xhr.open("post", url, true); 38 39 //注意:post提交方式必須配置內容類型-------------------------------------------------- 40 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 41 42 //4.綁定回調函數(響應回來了,可以處理響應內容的函數) 43 //xhr.onreadystatechange = callback_XML; 44 xhr.onreadystatechange = callback_JSON; 45 //5.向服務器發送請求 46 var proObj = document.getElementById("province"); 47 var proId = proObj.options[proObj.selectedIndex].value; 48 xhr.send("proId="+proId); 49 } 50 else 51 { 52 alert("XMLHttpRequest創建失敗"); 53 } 54 }
注意:1.通過ajax可以用get或者post發送到服務器
2.Ajax步驟:(1)生成XMLHttpRequest對象(2)定義url連接(3)打開連接(4)綁定回調函數(5)向服務器發送請求
二、服務端執行相應的操作,並需要將數據響應給回調函數(通過XML方式;通過JSON方式)
(1)通過XML方式
1 String proId = request.getParameter("proId"); 2 3 //根據選中的省份proId去數據獲取對應的城市List 4 List<City> cityList = new ArrayList<City>(); 5 if("1000".equals(proId))//廣東省 6 { 7 cityList.add(new City(1001,"廣州市")); 8 cityList.add(new City(1002,"深圳市")); 9 cityList.add(new City(1003,"肇慶市")); 10 } 11 else if("2000".equals(proId))//廣西省 12 { 13 cityList.add(new City(2001,"桂林市")); 14 cityList.add(new City(2002,"柳州市")); 15 cityList.add(new City(2003,"玉林市")); 16 } 17 else if("3000".equals(proId))//海南省 18 { 19 cityList.add(new City(3001,"海口市")); 20 cityList.add(new City(3002,"三亞市")); 21 cityList.add(new City(3003,"澄邁市")); 22 } 23 /* 24 <?xml version="1.0" encoding="UTF-8"?> 25 <cities> 26 <city> 27 <cid>1001</cid> 28 <cname>廣州市</cname> 29 </city> 30 <city> 31 <cid>1002</cid> 32 <cname>深圳市</cname> 33 </city> 34 <city> 35 <cid>1003</cid> 36 <cname>肇慶市</cname> 37 </city> 38 </cities> 39 */ 40 StringBuffer xml = new StringBuffer(); 41 42 xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 43 xml.append("<cities>"); 44 for (City city : cityList) { 45 xml.append("<city>"); 46 xml.append("<cid>"+city.getCid()+"</cid>"); 47 xml.append("<cname>"+city.getCname()+"</cname>"); 48 xml.append("</city>"); 49 } 50 xml.append("</cities>"); 51 52 System.out.println(xml.toString()); 53 54 //設置響應字符集編碼 55 response.setCharacterEncoding("utf-8"); 56 response.setContentType("text/xml;charset=utf-8"); 57 58 PrintWriter writer = response.getWriter(); 59 writer.write(xml.toString()); 60 writer.flush(); 61 writer.close();
注意:相當於把XML文檔格式編寫成字符串,然后將字符串響應給回調函數(XML方式應用於不同的web應用之間傳遞數據)
(2)JSON方式
1 String proId = request.getParameter("proId"); 2 3 //根據選中的省份proId去數據獲取對應的城市List 4 List<City> cityList = new ArrayList<City>(); 5 if("1000".equals(proId))//廣東省 6 { 7 cityList.add(new City(1001,"廣州市")); 8 cityList.add(new City(1002,"深圳市")); 9 cityList.add(new City(1003,"肇慶市")); 10 } 11 else if("2000".equals(proId))//廣西省 12 { 13 cityList.add(new City(2001,"桂林市")); 14 cityList.add(new City(2002,"柳州市")); 15 cityList.add(new City(2003,"玉林市")); 16 } 17 else if("3000".equals(proId))//海南省 18 { 19 cityList.add(new City(3001,"海口市")); 20 cityList.add(new City(3002,"三亞市")); 21 cityList.add(new City(3003,"澄邁市")); 22 } 23 24 JSONArray json = JSONArray.fromObject(cityList);//----------------對象轉json數組 25 26 System.out.println(json.toString()); 27 28 //設置響應字符集編碼 29 response.setCharacterEncoding("utf-8"); 30 response.setContentType("application/json;charset=utf-8"); 31 32 PrintWriter writer = response.getWriter(); 33 writer.write(json.toString()); 34 writer.flush(); 35 writer.close(); 36 }
注意:1.JSON方式多用於在自己的web應用中傳遞數據
2.JSON是將對象組成了一個JSON數組然后發給回調函數
3.需要導入對應的jar包
三、回調函數進行響應操作
(1)XML方式:
1 //回調函數 2 function callback_XML() 3 { 4 if(xhr.readyState == 4)//響應完成 5 { 6 if(xhr.status == 200)//正常響應 7 { 8 /* 9 <cities> 10 <city> 11 <cid>2001</cid> 12 <cname>桂林市</cname> 13 </city> 14 15 ........ 16 17 </cities> 18 */ 19 //alert("響應完成Text:" + xhr.responseText); 20 var cityXml = xhr.responseXML; 21 //獲取xml文檔根元素<cities> 22 var root = cityXml.documentElement; 23 //獲取xml文檔根元素<cities>下所有<city>節點 24 var cities = root.getElementsByTagName("city"); 25 26 var cityObj = document.getElementById("city"); 27 //遍歷獲取每一個<city>節點 28 cityObj.options.length = 1;//下一次選擇省份時可以刪掉上次綁定的內容 29 for(var i=0;i<cities.length;i++) 30 { 31 var city = cities[i];//單個<city> 32 //獲取<cid>中的文本值 33 var cid = city.childNodes[0].firstChild.nodeValue; 34 //獲取<cname>中的文本值 35 var cname = city.childNodes[1].firstChild.nodeValue; 36 37 //綁定到城市下拉列表 38 cityObj.options[cityObj.options.length] = new Option(cname,cid); 39 } 40 } 41 } 42 }
注意:1.通過XML對應的數據解析方法將傳來的字符串重新解析為XML文檔,隨后進行數據的提取
(2)JSON方式:
1 //回調函數 2 function callback_JSON() 3 { 4 if(xhr.readyState == 4)//響應完成 5 { 6 if(xhr.status == 200)//正常響應 7 { 8 /* 9 [ 10 {"cid":1001,"cname":"廣州市"}, 11 {"cid":1002,"cname":"深圳市"}, 12 {"cid":1003,"cname":"肇慶市"} 13 ] 14 15 */ 16 var json = xhr.responseText; 17 var cityArray = eval(json); 18 19 var cityObj = document.getElementById("city"); 20 cityObj.options.length = 1; 21 for(var i=0;i<cityArray.length;i++) 22 { 23 var city = cityArray[i]; 24 25 var cid = city.cid;//cid屬性值 26 var cname = city.cname;//cname屬性值 27 28 //綁定到城市下拉列表 29 cityObj.options[cityObj.options.length] = new Option(cname,cid); 30 } 31 32 } 33 } 34 }
注意:1.將得到的JSON數組通過eval()函數進行解析,可以得到一個對象數組,遍歷即可拿到對應的值