当前位置:首页 > JavaScript > 正文内容

AJAX省市县三级联动的实现

flowstone8年前 (2017-09-14)JavaScript504

省市县数据

本例子中省市县数据保存在MySQL数据库中,部分数据截图如下:

省市县数据

从数据库中读取数据

1、导入需要的jar包

所需jar包

2、连接池配置文件

<c3p0-config>
    <!-- 默认配置,如果没有指定则使用这个配置 -->
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test</property>
        <property name="user">root</property>
        <property name="password">数据库密码</property>
        <property name="checkoutTimeout">30000</property>
        <property name="idleConnectionTestPeriod">30</property>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
        <user-overrides user="test-user">
            <property name="maxPoolSize">10</property>
            <property name="minPoolSize">1</property>
            <property name="maxStatements">0</property>
        </user-overrides>
    </default-config>
</c3p0-config>

3、JDBCUtils工具类文件

通用JDBCUtils工具类文件,使用时直接引入

package org.xueyao.ajax.utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import org.apache.tomcat.jni.Thread;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtils {

    private static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();

    //使用ThreadLocal存取删链接对象
    private static ThreadLocal<Connection> local = new ThreadLocal<>();


    public static Connection getConnection() throws SQLException{
        return comboPooledDataSource.getConnection();
    }

    public static DataSource getDataSource(){
        return comboPooledDataSource;
    }
    //从ThreadLocal获取链接的方法
    public static Connection getCurrentConnection() throws SQLException{
        //先从ThreadLocal获取中
        Connection connection = local.get();
        if(connection != null){
            System.out.println("从local获取数据:"+connection);
            return connection;
        }else{
            //如果没有,在从链接池获取,存入ThreadLocal中
            Connection conn = comboPooledDataSource.getConnection();
            System.out.println("从连接池获取数据:"+conn);
            local.set(conn);
            return conn;
        }
    }
    //开启事务的方法
    public static void startTransaction() throws SQLException{
        Connection connection = getCurrentConnection();
        System.out.println(connection);
        connection.setAutoCommit(false);
    }
    //提交事务的方法
    public static void commit() throws SQLException{
        Connection connection = getCurrentConnection();
        System.out.println(connection);
        connection.commit();
    }

    //回滚事务的方法
    public static void rollback() throws SQLException{
        Connection connection = getCurrentConnection();
        System.out.println(connection);
        connection.rollback();
    }

    //释放资源的方法
    public static void close() throws SQLException{
        Connection connection = getCurrentConnection();
        System.out.println(connection);
        local.remove();
        connection.close();
    }

}


4、创建JavaBean文件

package org.xueyao.ajax.domain;
public class Province {
    private int codeid;
    private int parentid;
    private String cityName;
    public int getCodeid() {
        return codeid;
    }
    public void setCodeid(int codeid) {
        this.codeid = codeid;
    }
    public int getParentid() {
        return parentid;
    }
    public void setParentid(int parentid) {
        this.parentid = parentid;
    }
    public String getCityName() {
        return cityName;
    }
    public void setCityName(String cityName) {
        this.cityName = cityName;
    }
    @Override
    public String toString() {
        return "Province [codeid=" + codeid + ", parentid=" + parentid
                + ", cityName=" + cityName + "]";
    }
}


5、创建Servlet文件,获取省市县数据

package org.xueyao.ajax.linkage;
import java.io.IOException;
import java.sql.SQLException;
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.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.xueyao.ajax.domain.Province;
import org.xueyao.ajax.utils.JDBCUtils;
import flexjson.JSONSerializer;
public class GetDataServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        int parentid = Integer.parseInt(request.getParameter("parentid"));
        String sql = "SELECT * FROM province WHERE parentid=?";
        QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
        try {
            List<Province> list = qr.query(sql, new BeanListHandler<Province>(Province.class), parentid);
            //System.out.println(list);

            //将list集合转换成json格式字符串
            JSONSerializer jsonSerializer = new JSONSerializer();
            String serialize = jsonSerializer.serialize(list);
            //System.out.println(serialize);

            //向页面输入字符串数据
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write(serialize);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}



