AJAX完成三级级下拉联动【省份-城市-区域】

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: AJAX应用案例--基于mysql,以POST方式,用DOM对象,完成三级级下拉联动【省份-城市-区域】,效果图如下: 数据库如下: 省份                        ...

AJAX应用案例--基于mysql,以POST方式,用DOM对象,完成三级级下拉联动【省份-城市-区域】,效果图如下:



数据库如下:

省份                                               城市                                                                                       区域



Jsp页面代码:

[html]  view plain copy
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  3. <html>  
  4.   <body>  
  5.     <select id="provinceID">  
  6.         <option>请选择省份</option>  
  7.         <option value="1">广东</option>  
  8.         <option value="2">湖南</option>  
  9.     </select>  
  10.     <select id="cityID">  
  11.         <option>请选择城市</option>  
  12.     </select>  
  13.     <select id="areaID">  
  14.         <option>请选择区域</option>  
  15.     </select>  
  16.     <script type="text/javascript">  
  17.         function createAJAX(){  
  18.             var ajax = null;  
  19.             try{  
  20.                 ajax = new ActiveXObject("microsoft.xmlhttp");  
  21.             }catch(e){  
  22.                 try{  
  23.                     ajax = new XMLHttpRequest();  
  24.                 }catch(e){  
  25.                     alert("请更换浏览器");  
  26.                 }  
  27.             }  
  28.             return ajax;  
  29.         }  
  30.     </script>  
  31.     <script type="text/javascript">  
  32.         //创建AJAX引擎对象  
  33.         var ajax = createAJAX();  
  34.         //产生事件  
  35.         document.getElementById("provinceID").onchange = function(){  
  36.                 //再次选择省份时,清空city下拉框  
  37.               //定位city下拉框  
  38.               var citySelectElement = document.getElementById("cityID");  
  39.               var optionElementArray = citySelectElement.options;  
  40.               var size = optionElementArray.length;  
  41.               if(size>1){  
  42.                 for(var i=size-1;i>0;i--){  
  43.                     citySelectElement.removeChild(optionElementArray[i]);  
  44.                 }  
  45.               }  
  46.                 
  47.               //再次选择省份时,清空area下拉框  
  48.                //定位area下拉框  
  49.               var areaSelectElement = document.getElementById("areaID");  
  50.               var areaOptionArray = areaSelectElement.options;  
  51.               var size = areaOptionArray.length;  
  52.               if(size>1){  
  53.                 for(var i=size-1;i>0;i--){  
  54.                     areaSelectElement.removeChild(areaOptionArray[i]);  
  55.                 }  
  56.               }  
  57.                 
  58.                 
  59.               //获取选中省份的编号  
  60.               var optionElement = this[this.selectedIndex];   
  61.               var provinceId = optionElement.value;  
  62.               //准备发送请求  
  63.               var method = "POST";  
  64.               var url = "${pageContext.request.contextPath}/ProvinceCityAreaServlet?id="+new Date().getTime();  
  65.               ajax.open(method,url);  
  66.               //设置以POST表单形式发送,自动将请求体的中文进行编码    
  67.               ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");      
  68.               //真正发送请求体中的数据  
  69.               var content = "provinceId="+provinceId + "&method=provinceToCity";  
  70.               ajax.send(content);  
  71.               //监听服务端的响应  
  72.               ajax.onreadystatechange = function(){  
  73.                 if(ajax.readyState==4){  
  74.                     if(ajax.status==200){  
  75.                         var jsonJavaString = ajax.responseText;  
  76.                         //jsonJavaString = [{"name":"长沙"},{"name":"湘潭"},{"name":"株洲"}]  
  77.                         var json = eval("("+jsonJavaString+")");  
  78.                         //返回值,就是可解析并执行的JavaScript代码  
  79.                         //json = [{"name":"长沙"},{"name":"湘潭"},{"name":"株洲"}]  
  80.                         var size = json.length;  
  81.                         //迭代  
  82.                         for(var i=0;i<size;i++){  
  83.                             var city = json[i].name;  
  84.                             var cid = json[i].id;  
  85.                             //创建option节点  
  86.                             var optionElement = document.createElement("option");  
  87.                             //设置option节点之间的内容  
  88.                             optionElement.innerHTML = city;  
  89.                             optionElement.setAttribute("value",cid);  
  90.                             //添加到city下拉框中  
  91.                             citySelectElement.appendChild(optionElement);  
  92.                         }  
  93.                     }  
  94.                 }  
  95.               };  
  96.         };  
  97.           
  98.         //===============================cityToArea==================================================  
  99.         //产生事件  
  100.         document.getElementById("cityID").onchange = function(){  
  101.               
  102.               //再次选择城市时,定位area下拉框,清空area下拉框  
  103.               var areaSelectElement = document.getElementById("areaID");  
  104.               var areaOptionArray = areaSelectElement.options;  
  105.               var size = areaOptionArray.length;  
  106.               if(size>1){  
  107.                 for(var i=size-1;i>0;i--){  
  108.                     areaSelectElement.removeChild(areaOptionArray[i]);  
  109.                 }  
  110.               }  
  111.               //获取选中城市的编号  
  112.               var optionElement = this[this.selectedIndex];   
  113.               var cid = optionElement.value;  
  114.               //准备发送请求  
  115.               var method = "POST";  
  116.               var url = "${pageContext.request.contextPath}/ProvinceCityAreaServlet?id="+new Date().getTime();  
  117.               ajax.open(method,url);  
  118.               //设置以POST表单形式发送,自动将请求体的中文进行编码    
  119.               ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");      
  120.               //真正发送请求体中的数据  
  121.               var content = "cid="+cid + "&method=cityToArea";  
  122.               ajax.send(content);  
  123.               //监听服务端的响应  
  124.               ajax.onreadystatechange = function(){  
  125.                 if(ajax.readyState==4){  
  126.                     if(ajax.status==200){  
  127.                         var jsonJavaString = ajax.responseText;  
  128.                         //jsonJavaString = [{"name":"长沙"},{"name":"湘潭"},{"name":"株洲"}]  
  129.                         var json = eval("("+jsonJavaString+")");  
  130.                         //返回值,就是可解析并执行的JavaScript代码  
  131.                         //json = [{"name":"长沙"},{"name":"湘潭"},{"name":"株洲"}]  
  132.                         var size = json.length;  
  133.                         //迭代  
  134.                         for(var i=0;i<size;i++){  
  135.                             var area = json[i].name;  
  136.                             //var cid = json[i].name;  
  137.                             //创建option节点  
  138.                             var optionElement = document.createElement("option");  
  139.                             //设置option节点之间的内容  
  140.                             optionElement.innerHTML = area;  
  141.                             //optionElement.setAttribute("id",cid);  
  142.                             //添加到city下拉框中  
  143.                             areaSelectElement.appendChild(optionElement);  
  144.                         }  
  145.                     }  
  146.                 }  
  147.               };  
  148.         };  
  149.     </script>  
  150.       
  151.       
  152.       
  153.   </body>  
  154. </html>  

