省市聯動ajax
阿新 • • 發佈:2018-11-19
省市聯動 1、頁面 <select name="province"> <option>選擇省份</option> </select> <select name="city"> <option>選擇城市</option> </select> 2、Servlet ProvinceServlet:當頁面載入完畢後馬上請求這個Servlet 需要載入china.xml檔案,把所有的省的名稱使用字串傳送給客戶端 3、頁面的工作 獲取這個字串,使用逗號分隔,得到陣列 迴圈遍歷每個字串(省份的名稱),使用每個字串建立一個<option>新增到<select name="province">這個元素中 4、CityServlet CityServlet:當頁面選擇某個省時,傳送請求 得到省份的名稱,載入china.xml檔案,查詢出該省份對應的元素物件。把這個元素轉換成xml字串,傳送給客戶端 5、頁面的工作 把<select name="city">中所有子元素刪除,但不要刪除<option>選擇城市</option> 得到伺服器的響應結果:doc 獲取所有的<city>子元素,迴圈遍歷,得到<city>的內容 使用每個<city>的內容建立一個<option>元素,新增到<select name="city">
public class CityServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected 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 + "']");// province[@name='a'] String xmlStr = proEle.asXML();// 把元素轉換成字串 response.getWriter().print(xmlStr); } catch (DocumentException e) { throw new RuntimeException(e); } } }
public class ProvinceServlet extends HttpServlet { private static final long serialVersionUID = 1L; @SuppressWarnings("unchecked") protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); 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");// xpath查詢 // [//]沒有深度查詢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 (DocumentException e) { throw new RuntimeException(e); } } }
.jsp
<script type="text/javascript">
function createXMLHttpRequest() {
try {
return new XMLHttpRequest();//大多數瀏覽器
} catch (e) {
try {
return ActiveXObject("Msxml2.XMLHTTP");//IE6.0
} catch (e) {
try {
return ActiveXObject("Microsoft.XMLHTTP");//IE5.5及更早
} catch (e) {
alert("什麼瀏覽器?");
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就不迴圈
citySelect.removeChild(optionEleList[1]);//總是刪除1下標,因為1刪除了,2就變成1了
}
var doc = xmlHttp.responseXML;
//得到所有名為city的元素
var cityEleList = doc.getElementsByTagName("item");
//迴圈遍歷每個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="item" ID="c">
<option>選擇市</option>
</select>
</body>
china.xml
<?xml version="1.0" encoding="utf-8"?>
<china>
<province name="北京">
<item>東城區</item>
<item>西城區</item>
<item>崇文區</item>
<item>宣武區</item>
<item>朝陽區</item>
<item>豐臺區</item>
<item>石景山區</item>
<item>海淀區</item>
<item>門頭溝區</item>
<item>房山區</item>
<item>通州區</item>
<item>順義區</item>
<item>昌平區</item>
<item>大興區</item>
<item>懷柔區</item>
<item>平谷區</item>
<item>密雲縣</item>
<item>延慶縣</item>
</province>
<province name="天津">
<item>和平區</item>
<item>河東區</item>
<item>河西區</item>
<item>南開區</item>
<item>河北區</item>
<item>紅橋區</item>
<item>塘沽區</item>
<item>漢沽區</item>
<item>大港區</item>
<item>東麗區</item>
<item>西青區</item>
<item>津南區</item>
<item>北辰區</item>
<item>武清區</item>
<item>寶坻區</item>
<item>寧河縣</item>
<item>靜海縣</item>
<item>薊縣</item>
</province>
<province name="河北">
<item>石家莊</item>
<item>唐山</item>
<item>秦皇島</item>
<item>邯鄲</item>
<item>邢臺</item>
<item>保定</item>
<item>張家口</item>
<item>承德</item>
<item>滄州</item>
<item>廊坊</item>
<item>衡水</item>
</province>
<province name="山西">
<item>太原</item>
<item>大同</item>
<item>陽泉</item>
<item>長治</item>
<item>晉城</item>
<item>朔州</item>
<item>晉中</item>
<item>運城</item>
<item>忻州</item>
<item>臨汾</item>
<item>呂梁</item>
</province>
<province name="內蒙古">
<item>呼和浩特</item>
<item>包頭</item>
<item>烏海</item>
<item>赤峰</item>
<item>通遼</item>
<item>鄂爾多斯</item>
<item>呼倫貝爾</item>
<item>巴彥淖爾</item>
<item>烏蘭察布</item>
<item>興安盟</item>
<item>錫林郭勒盟</item>
<item>阿拉善盟</item>
</province>
<province name="遼寧">
<item>瀋陽</item>
<item>大連</item>
<item>鞍山</item>
<item>撫順</item>
<item>本溪</item>
<item>丹東</item>
<item>錦州</item>
<item>營口</item>
<item>阜新</item>
<item>遼陽</item>
<item>盤錦</item>
<item>鐵嶺</item>
<item>朝陽</item>
<item>葫蘆島</item>
</province>
<province name="吉林">
<item>長春</item>
<item>吉林</item>
<item>四平</item>
<item>遼源</item>
<item>通化</item>
<item>白山</item>
<item>松原</item>
<item>白城</item>
<item>延邊</item>
</province>
<province name="黑龍江">
<item>哈爾濱</item>
<item>齊齊哈爾</item>
<item>雞西</item>
<item>鶴崗</item>
<item>雙鴨山</item>
<item>大慶</item>
<item>伊春</item>
<item>佳木斯</item>
<item>七臺河</item>
<item>牡丹江</item>
<item>黑河</item>
<item>綏化</item>
<item>大興安嶺</item>
</province>
<province name="上海">
<item>黃浦區</item>
<item>盧灣區</item>
<item>徐彙區</item>
<item>長寧區</item>
<item>靜安區</item>
<item>普陀區</item>
<item>閘北區</item>
<item>虹口區</item>
<item>楊浦區</item>
<item>閔行區</item>
<item>寶山區</item>
<item>嘉定區</item>
<item>浦東新區</item>
<item>金山區</item>
<item>松江區</item>
<item>青浦區</item>
<item>南匯區</item>
<item>奉賢區</item>
<item>崇明縣</item>
</province>
<province name="江蘇">
<item>南京</item>
<item>無錫</item>
<item>徐州</item>
<item>常州</item>
<item>蘇州</item>
<item>南通</item>
<item>連雲港</item>
<item>淮安</item>
<item>鹽城</item>
<item>揚州</item>
<item>鎮江</item>
<item>泰州</item>
<item>宿遷</item>
</province>
<province name="浙江">
<item>杭州</item>
<item>寧波</item>
<item>溫州</item>
<item>嘉興</item>
<item>湖州</item>
<item>紹興</item>
<item>金華</item>
<item>衢州</item>
<item>舟山</item>
<item>台州</item>
<item>麗水</item>
</province>
<province name="安徽">
<item>合肥</item>
<item>蕪湖</item>
<item>蚌埠</item>
<item>淮南</item>
<item>馬鞍山</item>
<item>淮北</item>
<item>銅陵</item>
<item>安慶</item>
<item>黃山</item>
<item>滁州</item>
<item>阜陽</item>
<item>宿州</item>
<item>巢湖</item>
<item>六安</item>
<item>亳州</item>
<item>池州</item>
<item>宣城</item>
</province>
<province name="福建">
<item>福州</item>
<item>廈門</item>
<item>莆田</item>
<item>三明</item>
<item>泉州</item>
<item>漳州</item>
<item>南平</item>
<item>龍巖</item>
<item>寧德</item>
</province>
<province name="江西">
<item>南昌</item>
<item>景德鎮</item>
<item>萍鄉</item>
<item>九江</item>
<item>新餘</item>
<item>鷹潭</item>
<item>贛州</item>
<item>吉安</item>
<item>宜春</item>
<item>撫州</item>
<item>上饒</item>
</province>
<province name="山東">
<item>濟南</item>
<item>青島</item>
<item>淄博</item>
<item>棗莊</item>
<item>東營</item>
<item>煙臺</item>
<item>濰坊</item>
<item>濟寧</item>
<item>泰安</item>
<item>威海</item>
<item>日照</item>
<item>萊蕪</item>
<item>臨沂</item>
<item>德州</item>
<item>聊城</item>
<item>濱州</item>
<item>荷澤</item>
</province>
<province name="河南">
<item>鄭州</item>
<item>開封</item>
<item>洛陽</item>
<item>平頂山</item>
<item>安陽</item>
<item>鶴壁</item>
<item>新鄉</item>
<item>焦作</item>
<item>濮陽</item>
<item>許昌</item>
<item>漯河</item>
<item>三門峽</item>
<item>南陽</item>
<item>商丘</item>
<item>信陽</item>
<item>周口</item>
<item>駐馬店</item>
</province>
<province name="湖北">
<item>武漢</item>
<item>黃石</item>
<item>十堰</item>
<item>宜昌</item>
<item>襄樊</item>
<item>鄂州</item>
<item>荊門</item>
<item>孝感</item>
<item>荊州</item>
<item>黃岡</item>
<item>咸寧</item>
<item>隨州</item>
<item>恩施</item>
<item>神農架</item>
</province>
<province name="湖南">
<item>長沙</item>
<item>株洲</item>
<item>湘潭</item>
<item>衡陽</item>
<item>邵陽</item>
<item>岳陽</item>
<item>常德</item>
<item>張家界</item>
<item>益陽</item>
<item>郴州</item>
<item>永州</item>
<item>懷化</item>
<item>婁底</item>
<item>湘西</item>
</province>
<province name="廣東">
<item>廣州</item>
<item>韶關</item>
<item>深圳</item>
<item>珠海</item>
<item>汕頭</item>
<item>佛山</item>
<item>江門</item>
<item>湛江</item>
<item>茂名</item>
<item>肇慶</item>
<item>惠州</item>
<item>梅州</item>
<item>汕尾</item>
<item>河源</item>
<item>陽江</item>
<item>清遠</item>
<item>東莞</item>
<item>中山</item>
<item>潮州</item>
<item>揭陽</item>
<item>雲浮</item>
</province>
<province name="廣西">
<item>南寧</item>
<item>柳州</item>
<item>桂林</item>
<item>梧州</item>
<item>北海</item>
<item>防城港</item>
<item>欽州</item>
<item>貴港</item>
<item>玉林</item>
<item>百色</item>
<item>賀州</item>
<item>河池</item>
<item>來賓</item>
<item>崇左</item>
</province>
<province name="海南">
<item>海口</item>
<item>三亞</item>
</province>
<province name="重慶">
<item>重慶</item>
<item>萬州區</item>
<item>涪陵區</item>
<item>渝中區</item>
<item>大渡口區</item>
<item>江北區</item>
<item>沙坪壩區</item>
<item>九龍坡區</item>
<item>南岸區</item>
<item>北碚區</item>
<item>萬盛區</item>
<item>雙橋區</item>
<item>渝北區</item>
<item>巴南區</item>
<item>黔江區</item>
<item>長壽區</item>
<item>綦江縣</item>
<item>潼南縣</item>
<item>銅梁縣</item>
<item>大足縣</item>
<item>榮昌縣</item>
<item>璧山縣</item>
<item>梁平縣</item>
<item>城口縣</item>
<item>豐都縣</item>
<item>墊江縣</item>
<item>武隆縣</item>
<item>忠縣</item>
<item>開縣</item>
<item>雲陽縣</item>
<item>奉節縣</item>
<item>巫山縣</item>
<item>巫溪縣</item>
<item>石柱土家族自治縣</item>
<item>秀山土家族苗族自治縣</item>
<item>酉陽土家族苗族自治縣</item>
<item>彭水苗族土家族自治縣</item>
<item>江津</item>
<item>合川</item>
<item>永川</item>
<item>南川</item>
</province>
<province name="四川">
<item>成都</item>
<item>自貢</item>
<item>攀枝花</item>
<item>瀘州</item>
<item>德陽</item>
<item>綿陽</item>
<item>廣元</item>
<item>遂寧</item>
<item>內江</item>
<item>樂山</item>
<item>南充</item>
<item>眉山</item>
<item>宜賓</item>
<item>廣安</item>
<item>達州</item>
<item>雅安</item>
<item>巴中</item>
<item>資陽</item>
<item>阿壩</item>
<item>甘孜</item>
<item>涼山</item>
</province>
<province name="貴州">
<item>貴陽</item>
<item>六盤水</item>
<item>遵義</item>
<item>安順</item>
<item>銅仁</item>
<item>黔西南</item>
<item>畢節</item>
<item>黔東南</item>
<item>黔南</item>
</province>
<province name="雲南">
<item>昆明</item>
<item>曲靖</item>
<item>玉溪</item>
<item>保山</item>
<item>昭通</item>
<item>麗江</item>
<item>思茅</item>
<item>臨滄</item>
<item>楚雄</item>
<item>紅河</item>
<item>文山</item>
<item>西雙版納</item>
<item>大理</item>
<item>德巨集</item>
<item>怒江</item>
<item>迪慶</item>
</province>
<province name="西藏">
<item>拉薩</item>
<item>昌都</item>
<item>山南</item>
<item>日喀則</item>
<item>那曲</item>
<item>阿里</item>
<item>林芝</item>
</province>
<province name="陝西">
<item>西安</item>
<item>銅川</item>
<item>寶雞</item>
<item>咸陽</item>
<item>渭南</item>
<item>延安</item>
<item>漢中</item>
<item>榆林</item>
<item>安康</item>
<item>商洛</item>
</province>
<province name="甘肅">
<item>蘭州</item>
<item>嘉峪關</item>
<item>金昌</item>
<item>白銀</item>
<item>天水</item>
<item>武威</item>
<item>張掖</item>
<item>平涼</item>
<item>酒泉</item>
<item>慶陽</item>
<item>定西</item>
<item>隴南</item>
<item>臨夏</item>
<item>甘南</item>
</province>
<province name="青海">
<item>西寧</item>
<item>海東</item>
<item>海北</item>
<item>黃南</item>
<item>海南</item>
<item>果洛</item>
<item>玉樹</item>
<item>海西</item>
</province>
<province name="寧夏">
<item>銀川</item>
<item>石嘴山</item>
<item>吳忠</item>
<item>固原</item>
<item>中衛</item>
</province>
<province name="新疆">
<item>烏魯木齊</item>
<item>克拉瑪依</item>
<item>吐魯番</item>
<item>哈密</item>
<item>昌吉</item>
<item>博爾塔拉</item>
<item>巴音郭楞</item>
<item>阿克蘇</item>
<item>克孜勒蘇</item>
<item>喀什</item>
<item>和田</item>
<item>伊犁</item>
<item>塔城</item>
<item>阿勒泰</item>
<item>石河子</item>
<item>阿拉爾</item>
<item>圖木舒克</item>
<item>五家渠</item>
</province>
<province name="香港">
<item>香港</item>
</province>
<province name="澳門">
<item>澳門</item>
</province>
<province name="臺灣">
<item>臺灣</item>
</province>
</china>