6、从页面显示三级联动

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="root" value="${pageContext.request.contextPath }"></c:set>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>省市县页面</title>
<script type="text/javascript" src="js/jquery-1.8.3.js"></script>
<script type="text/javascript">
$(function() {
    //获得三个下拉菜单元素
    var $pro = $("#province");
    var $city = $("#city");
    var $area = $("#area");

    $.get(
        "${root}/getData?parentid=0",
        function(data) {
            //alert(data);
            //遍历数据
            $(data).each(function(){
                //创建option标签,并追加到省级菜单中
                $pro.append("<option value='"+this.codeid+"'>"+this.cityName+"</option>");
            }); 
        },"json");
    //省级菜单选择事件
    $pro.change(function(){
        //清空市县菜单中数据,保留第一个属性
        $city.prop("length",1);
        $area.prop("length",1);
        $.get(
            "${root}/getData?parentid="+this.value,
            function(data) {
                $(data).each(function() {
                    $city.append("<option value='"+this.codeid+"'>"+this.cityName+"</option>");
                });
            },"json");
    });
    //市级菜单选择事件
    $city.change(function(){
        //清空县菜单中数据,保留第一个属性
        $area.prop("length",1);
        $.get(
                "${root}/getData?parentid="+this.value,
                function(data) {
                    $(data).each(function(){
                        $area.append("<option value='"+this.codeid+"'>"+this.cityName+"</option>");
                    });
                },"json");              
    });

});
</script>
</head>
<body>
    <center>
        <select id="province" name="province">
            <option value="none">--请选择省--</option>
        </select>
        <select id="city" name="city">
            <option value="none">--请选择市--</option>
        </select>
        <select id="area" name="area">
            <option value="none">--请选择县--</option>
        </select>
    </center>
</body>
</html>


上面的javascript代码可以优化成这样

function loadData(value, ele){
    $.get(
            "${root}/getData?parentid="+value,
            function(data) {
                //遍历数据
                $(data).each(function(){
                    //创建option标签,追加到菜单中
                    ele.append("<option value='"+this.codeid+"'>"+this.cityName+"</option>");
                }); 
            },"json");
}
$(function() {
    var $pro = $("#province");
    //加载省和直辖市数据
    loadData(0,$pro);
    //加载市
    $("#city,#area").change(function () {
        // 清空原来的数据
        $(this).nextAll().prop("length",1);
        loadData(this.value, $(this).next());
    });

});

效果图如下:

ajax三级联动效果图

代码托管于GitHub


扫描二维码推送至手机访问。

版权声明:本文由薛尧的博客发布,如需转载请注明出处。

本文链接:https://flowstone.sourceforge.io/?id=16

分享给朋友:

相关文章

React Ant框架中分页的快速使用

使用环境ReactAnt DesignSpringBootSpring Data JPA前端页面首先,我们要查看Ant官方文档,一般涉及到分页的页面都是列表查询,在表格组件中找到API,可以从API中看到使用方法,查看文档后,编写代码如下&...

React中useState如何给对象中的某一个属性赋值

问题描述在React文件中使用了useState,定义了查询条件,这个查询条件实际上是一个对象,如下所示const [requestParam, setRequestParam] = useState...

JS中绑定方法加括号和不加括号的区别

问题描述在React开发中,遇到一个页面不停调用接口问题,如下图所示 问题解决查找哪里调用了接口,最后在刷新按钮上找到了问题所在,如下所示<Button     type="...

React中如何实现文件上传功能

场景描述在前端页面中,经常会使用到文件上传功能,我们如何实现上传功能呢?开发环境React ^16.12.0Ant Design ^5.0.12SpringBoot 2.3.0页面实现文件上传首先我们要用到Ant框架中自带的上传组件Uplo...

React中如何实现文件下载功能

场景描述在前端页面中,经常会使用到文件下载功能,我们如何实现下载功能呢?开发环境React ^16.12.0Ant Design ^5.0.12SpringBoot 2.3.0问题分析首先,想到下载,肯定要涉及文件流(字节流),后端接口返回...

Ant Design中使用Upload上传组件如何自定义文件列表展示位置

软件环境macOS Big Sur 11.1React 16.12.0Ant Design 4.10.0实际效果现有一个需求,是上传文件,点击浏览文件按钮,选中文件后,在按钮的上方显示,上传的文件列表,如下图所示 当前效果目前使用...