Java Web——Ajax(實現省份城市二級聯動)


一、當用戶點擊具體省份后,出發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()函數進行解析,可以得到一個對象數組,遍歷即可拿到對應的值

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM