实现“省市县的联动”

news2025/2/27 8:24:02

分析:实现这一功能需要发送三次Ajax请求

        1.第一次请求:是页面加载完毕之后,发送一次Ajax请求,查询出所有的省级单位,将这些查询结果展示在<select>标签中。

        2.第二次请求:当所选省级单位发生变化的时候发送一次Ajax请求,查询出该省级单位下的所有市级单位;

        3.第三次请求:市级单位发生变化的时候再一次发送Ajax请求,查询出该市下所有的县级单位。

        在前端代码中,编写Ajax请求时,需要使用jQuery代码;在查询时需要使用JDBC技术,将Java对象转换成JSON需要使用fastjson

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>省市县联动</title>
    <script type="text/javascript" src="/ajax/js/jquery-3.6.0.min.js"></script>
    <script type="text/javascript">
        $(function () {
            //发送Ajax请求,查询省级部门
            $.ajax({
                type : "GET",
                url : "/ajax/request6",
                async : true,
                //这里没有发送数据,所以没写data : "t=" + new Data().getTime
                success : function(json){
                    var jsonObjList = JSON.parse(json);
                    var html = "<option value=\"\">--请选择省份--</option>";
                    for (var i = 0;i < jsonObjList.length; i ++){
                        var jsonObj = jsonObjList[i];
                        //以下两种拼串形式都正确,拼串不正确程序没有反应,谷歌浏览器按F12有提示信息
                        // html += "<option value=\""+ jsonObj.code +"\">"+ jsonObj.name +"</option>"
                        html += "<option value='"+ jsonObj.code +"'>"+ jsonObj.name +"</option>";
                    }
                    //将拼好的字符串以html代码的形式响应到<select id="province">标签之中
                    $("#province").html(html);
                }
            });
            //发送Ajax请求,查询市级部门
            //这里不能写成$("#province").change = function(){}
            //当<select id="province>标签的value值发生改变的时候,发送Ajax请求
            $("#province").change(function () {
                $.ajax({
                    type : "GET",
                    url : "/ajax/request6",
                    async : true,
                    //这里其他的数据需要发送就需要在后面&name=xxx&password=xxx
                    data : "pCode=" + this.value,
                    success : function (json){
                        var jsonObjList = JSON.parse(json);
                        var html = "<option value=\"\">--请选择市区--</option>";
                        for (var i = 0;i < jsonObjList.length; i ++){
                            var jsonObj = jsonObjList[i];
                            html += "<option value=\""+ jsonObj.code +"\">"+ jsonObj.name +"</option>"
                        }
                        //将拼好的字符串以html代码的形式响应到<select id="city">标签之中
                        $("#city").html(html);
                    }
                })
            });
            //发送Ajax请求,查询县级部门
            //当<select id="city>标签的value值发生改变的时候,发送Ajax请求
            $("#city").change(function () {
                $.ajax({
                    type : "GET",
                    url : "/ajax/request6",
                    data : "pCode=" + this.value,
                    async : true,
                    success :function (json) {
                        var jsonObjList = JSON.parse(json);
                        var html = "<option value=\"\">--请选择县区--</option>";
                        for (var i = 0;i < jsonObjList.length; i ++){
                            var jsonObj = jsonObjList[i];
                            html += "<option value='"+ jsonObj.code +"'>"+ jsonObj.name +"</option>"
                        }
                        //将拼好的字符串以html代码的形式响应到<select id="county">标签之中
                        $("#county").html(html);
                    }
                })
            });
        })
    </script>
</head>
<body bgcolor="#faebd7">
    <!--  省级标签  -->
    <select id="province">
    <!--    <option value="">&#45;&#45;请选择省份&#45;&#45;</option>-->
    <!--    <option value="001">河北省</option>-->
    <!--    <option value="002">河南省</option>-->
    <!--    <option value="003">北京市</option>-->
    </select>
    <!--  市级标签  -->
    <select id="city">

    </select>
    <!--  县级标签  -->
    <select id="county">

    </select>
