查看: 164036|回复: 1139

Ajax省市联动(下)

[复制链接]
  • TA的每日心情
    奋斗
    2023-9-8 11:45
  • 签到天数: 138 天

    [LV.7]常住居民III

    发表于 2015-12-8 18:31:58 | 显示全部楼层 |阅读模式
    本帖最后由 webker 于 2015-12-8 18:43 编辑

    接下来,我们进入主题。

    目前我们的思路是,服务端(即请求一个地址,这里是servlet),读取xml数据,生成省的数组,并通过ajax异步请求生成省的下拉选项页面,当选择某个省时触发onchange事件,将获取到的省作为请求参数传递给另一个页面,以生成市。当然这里会有一个小问题,待会我们再说。


    html搞起
    [HTML] 纯文本查看 复制代码
    <html>
      <head>
        
        
        <title>My JSP 'index.jsp' starting page</title>
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
      </head>
      
      <body>
      <form method="post">
       <select name="province" id="pro">
       	<option>请选择省份</option>
       </select>
       <select name="city" id="c1">
       	<option>请选择市</option>
       </select>
       <input type="submit"/>
       </form>
      </body></html>
    

    导入jar包,dom4j....
    以下是部分省市xml数据:
    [XML] 纯文本查看 复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <china>
    	<province name="北京">
    		<city>东城区</city>
    		<city>西城区</city>
    		<city>崇文区</city>
    		<city>宣武区</city>
    		<city>朝阳区</city>
    		<city>丰台区</city>
    		<city>石景山区</city>
    		<city>海淀区</city>
    		<city>门头沟区</city>
    		<city>房山区</city>
    		<city>通州区</city>
    		<city>顺义区</city>
    		<city>昌平区</city>
    		<city>大兴区</city>
    		<city>怀柔区</city>
    		<city>平谷区</city>
    		<city>密云县</city>
    		<city>延庆县</city>
    	</province>
    	<province name="天津">
    		<city>和平区</city>
    		<city>河东区</city>
    		<city>河西区</city>
    		<city>南开区</city>
    		<city>河北区</city>
    		<city>红桥区</city>
    		<city>塘沽区</city>
    		<city>汉沽区</city>
    		<city>大港区</city>
    		<city>东丽区</city>
    		<city>西青区</city>
    		<city>津南区</city>
    		<city>北辰区</city>
    		<city>武清区</city>
    		<city>宝坻区</city>
    		<city>宁河县</city>
    		<city>静海县</city>
    		<city>蓟县</city>
    	</province>
    	<province name="河北">
    		<city>石家庄</city>
    		<city>唐山</city>
    		<city>秦皇岛</city>
    		<city>邯郸</city>
    		<city>邢台</city>
    		<city>保定</city>
    		<city>张家口</city>
    		<city>承德</city>
    		<city>沧州</city>
    		<city>廊坊</city>
    		<city>衡水</city>
    	</province></china>
    


    新建servlet, 360反馈意见截图18280509286039.png 360反馈意见截图1624122678114113.png
    Province.java
    [Java] 纯文本查看 复制代码
    package test;
    import java.io.IOException;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.io.SAXReader;
    
    
    public class Province extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		response.setContentType("text/html");
    		response.setCharacterEncoding("utf-8");
    		SAXReader reader=new SAXReader();
    		try {
    			Document doc=reader.read(this.getClass().getResourceAsStream("/china.xml"));//在src目录下找china.xml
    			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());
    				if(i<arrList.size()-1){		
    					sb.append(",");	//最后一个不带,
    				}
    			}
    			
    			response.getWriter().print(sb);
    			
    		} catch (DocumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		
    		
    	}
    
    }

    修改html代码:
    [HTML] 纯文本查看 复制代码
    <html>
      <head>
        
        
        <title>My JSP 'index.jsp' starting page</title>
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
      </head>
      
      <body>
      <form method="post">
       <select name="province" id="pro">
       	<option>请选择省份</option>
       </select>
       <select name="city" id="c1">
       	<option>请选择市</option>
       </select>
       <input type="submit"/>
       </form>
      </body>
    
    
    <script type="text/javascript">
    	
    	var xml=new XMLHttpRequest();
    	
    	xml.open("get","Province",true);
    	
    	xml.send(null);
    	
    	xml.onreadystatechange=function(){
    		if(xml.readyState==4 && xml.status==200){
    			var arr=xml.responseText;	//获得返回数据,形如:北京,天津
    			var proarr=arr.split(",");//将字符串转为数组
    			for(var i=0;i<proarr.length;i++){//遍历数组
    				var tag=document.createElement("option");//创建option元素节点
    				var text=document.createTextNode(proarr[i]);	//创建文档节点
    				tag.value=proarr[i];	//为option的value属性赋值
    				tag.appendChild(text);//将文本节点添加到option元素中
    				document.getElementById("pro").appendChild(tag); //在省的下拉列表添加选项option
    			}
    		}
    	};
    </script>
    </html>


    看下效果。
    360反馈意见截图18321101779480.png

    然后,通过js,为省的选项添加onchange事件,
    [JavaScript] 纯文本查看 复制代码
    var pro=document.getElementById("pro");
    	
    	pro.onchange=function(){
    	//这里获取市
    
    }



    新建servlet,City
    City.java
    [Java] 纯文本查看 复制代码
    package test;
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    
    public class City extends HttpServlet {
    
    	/**
    	 * The doGet method of the servlet. <br>
    	 *
    	 * This method is called when a form has its tag value method equals to get.
    	 * 
    	 * @param request the request send by the client to the server
    	 * @param response the response send by the server to the client
    	 * @throws ServletException if an error occurred
    	 * @throws IOException if an error occurred
    	 */
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		response.setContentType("text/xml;charset=utf-8");//设置响应类型为text/xml
    		request.setCharacterEncoding("utf-8");
    		SAXReader reader=new SAXReader();
    		try {
    			Document doc=reader.read(this.getClass().getResourceAsStream("/china.xml"));
    			String pname=request.getParameter("pname");//获取请求参数,省名
    			Element e=(Element) doc.selectSingleNode("//province[@name='"+pname+"']");//根据省名来获取单一节点
    			response.getWriter().print(e.asXML());//向浏览器返回xml数据。
    		} catch (DocumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    }
    


    最终html代码。。
    [HTML] 纯文本查看 复制代码
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>My JSP 'index.jsp' starting page</title>
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
      </head>
      
      <body>
      <form method="post">
       <select name="province" id="pro">
       	<option>请选择省份</option>
       </select>
       <select name="city" id="c1">
       	<option>请选择市</option>
       </select>
       <input type="submit"/>
       </form>
       <%request.setCharacterEncoding("utf-8"); %>
       <%=request.getParameter("province")%>
        <%=request.getParameter("city")%>
      </body>
    <script type="text/javascript">
    	
    	var xml=new XMLHttpRequest();
    	
    	xml.open("get","Province",true);
    	
    	xml.send(null);
    	
    	xml.onreadystatechange=function(){
    		if(xml.readyState==4 && xml.status==200){
    			var arr=xml.responseText;
    			var proarr=arr.split(",");
    			for(var i=0;i<proarr.length;i++){
    				var tag=document.createElement("option");
    				var text=document.createTextNode(proarr[i]);
    				tag.value=proarr[i];
    				tag.appendChild(text);
    				document.getElementById("pro").appendChild(tag);
    			}
    		}
    	};
    	
    	
    	var pro=document.getElementById("pro");
    	
    	pro.onchange=function(){//当选择了省后执行函数体
    		xml.open("post","City",true);
    		xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    		xml.send("pname="+pro.value);//获取当前选择的省名
    		xml.onreadystatechange=function(){
    			if(xml.readyState==4 && xml.status==200){
    				var doc=xml.responseXML;	//xml数据
    				var cityArr=doc.getElementsByTagName("city");//通过得到所有city元素
    				var parent=document.getElementById("c1");
    				var optionlist=parent.getElementsByTagName("option");
    				while(optionlist.length>1){
    					parent.removeChild(optionlist[1]);//当添加市的选项时,删除原先的市选项
    				}
    				for(var i=0;i<cityArr.length;i++){
    					var cityEle=cityArr[i];
    					var cityName;
    					
    					if(window.addEventListener){
    					cityName=cityEle.textContent;	
    					}else{
    						cityName=cityEle.text; //IE获取元素的文本节点内容
    					}
    						var tag=document.createElement("option");
    						var text=document.createTextNode(cityName);
    						tag.appendChild(text);
    						
    						parent.appendChild(tag);
    						
    				}
    				
    				
    			}
    		};
    		
    	};
    </script>
    </html>
    


    360反馈意见截图18471228393972.png

    ok了。吃饭去的。。写的不好,还请见谅。(*^__^*) 嘻嘻
    by:webker

    Ajax.zip

    913.75 KB, 下载次数: 0, 下载积分: i币 -1

    售价: 1 i币  [记录]  [购买]

    回复

    使用道具 举报

    该用户从未签到

    发表于 2015-12-9 02:13:23 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-12-9 03:03:34 | 显示全部楼层
    学习学习技术,加油!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-12-9 06:38:32 | 显示全部楼层
    感谢楼主的分享~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-12-9 14:58:55 | 显示全部楼层
    支持中国红客联盟(ihonker.org)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-12-9 17:07:31 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-12-10 05:41:42 | 显示全部楼层
    还是不错的哦,顶了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-12-10 17:11:18 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-4-14 17:44
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2015-12-11 03:12:23 | 显示全部楼层
    感谢楼主的分享~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-12-11 21:36:23 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

    官方邮箱:security#ihonker.org(#改成@)

    官方核心成员

    Archiver|手机版|小黑屋| ( 苏ICP备2021031567号 )

    GMT+8, 2024-5-7 07:59 , Processed in 0.054332 second(s), 14 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部