json的省市联动

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 3 <html>
 4 <head>
 5     <title>Title</title>
 6     <script type="text/javascript">
 7         /*
 8         * 1、在文档加载完成后
 9         *   获取所有省,添加到<select id="province">中
10         *   给<select id="province">这个元素添加onchange事件
11         * 事件内容:
12         *   1、获取当前选择的省id
13         *   2、使用省id访问servlet,得到该省下所有市
14         *   3、把每个市添加到<select id="city">中
15         * */
16         function createXMLHttpRequest() {
17             try {
18                 return new XMLHttpRequest();
19             }catch (e) {
20                 try {
21                     return new ActiveXObject("Msxml2.XMLHTTP");
22                 } catch (e) {
23                     return new ActiveXObject("Micorsoft.XMLHTTP");
24                 }
25             }
26         }
27         window.onload = function () {
28             /*
29             * 发送异步请求,得到所有省,然后使用每个省生成一个<option>元素添加到<select id="province">中
30             * */
31             var xmlHttp = createXMLHttpRequest();
32             xmlHttp.open("GET","<c:url value='/ProvinceServlet'/>",true);//打开连接
33             xmlHttp.send(null);//发送
34             xmlHttp.onreadystatechange = function () {//添加监听
35                 if (xmlHttp.readyState == 4 ) {
36                     if (xmlHttp.status == 200) {
37                         var proArray = eval("("+xmlHttp.responseText+")");//执行服务器发送过来的json字符串,得到json的对象
38                         for (var i = 0; i<proArray.length; i++) {
39                             var pro = proArray[i];//得到每个pro对象
40                             var optionEle = document.createElement("option");//创建<option>元素
41                             optionEle.value = pro.pid;//<option>的实际值赋为pid,而不是name
42                             var textNode = document.createTextNode(pro.name);//使用省名称来创建textNode
43                             optionEle.appendChild(textNode);//把textNode添加到option元素中
44                             document.getElementById("province").appendChild(optionEle);//把option元素添加到select元素中
45                         }
46                     }
47                 }
48             };
49             //2、给<select id="province">添加change监听
50             document.getElementById("province").onchange = function () {
51                 var xmlHttp = createXMLHttpRequest();//异步请求服务器,得到选择的省下的所有市
52                 xmlHttp.open("POST", "<c:url value='/CityServlet'/>", true);//打开连接
53                 xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //设置请求头
54                 xmlHttp.send("pid="+this.value);//发送,用户选择的省
55                 xmlHttp.onreadystatechange = function () {//添加监听
56                     if (xmlHttp.readyState == 4) {
57                         if (xmlHttp.status == 200) {
58                             /*
59                             * 0、先清空原来的<option>元素
60                             * 1、得到服务器发送过来的所有市
61                             * 2、使用每个市生成<option>元素添加到<select id="city">中
62                             * */
63                             //清空<select id="city">中的选项
64                             var citySelect = document.getElementById("city");
65                             var cityOptionArray = citySelect.getElementsByTagName("option");//获取select中的所有子元素
66                             while (cityOptionArray.length >1) {
67                                 citySelect.removeChild(cityOptionArray[1]);
68                             }
69                             var cityArray = eval("("+xmlHttp.responseText+")");//得到服务器发送过来的所有市
70                             for (var i = 0; i<cityArray.length; i++) {
71                                 var  city= cityArray[i];//得到每个city对象
72                                 var optionEle = document.createElement("option"); //创建<option>元素
73                                 optionEle.value = city.cid;//<option>的实际值赋为pid,而不是name
74                                 var textNode = document.createTextNode(city.name);//使用城市名称来创建textNode
75                                 optionEle.appendChild(textNode);//把textNode添加到option元素中
76                                 citySelect.appendChild(optionEle);//把option元素添加到select元素中
77                             }
78                         }
79                     }
80                 };
81             };
82         };
83     </script>
84 </head>
85 <body>
86 <h1>省市联动</h1>
87 <select name="province" id="province">
88     <option value="">===请选择省份===</option>
89 </select>
90 <select name="city" id="city">
91     <option value="">===请选择城市===</option>
92 </select>
93 </body>
94 </html>
 1 package web.servlet;
 2 
 3 import dao.Dao;
 4 import domain.Province;
 5 import net.sf.json.JSONArray;
 6 import javax.servlet.ServletException;
 7 import javax.servlet.annotation.WebServlet;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.IOException;