</body>
</html>

服务端代码:

package com.yjg.ajax.servlet;

import com.alibaba.fastjson.JSON;
import com.yjg.ajax.bean.Pac;
import com.yjg.ajax.util.DBUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/request6")
public class AjaxRequest6Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //接收参数,前端没有传递参数的时候,接收结果是null
        String pCode = request.getParameter("pCode");
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<Pac> pacArrayList = new ArrayList<>();
        String sql = null;
        try {
            conn = DBUtil.getConnection();
            //如果前端没有传递参数,执行查询省级部门的sql语句
            if (pCode == null){
                sql = "select code,name from pac where pcode is null";
                ps = conn.prepareStatement(sql);
            //如果前端传递了参数,执行查询市级部门的sql语句
            }else {
                sql = "select code,name from pac where pcode = ?";
                ps = conn.prepareStatement(sql);
                ps.setString(1,pCode);
            }
            //执行查询语句
            rs = ps.executeQuery();
            //处理查询结果集
            while (rs.next()) {
                String code = rs.getString("code");
                String name = rs.getString("name");
                //通过查询结果,创建Java对象
                Pac pac = new Pac(code,name);
                //将Java对象添加到List集合中
                pacArrayList.add(pac);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,ps,rs);
        }
        //将List集合变成JSON格式的字符串
        String jsonString = JSON.toJSONString(pacArrayList);
        //设置响应内容类型和字符集
        response.setContentType("text/html;charset=UTF-8");
        //将JSON格式的字符串响应给浏览器
        response.getWriter().print(jsonString);
    }
}
 

数据库表:(表名:pac)

 程序中使用了工具类:DBUtil.java

package com.yjg.ajax.util;

import java.sql.*;
import java.util.ResourceBundle;

public class DBUtil {
    //私有的构造方法
    private DBUtil(){}

    //类加载时绑定属性资源文件(静态变量和静态代码块的执行时间一样,都是在类加载的时候执行,这时就看代码的先后顺序了,谁在前谁先执行)
    private static ResourceBundle bundle = ResourceBundle.getBundle("resources/db");

