通過Ajax異步提交的方法實現從數據庫獲取省份和城市信息實現二級聯動(xml方法)


之前有寫過是從JavaScript數組里獲取省市信息來實現二級聯動,但是似乎有很多需求是要從數據庫里獲取信息,所以就需要根據異步提交,局部刷新的思想來實現來提高用戶交互問題

第一種方法是xml方法

1.首先在jsp頁面的JavaScript,這段代碼是通用的,所以把他放在函數外面,可以供其他的函數共同使用

 1 var xhr=false;  2  //創建XMLHttpRequst對象  3  if(window.XMLHttpRequest)  4  {  5  xhr=new XMLHttpRequest();  6  }  7  else if(window.ActiveXObject)  8  {  9  xhr=new ActiveXObject("Microsoft.XMLHTTP"); 10  } 11  else 12  { 13  xhr=false; 14     }

2.獲取所選擇的省份value值,並將value值通過異步提交傳到servlet

 1 //獲取城市的信息  2  function getCity()  3  {  4  //省份下拉框的對象  5  var provinceobj=document.getElementById("province");  6  //被選擇的省份的索引  7  var index=provinceobj.selectedIndex;  8  //被選擇的省份的value值  9  var provincevalue=provinceobj[index].value; 10  //被選擇的省份的text值 11  var province=provinceobj[index].Text; 12  alert(provincevalue); 13         var url="<%=basepath%>CityServlet";/* post請求不在url上帶參數 */ 14         <%-- var url="<%=basepath%>CityServlet?provincevalue="+provincevalue; --%>//get請求在url上帶參數 15  xhr.open("post",url,true);//設置為post提交方式,true表示為異步提交 16  //post提交方式的時候需要設置提交的編碼 17  xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 18  //當狀態改變時,調用callBack_XML來判斷是否需要接收數據 
19      xhr.onreadystatechange=callBack_XML;//xml方法
20     //通過post提交的時候需要將數據放到send里傳到servlet里
21     xhr.send("provincevalue="+provincevalue);
22     //xhr.send(null);
23   }

3.編寫回調函數callBack_XML(),此函數判斷當服務器響應正常時,接收數據並作出處理

 1 function callBack_XML()//xml方法來獲取  2  {  3  //城市下拉選擇框的對象  4  var cityobj=document.getElementById("city");  5  //當請求狀態等於4時,相應已完成,可以訪問服務器響應並使用它  6  if(xhr.readyState==4)  7  {  8  //當狀態為200時意味着,狀態正常,未出錯  9  if(xhr.status==200) 10  { 11  alert("響應成功"); 12  //獲取相應的xml文檔 13  var cityxml=xhr.responseXML; 14  alert(cityxml); 15  //獲取根元素 16  var root=cityxml.documentElement; 17  //獲取根元素(city_info)下面的所有city元素 18  var cities=root.getElementsByTagName("city"); 19  //將下拉框內容清除 20  cityobj.options.length=1; 21                for(var i=0;i<cities.length;i++) 22 { 23 var city=cities[i]; 24 //獲取節點的值 25 var cid=city.childNodes[0].firstChild.nodeValue; 26 var cname=city.childNodes[2].firstChild.nodeValue; 27 //alert(cid+" "+cname); 28 //放到下拉選擇框里Option(文本內容,value值); 29 cityobj.options[cityobj.options.length]=new Option(cname,cid); 30 } 31 32 } 33 //當狀態為404時,表示找不到頁面 34 else if(xhr.status==404) 35 { 36 alert("Request URL is not exists!"); 37 } 38 else 39 { 40 alert("Error:Status is:"+request.status); 41 } 42 } 43 44 }

4.在servlet頁面:

 1 String provincevalue=request.getParameter("provincevalue");  2         System.out.println("省份編號:"+provincevalue);  3         CityService cityservice=CityService.getCityService();  4         List<City> citylist=cityservice.getCity(provincevalue);  5         for(int i=0;i<citylist.size();i++)  6  {  7  System.out.println(citylist.get(i));  8  }  9 
10         //生成xml頁面
11         StringBuffer xml=new StringBuffer(); 12         
13         xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 14         xml.append("<city_info>"); 15         for(City c : citylist) 16  { 17             xml.append("<city>"); 18             xml.append("<id>"+c.getId()+"</id>"); 19             xml.append("<cityid>"+c.getCityid()+"</cityid>"); 20             xml.append("<cityname>"+c.getCity()+"</cityname>"); 21             xml.append("<province>"+c.getFather()+"</province>"); 22             xml.append("</city>"); 23  } 24         xml.append("</city_info>"); 25         
26         //設置響應字符集編碼,防止中文亂碼
27         response.setCharacterEncoding("utf-8"); 28         response.setContentType("text/xml;charset=utf-8"); 29         //將xml文檔寫出去
30         PrintWriter writer=response.getWriter(); 31         //因為只能寫字符串,所以toString
32  writer.write(xml.toString()); 33  writer.flush(); 34  writer.close(); 35     }

這樣就完成了用xml實現異步提交和局部刷新來實現省市二級聯動

接下來會有利用json來實現。

 


免責聲明!

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



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