省市联动ajax

省市联动
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>

猜你喜欢

转载自blog.csdn.net/Entermomem/article/details/83992281