    static {
        try {
            Class.forName(bundle.getString("driver"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接对象   (以后在实际开发中只要调用该方法就会完成注册驱动和获取连接两步)
     * @return 新的连接对象
     * @throws SQLException 这里选择上抛异常,由使用者捕捉。
     */
    public static Connection getConnection() throws SQLException {
        String url = bundle.getString("url");
        String user = bundle.getString("user");
        String password = bundle.getString("password");
        Connection conn = DriverManager.getConnection(url,user,password);
        return conn;
    }

    /**
     * 释放资源
     * @param conn 连接对象
     * @param stmt 数据库操作对象 这里最好写Statement,而不写PreparedStatement,
     *             原因是今后可以使用多态,既可以传一个父类对象,也可以传入子类对象。
     * @param rs 查询结果集
     */
    public static void close(Connection conn, Statement stmt, ResultSet rs){
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

属性资源配置文件:

#############   mysql connectivity configuration   ###############
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=XXXXXX

创建了实体类:Pac.java

package com.yjg.ajax.bean;
//省市实体类
public class Pac {
    private String code;
    private String name;

    public Pac() {
    }

    public Pac(String code, String name) {
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Pac{" +
                "code='" + code + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}


程序运行之后浏览器显示如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java工程构建时带上分支,commit等信息

背景&#xff1a; 线上部署的jar包&#xff08;不管是直接运行jar包&#xff0c;还是通过容器运行的jar&#xff09;有时出现问题时需要查看源代码&#xff0c;需要知道该jar包是从哪个分支、哪个commit、哪个时间打包的。 有了这些信息能更好辅助我们分析判断问题。 这里以gr…

【.NET基础加强第九课--事件】

.NET基础加强第九课--事件 Event 关键字委托,事件对比举例: 音乐播放事件用户对象&#xff0c;登录程序集反射 Event 关键字 委托,事件对比 委托是一种数据类型&#xff0c;可以用调用。 事件:对象&#xff08;对委托的一种封闭装&#xff09;。只能在类内部&#xff0c;只能…

基于Java的企业员工管理系统的设计与实现(论文+源码)_kaic

基于Java的企业员工管理系统的设计与实现 摘 要 随着电子信息的飞速发展&#xff0c;计算机已经融入到了生活的各个方面&#xff0c;越来越多的企业开始使用电子计算机来对企业进行管理&#xff0c;信息化的时代已经到来&#xff0c;各个企业无论大小都需要一个信息化的管理系…

模拟实现qsort函数(采用冒泡排序的方式)

前言&#xff1a; 之前我在C语言&#xff1a;指针详解【进阶】后篇中提到了qsort函数,qsort函数作为一个库函数&#xff0c;在我们日常的代码编写中可能会用到&#xff0c;在上面提到的文章中我们也进行使用了这个函数&#xff0c;大家也了解了一些这个函数的使用方法&#xff…

English Learning - L3 作业打卡 Lesson1 Day4 2023.5.8 周一

English Learning - L3 作业打卡 Lesson1 Day4 2023.5.8 周一 引言&#x1f349;句1: They may say they are red hot about something unfair.成分划分弱读连读爆破语调 &#x1f349;句2: When they are red hot, they are very angry about something.成分划分弱读连读爆破语…

【Ansys】mechanical和fluent求解器中使用的迭代方法-待补充

一、mechanical求解器 这个求解器&#xff0c;在网上很容易查到&#xff0c;迭代求解时用的就是牛顿-拉夫逊方法&#xff08;Newton-Raphson&#xff09;。 这是因为牛顿法求解非线性问题非常优秀。 而mechanical使用这个方法就能实现对几何非线性、材料非线性、接触非线性、…

Java入门和背景知识

文章目录 &#x1f525;常见编程语言介绍&#x1f525;Java 发展史&#x1f525;Java 的核心优势&#x1f525;Java 各版本的含义&#x1f525;Java 的特性和优势&#x1f525;Java 运行机制&#x1f525;JVM、JRE 和 JDK&#x1f525;Java 开发环境搭建&#x1f525;openJDK 和…

网络购物商场系统的设计与实现(论文+源码)_kaic

网络购物商场系统 摘 要 近年来&#xff0c;随着网络购物的兴起和普及&#xff0c;针对该市场需求开发一款在线购物系统是大势所趋。和实体店对比&#xff0c;在线购物系统商品种类齐全&#xff0c;价格优惠、还能够送货上门等优势。在此类系统中&#xff0c;用户能够在网上…

潍坊这一城市商业综合体有奖征名

云创金谷项目商业购物中心名称及IP形象征集开始啦&#xff01;&#xff01;你有什么好想法&#xff1f;快来参与吧&#xff01;&#xff01; 云创金谷&#xff0c;是奎文区重点打造的城市更新代表力作&#xff0c;位于文化路以东、新华路以西&#xff0c;北宫街以北、卧龙东街以…

如何在vue中使用dayjs修改日历组件的星期名称

在vue中使用日历组件Calendar时&#xff0c;头部的星期默认展示为[日, 一, 二, 三, 四, 五, 六]&#xff0c;如下图所示。 如何改变头部的星期展示呢&#xff0c;可以通过以下方法实现&#xff1a; const weekdaysShort [周日, 周一, 周二, 周三, 周四, 周五, 周六]; dayjs.l…

每日学术速递5.10

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.ZipIt! Merging Models from Different Tasks without Training 标题&#xff1a;压缩它&#xff01;无需训练即可合并来自不同任务的模型 作者&#xff1a;George Stoica, Danie…

MLF(中期借贷便利)[Medium-term lending facility],俗称麻辣粉

MLF麻辣粉是什么&#xff1f;简述MLF的作用以及对股市的影响&#xff01;_哔哩哔哩_bilibili 简述 中期借贷便利&#xff08;Medium-term lending facility&#xff0c;简称MLF&#xff09;是中国人民银行提供给商业银行的一种货币政策工具&#xff0c;能够向商业银行提供一…

BFT 最前线 | 谷歌举办 I/O 23 发布会,对标必应,百度搜索小范围公测对话功能,盖茨称AI利大于弊

文 | BFT机器人 01 谷歌举办 I/O 23 发布会&#xff0c;以 AI 为核心发布一系列新工具 北京时间 5 月 11 日凌晨&#xff0c;谷歌举办了今年的 Google I/O 开发者大会。比起去年&#xff0c;强调「整合全球信息&#xff0c;使人人都能从访问中受益」的使命&#xff0c;谷歌 CEO…

xxl-job2.1.2定时任务使用教程

一、配置xxl-job页面调度器 1.先下载2.1.2版本xxl-job的源码&#xff0c;地址&#xff1a;https://github.com/xuxueli/xxl-job/tree/2.1.2 2.下载完&#xff0c;用idea打开&#xff0c;配置jdk1.8、配置maven&#xff0c; 3.导入MySQL数据库xxl-job的一些表&#xff0c;导入的…

点餐小程序实战教程02-店铺数据源设计

我们上一篇分析了点餐小程序的功能点,有了功能就好往下开发了。低代码开发是模型驱动开发,啥是模型驱动呢?就是要求你先设计好表结构,然后再开发页面。 那要如何设计数据源呢?其实就是将信息分门别类的拆分到不同的数据源中。要拆分到哪些数据源是由我们页面上的信息决定…

真题详解(索引查询)-软件设计(七十三)

外观、装饰、策略模式代码详解-软件设计&#xff08;七十二)https://blog.csdn.net/ke1ying/article/details/130628033 关于一个类的静态成员描述中&#xff0c;不正确的是&#xff1a; 错误&#xff1a;一个类的静态数据成员值不可以被修改。 java语言特性是有________和 垃…

django基础知识详解

1. 安装与介绍 课程特点&#xff1a; 学习难度大&#xff0c;大部分内容需要理解并记忆文件较多易混淆学习阶段注重框架使用&#xff0c;工作阶段注重实现业务逻辑综合应用强&#xff0c;小练习少 1.1 Django框架的介绍 2005年发布,采用Python语言编写的开源web框架早期的时…

JVM垃圾收集器(二)

目录 1、Serial 2、ParNew 3、Parallel Scavenge 4、Serial Old 5、Parallel Old 6、CMS 1、为什么需要两次“stop the world” 2、CMS的并发带来的问题 3、CMS的触发时机 4、CMS的缺陷 5、为什么CMS用清除算法 7、G1 1、Region 2、设计Region的意义 3、G1的三种…

【C++】——类与对象(中)+日期类对象的实现

文章目录 1. 前言2. 类的6个默认成员函数3. 构造函数4. 析构函数5. 拷贝构造函数6. 运算符重载6.1 赋值运算符重载 7. const成员8. 取地址及const取地址操作符重载9. 日期类对象的完整实现9.1 头文件9.2 源文件9.3 测试代码 10. 结尾 1. 前言 今天我们来继续学习C类与对象&…

网安学习路线!史上最详细没有之一

我经常会看到这一类的问题&#xff1a; 学习XXX知识没效果&#xff1b;学习XXX技能没方向&#xff1b;学习XXX没办法入门&#xff1b; 给大家一个忠告&#xff0c;如果你完全没有基础的话&#xff0c;前期最好不要盲目去找资料学习&#xff0c;因为大部分人把资料收集好之后&…