Ajax实现省市级联案例

原生JS使用Ajax实现级联

  • Maven的pom文件
    <dependencies>
            <!--jquery-->
            <dependency>
                <groupId>org.webjars</groupId>
                <artifactId>jquery</artifactId>
                <version>3.1.1</version>
            </dependency>
    
            <!--jackson-->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.9.6</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.9.6</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.9.6</version>
            </dependency>
    
            <!--Dbutils工具-->
            <dependency>
                <groupId>commons-dbutils</groupId>
                <artifactId>commons-dbutils</artifactId>
                <version>1.7</version>
                <scope>compile</scope>
            </dependency>
    
            <!--数据库驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.19</version>
            </dependency>
    
            <!--数据库连接池-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.8</version>
            </dependency>
    		
    		<!--servlet-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>
    </dependencies>
  • Druid连接池的配置文件
    url=jdbc:mysql://localhost:3306/city?
    	serverTimezone=GMT&useSSL=false&characterEncoding=utf-8
    #这个可以缺省的,会根据url自动识别
    driverClassName=com.mysql.cj.jdbc.Driver
    username=root
    password=123765
    
    ##初始连接数,默认0
    initialSize=10
    #最大连接数,默认8
    maxActive=30
    #最小闲置数
    minIdle=10
    #获取连接的最大等待时间,单位毫秒
    maxWait=2000
    #缓存PreparedStatement,默认false
    poolPreparedStatements=true
    #缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存
    	PreparedStatement,所以可以省略上一句设置
    maxOpenPreparedStatements=20
  • Linkage
    public class Linkage {
        private Integer id;
        private String name;
    
        public Linkage() {
        }
        ...略略略
    }
  • LinkageServlet
    @WebServlet("/linkage")
    public class LinkageServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        	throws ServletException, IOException {
            Properties properties = new Properties();
            InputStream stream = LinkageServlet.class.getClassLoader().
            	getResourceAsStream("/druid.properties");
            properties.load(stream);
            try {
                DataSource dataSource = 
                	DruidDataSourceFactory.createDataSource(properties);
                //Druid工具
                QueryRunner queryRunner = new QueryRunner(dataSource);
                String pid = req.getParameter("pid");
                String sql;
                ObjectMapper mapper = new ObjectMapper();
                if (pid==null){
                    sql="select id,name from province";
                    List<Linkage> provincesList = queryRunner.query(sql, 
                    	new BeanListHandler<Linkage>(Linkage.class));
                    HashMap<String, Object> map = new HashMap<>();
                    map.put("data",provincesList);
                    map.put("result","成功");
                    String s = mapper.writeValueAsString(map);
                    System.out.println(s);
                    resp.setContentType("application/json;charset=utf-8");
                    resp.getWriter().write(s);
    
                }else {
                    sql="select id,name from town where p_id="+pid;
                    System.out.println("pid:"+pid);
                    List<Linkage> cityList = queryRunner.query(sql, 
                    	new BeanListHandler<Linkage>(Linkage.class));
                    Map<String,Object> map = new HashMap<>();
                    map.put("data",cityList);
                    resp.setContentType("application/json;charset=utf-8");
                    resp.getWriter().write(mapper.writeValueAsString(map));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  • index.jsp(与Jquery的不同处)
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>省市联动</title>
    </head>
    <body>
        <select id="province"></select>
        <span id="city"></span>
        <script>
            //js程序入口
            window.onload=function () {
                //ajax请求省份信息
                ajax.get("http://localhost:8080/AJAXDemo/linkage",findProvince);
                let province = document.getElementById("province");
                province.onchange=function () {
                    alert(province.value)
                    //当select被选中时,获取其值,并使用ajax请求获取城市信息
                    ajax.get("http://localhost:8080/AJAXDemo/linkage" +
                        "?_="+new Date().getTime()+"&pid="+
                             province.value,findCity);
                }
            }
    
            //自定义的ajax对象,封装了get请求
            var ajax={
                get:function (url,callback) {
                    let xmlHttpRequest
                    //如果是IE5,IE6则通过new ActiveXObject创建xmlHttpRequest对象
                    if (window.XMLHttpRequest){
                        xmlHttpRequest = new XMLHttpRequest();
                    }else {
                        xmlHttpRequest=new ActiveXObject("Microsoft.XMLHTTP")
                    }
                    xmlHttpRequest.onreadystatechange=function () {
                        if (xmlHttpRequest.readyState==4
                            &&xmlHttpRequest.status==200){
                            callback(JSON.parse(xmlHttpRequest.responseText))
                        }
                    }
                    xmlHttpRequest.open("GET",url,true)
                    xmlHttpRequest.send()
                }
            }
    
            //省份的回调函数
            function findProvince(object) {
                let province = document.getElementById("province");
                let option = document.createElement("option");
                option.innerText="请选择省份"
                province.appendChild(option)
                for(var s of object.data){
                    let option = document.createElement("option");
                    option.value=s.id;
                    option.innerText=s.name;
                    province.appendChild(option)
                }
            }
    
            //城市的回调函数
            function findCity(object) {
                let city = document.getElementById("city");
                let select = document.createElement("select");
                let option = document.createElement("option");
                option.innerText="请选择地级市"
                select.appendChild(option)
                for(var s of object.data){
                    let option = document.createElement("option");
                    option.value=s.id;
                    option.innerText=s.name;
                    select.appendChild(option)
                }
                city.appendChild(select)
            }
        </script>
    </body>
    </html>

Jquery使用Ajax实现级联

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jquery的ajax技术实现省市联动</title>
</head>
<body>
    <select id="sel"></select>
    <script src="webjars/jquery/3.1.1/jquery.min.js"></script>
    <script>
        $(function() {
            $.get("http://localhost:8080/AJAXDemo/linkage",function (obj) {
                let arr = obj.data;
                $("#sel").append("<option>请选择省份</option>")
                for (var o of arr){
                    let option = $("<option></option>")
                    option.html(o.name)
                    option.attr("id",o.id)
                    $("#sel").append(option)
                }
            })
            $("#sel").change(function () {
                //查找select中被选中项的id
                let id = $("#sel").find("option:selected").attr("id")
                $.get("http://localhost:8080/AJAXDemo/linkage",{"pid":id},
                function (obj) {
                    let select = $("<select></select>");
                    let arr = obj.data;
                    select.append("<option>请选择城市</option>")
                    for (var o of arr){
                        let option = $("<option></option>");
                        option.attr("id",o.id)
                        option.html(o.name)
                        select.append(option)
                    }
                    $("body").append(select)
                })
            })
        })
    </script>
</body>
</html>
  • 注意:在Maven中使用Jquery需要配置一下,大神文章
    • 设置仓库
    • 在resource目录下创建webjars,不存放任何东西
    • 在html中插入:<script src="webjars/jquery/3.1.1/jquery.min.js"></script>