servlet代码:

[java]  view plain copy
  1. package kerwin.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import kerwin.bean.Area;  
  13. import kerwin.bean.City;  
  14. import kerwin.service.ProvinceCityAreaService;  
  15. import net.sf.json.JSONArray;  
  16. import net.sf.json.JsonConfig;  
  17.   
  18. public class ProvinceCityAreaServlet extends HttpServlet {  
  19.       
  20.     ProvinceCityAreaService service = new ProvinceCityAreaService();  
  21.       
  22.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  23.           
  24.         request.setCharacterEncoding("utf-8");  
  25.         String method = request.getParameter("method");  
  26.         if("provinceToCity".equals(method)){  
  27.             this.ProvinceToCity(request, response);  
  28.         }else if("cityToArea".equals(method)){  
  29.             this.cityToArea(request, response);  
  30.         }  
  31.           
  32.     }  
  33.   
  34.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  35.         doGet(request, response);  
  36.     }  
  37.       
  38.     public void ProvinceToCity(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  39.         response.setContentType("text/html; charset=utf-8");  
  40.         PrintWriter out = response.getWriter();  
  41.           
  42.         List<City> citys = null;  
  43.         //获取参数  
  44.         String pid = request.getParameter("provinceId");  
  45.         try {  
  46.               
  47.             citys = service.findAllCityByProvince(pid);   
  48.               
  49.             //使用第三方工具类,将对象转成JSON格式的字符串  
  50.             JsonConfig config = new JsonConfig();  
  51.             //去掉不需要的参数  
  52.             //config.setExcludes(new String[]{"id"});  
  53.             //将citys转换为json格式的字符串  
  54.             JSONArray jsonArray = JSONArray.fromObject(citys, config);  
  55.             String jsonJavaStr = jsonArray.toString();  
  56.               
  57.             //将字符串响应给ajax引擎  
  58.             out.write(jsonJavaStr);  
  59.               
  60.         } catch (Exception e) {  
  61.             e.printStackTrace();  
  62.         }  
  63.     }  
  64.       
  65.     public void cityToArea(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  66.         response.setContentType("text/html; charset=utf-8");  
  67.         PrintWriter out = response.getWriter();  
  68.           
  69.         List<Area> areas = null;  
  70.         //获取参数  
  71.         String cid = request.getParameter("cid");  
  72.         try {  
  73.               
  74.             areas = service.findAllAreaByProvince(cid);   
  75.               
  76.             //使用第三方工具类,将对象转成JSON格式的字符串  
  77.             JsonConfig config = new JsonConfig();  
  78.             //去掉不需要的参数  
  79.             config.setExcludes(new String[]{"id"});  
  80.             //将citys转换为json格式的字符串  
  81.             JSONArray jsonArray = JSONArray.fromObject(areas, config);  
  82.             String jsonJavaStr = jsonArray.toString();  
  83.               
  84.             //将字符串响应给ajax引擎  
  85.             out.write(jsonJavaStr);  
  86.               
  87.         } catch (Exception e) {  
  88.             e.printStackTrace();  
  89.         }  
  90.     }  
  91.   
  92. }  