12 import java.util.List;
13 
14 @WebServlet(name = "ProvinceServlet",urlPatterns = "/ProvinceServlet")
15 public class ProvinceServlet extends HttpServlet {
16     protected void doGet(HttpServletRequest request, HttpServletResponse response)
17             throws ServletException, IOException {
18         response.setContentType("text/html;charset=utf-8");
19         /*
20         * 1、通过dao得到所有的省
21         * 2、把List<Province>转换成json
22         * 3、发送给客户端
23         * */
24         Dao dao = new Dao();
25         List<Province> provinces = dao.findAllProvince();
26         String json = JSONArray.fromObject(provinces).toString();
27         response.getWriter().print(json);
28     }
29 }
 1 package web.servlet;
 2 
 3 import dao.Dao;
 4 import domain.City;
 5 import net.sf.json.JSONArray;
 6 import javax.servlet.ServletException;
 7 import javax.servlet.annotation.WebServlet;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.IOException;
12 import java.util.List;
13 
14 @WebServlet(name = "CityServlet",urlPatterns = "/CityServlet")
15 public class CityServlet extends HttpServlet {
16     protected void doPost(HttpServletRequest request, HttpServletResponse response)
17             throws ServletException, IOException {
18         request.setCharacterEncoding("utf-8");
19         response.setContentType("text/html;charset=utf-8");
20         /*
21         * 1、获取名为pid的参数
22         * 2、使用这个省的id查询数据库,得到List<City>
23         * 3、转换成json,转发给客户端
24         * */
25         int pid = Integer.parseInt(request.getParameter("pid"));
26         Dao dao = new Dao();
27         List<City> cityList = dao.findByProvince(pid);
28         String json = JSONArray.fromObject(cityList).toString();
29         response.getWriter().print(json);
30     }
31 }
 1 package domain;
 2 
 3 public class City {
 4     private int cid;
 5     private String name;
 6     private Province province;//多方关联一方
 7 
 8     public int getCid() {
 9         return cid;
10     }
11     public void setCid(int cid) {
12         this.cid = cid;
13     }
14     public String getName() {
15         return name;
16     }
17     public void setName(String name) {
18         this.name = name;
19     }
20     public Province getProvince() {
21         return province;
22     }
23     public void setProvince(Province province) {
24         this.province = province;
25     }
26     @Override
27     public String toString() {
28         return "City{" + "cid=" + cid + ", name='" + name + '\'' + ", province=" + province + '}';
29     }
30 }
 1 package domain;
 2 
 3 import java.util.List;
 4 
 5 public class Province {
 6     private int pid;
 7     private String name;
 8     private List<City> cityList;//一方关联多方
 9 
10     public int getPid() {
11         return pid;
12     }
13     public void setPid(int pid) {
14         this.pid = pid;
15     }
16     public String getName() {
17         return name;
18     }
19     public void setName(String name) {
20         this.name = name;
21     }
22     public List<City> getCityList() {
23         return cityList;
24     }
25     public void setCityList(List<City> cityList) {
26         this.cityList = cityList;
27     }
28     @Override
29     public String toString() {
30         return "Province{" + "pid=" + pid + ", name='" + name + '\'' + ", cityList=" + cityList + '}';
31     }
32 }
 1 package dao;
 2 
 3 import cn.itcast.jdbc.TxQueryRunner;
 4 import domain.City;
 5 import domain.Province;
 6 import org.apache.commons.dbutils.QueryRunner;
 7 import org.apache.commons.dbutils.handlers.BeanListHandler;
 8 import java.sql.SQLException;
 9 import java.util.List;
10 
11 public class Dao {
12     private QueryRunner qr = new TxQueryRunner();
13     //查询所有的省
14     public List<Province> findAllProvince() {
15         try {
16             String sql = "SELECT * FROM t_province";
17             return qr.query(sql,new BeanListHandler<Province>(Province.class));
18         } catch (SQLException e) {
19             throw new RuntimeException(e);
20         }
21     }
22     //查询指定省下的所有市
23     public List<City> findByProvince(int pid) {
24         try {
25             String sql = "SELECT * FROM t_city WHERE pid=?";
26             return qr.query(sql,new BeanListHandler<City>(City.class),pid);
27         } catch (SQLException e) {
28             throw new RuntimeException(e);
29         }
30     }
31 }

 

posted @ 2018-01-04 11:06  gdwkong  阅读(1280)  评论(0编辑  收藏  举报