service层代码:省略.....


DAO层代码:

[java]  view plain copy
  1. package kerwin.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.commons.dbutils.QueryRunner;  
  6. import org.apache.commons.dbutils.handlers.BeanListHandler;  
  7.   
  8. import kerwin.bean.Area;  
  9. import kerwin.bean.City;  
  10. import kerwin.utils.JdbcUtil;  
  11.   
  12. public class ProvinceCityAreaDao{  
  13.     public List<City> findAllCityByProvince(String pid)  throws Exception{  
  14.         List<City> citys = null;  
  15.         QueryRunner runner = new QueryRunner(JdbcUtil.dataSource);  
  16.           
  17.         String sql = "select * from citys where pid = ?";  
  18.         Object params[]={pid};  
  19.           
  20.         citys = runner.query(sql, new BeanListHandler<City>(City.class), params);  
  21.           
  22.         return citys;  
  23.           
  24.     }  
  25.       
  26.       
  27.     public List<Area> findAllAreaByProvince(String cid)  throws Exception{  
  28.         List<Area> areas = null;  
  29.         QueryRunner runner = new QueryRunner(JdbcUtil.dataSource);  
  30.           
  31.         String sql = "select * from area where cid = ?";  
  32.         Object params[]={cid};  
  33.           
  34.         areas = runner.query(sql, new BeanListHandler<Area>(Area.class), params);  
  35.           
  36.         return areas;  
  37.           
  38.     }  
  39.       
  40.       
  41. }  

还有三个province、city、area JavaBean类省略......


mysql连接使用c3p0连接池:

c3p0-config.xml:

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <c3p0-config>  
  3.     <default-config>  
  4.         <property name="driverClass">com.mysql.jdbc.Driver</property>  
  5.         <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/ajax</property>  
  6.         <property name="user">root</property>  
  7.         <property name="password">root</property>  
  8.         <property name="acquireIncrement">2</property>  
  9.         <property name="initialPoolSize">5</property>  
  10.         <property name="minPoolSize">1</property>  
  11.         <property name="maxPoolSize">5</property>  
  12.     </default-config>  
  13. </c3p0-config>  

JdbcUtil.java:

[java]  view plain copy
  1. package kerwin.utils;  
  2.   
  3. import com.mchange.v2.c3p0.ComboPooledDataSource;  
  4.   
  5. public class JdbcUtil {  
  6.     public static ComboPooledDataSource dataSource = new ComboPooledDataSource();  
  7.   
  8.     public static ComboPooledDataSource getDataSource() {  
  9.         return dataSource;  
  10.     }  
  11.       
  12. }  
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
QGS
|
7月前
|
XML 前端开发 JavaScript
手搭手Ajax经典基础案例省市联动
手搭手Ajax经典基础案例省市联动
QGS
18 1
|
2月前
|
前端开发 Java
layui结合ajax实现下拉联动效果
layui结合ajax实现下拉联动效果
29 0
|
2月前
|
前端开发 Java
layui结合ajax实现下拉菜单联动效果
layui结合ajax实现下拉菜单联动效果
23 0
|
前端开发
layui结合ajax实现下拉联动效果
layui结合ajax实现下拉联动效果
391 0
layui结合ajax实现下拉联动效果
|
前端开发
layui结合ajax实现下拉菜单联动效果
layui结合ajax实现下拉菜单联动效果
261 0
layui结合ajax实现下拉菜单联动效果
|
XML 前端开发 数据库
通过Ajax异步提交的方法实现从数据库获取省份和城市信息实现二级联动(xml方法)
之前有写过是从JavaScript数组里获取省市信息来实现二级联动,但是似乎有很多需求是要从数据库里获取信息,所以就需要根据异步提交,局部刷新的思想来实现来提高用户交互问题 第一种方法是xml方法 1.
1123 0
|
6月前
|
XML 前端开发 JavaScript
什么是Ajax和jquery
什么是Ajax和jquery
42 0
|
5月前
|
JSON 前端开发 Java
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
60 0
|
5月前
|
敏捷开发 JavaScript 前端开发
❤❤❤【Vue.js最新版】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本❤❤❤
❤❤❤【Vue.js最新版】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本❤❤❤
|
3月前
|
JavaScript 前端开发 Java
jquery ajax+spring mvc上传文件
jquery ajax+spring mvc上传文件