Web前端-jQuery实现Ajax实例-级联查询

1.需求

页面加载出来时,需要在第一个下拉列表中显示所有省份名称。

当用户选择其中一个省份,在第二个下拉列表中显示该省份所有的城市。

2.准备工作

2.1创建数据库与数据表

2.1.1创建数据库【db_ajax】
create database db_ajax;
2.1.2创建省份信息表【province】
SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `province`;
CREATE TABLE `province` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) DEFAULT NULL COMMENT '省份名称',
    `simpleName` varchar(255) DEFAULT NULL COMMENT '简称',
    `proCap` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

INSERT INTO `province` VALUES ('1', '河北', '冀', '石家庄');
INSERT INTO `province` VALUES ('2', '山西', '晋', '太原市');
INSERT INTO `province` VALUES ('3', '内蒙古', '蒙', '呼和浩特市	');
INSERT INTO `province` VALUES ('4', '辽宁', '辽', '沈阳');
INSERT INTO `province` VALUES ('5', '江苏', '苏', '南京');
INSERT INTO `province` VALUES ('6', '浙江', '浙', '杭州');
INSERT INTO `province` VALUES ('7', '安徽', '皖', '合肥');
INSERT INTO `province` VALUES ('8', '福建', '闽', '福州');
INSERT INTO `province` VALUES ('9', '江西', '赣', '南昌');

2.1.3创建城市信息表【city】
SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `city`;
CREATE TABLE `city` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) DEFAULT NULL,
    `provinceid` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

INSERT INTO `city` VALUES ('1', '石家庄市', '1');
INSERT INTO `city` VALUES ('2', '秦皇岛', '1');
INSERT INTO `city` VALUES ('3', '保定市', '1');
INSERT INTO `city` VALUES ('4', '张家口', '1');
INSERT INTO `city` VALUES ('5', '南昌市', '9');
INSERT INTO `city` VALUES ('6', '九江市', '9');
INSERT INTO `city` VALUES ('7', '宜春市', '9');
INSERT INTO `city` VALUES ('8', '福州市', '8');
INSERT INTO `city` VALUES ('9', '厦门市', '8');
INSERT INTO `city` VALUES ('10', '泉州市', '8');
INSERT INTO `city` VALUES ('11', '龙岩市', '8');
INSERT INTO `city` VALUES ('12', '太原', '2');
INSERT INTO `city` VALUES ('13', '大同', '2');
INSERT INTO `city` VALUES ('14', '呼和浩特', '3');
INSERT INTO `city` VALUES ('15', '包头', '3');
INSERT INTO `city` VALUES ('16', '呼伦贝尔', '3');

2.2创建Web工程

1.创建新的Module,选择Java Enterprise—>Web Application—>next

2.为Module命名

3.在/web/WEB-INF目录下新建lib文件夹,将数据库驱动、json工具包等jar包放进去

4.将lib目录下的jar包都添加到工程Library里

5.在web目录下新建一个文件夹,命名为js,将jQuery库放进去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJiwpfs2-1630570734905)(https://pic.imgdb.cn/item/61307f4a44eaada739a546e8.png)]

2.3创建实体类

2.3.1省份信息表对应实体类

创建com.tsccg.entity.Province实体类

package com.tsccg.entity;

/**
 * @Author: TSCCG
 * @Date: 2021/09/2 15:30
 * 省份信息表province对应实体类
 */
public class Province {
    private Integer id;//省份编号
    private String name;//省份名称
    private String simpleName;//省份简称
    private String proCap;//省份的省会

    public Province() {
    }

    public Province(Integer id, String name, String simpleName, String proCap) {
        this.id = id;
        this.name = name;
        this.simpleName = simpleName;
        this.proCap = proCap;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getSimpleName() {
        return simpleName;
    }

    public void setSimpleName(String simpleName) {
        this.simpleName = simpleName;
    }

    public String getProCap() {
        return proCap;
    }

    public void setProCap(String proCap) {
        this.proCap = proCap;
    }
}
2.3.2城市信息表对应实体类
package com.tsccg.entity;

/**
 * @Author: TSCCG
 * @Date: 2021/09/02 13:37
 * 城市信息表实体类
 */
public class City {
    private Integer cityId;//城市编号
    private String cityName;//城市名称
    private Integer proId;//省份编号

    public City() {
    }

    public City(Integer cityId, String cityName, Integer proId) {
        this.cityId = cityId;
        this.cityName = cityName;
        this.proId = proId;
    }

    public Integer getCityId() {
        return cityId;
    }

    public void setCityId(Integer cityId) {
        this.cityId = cityId;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public Integer getProId() {
        return proId;
    }

    public void setProId(Integer proId) {
        this.proId = proId;
    }
}

2.4封装JDBC工具类

配置文件:jdbc.properties

driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_ajax
user=root
password=123456

工具类:JdbcUtil.java

package com.tsccg.util;

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

/**
 * @Author: TSCCG
 * @Date: 2021/08/28 19:42
 * 封装工具类
 */
public class JdbcUtil {
    private static Connection conn = null;
    private static PreparedStatement ps = null;
    private static Statement stmt = null;

    private static String url = null;
    private static String user = null;
    private static String password = null;

    /**
     * 静态代码块,用于注册驱动及初始化各种参数
     */
    static {
        try {
            ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
            String driverName = bundle.getString("driverName");
            url = bundle.getString("url");
            user = bundle.getString("user");
            password = bundle.getString("password");
            //注册驱动
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return 返回Connection对象
     */
    public static Connection getConn() {
        try {
            conn = DriverManager.getConnection(url,user,password);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return conn;
    }

    /**
     * 获取预编译的数据库操作对象
     * @param sql sql语句
     * @return 返回PreparedStatement对象
     */
    public static PreparedStatement getPs(String sql) {
        try {
            ps = getConn().prepareStatement(sql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return ps;
    }

    /**
     * 获取数据库操作对象
     * @return 返回Statement对象
     */
    public static Statement getStmt() {
        try {
            stmt = getConn().createStatement();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return stmt;
    }

    /**
     * 关闭所有
     * @param rs 查询结果集对象
     */
    public static void closeAll(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

3.流程说明

1.创建前端页面【levelSearch.jsp】,创建两个下拉列表,使用jQuery实现Ajax,发送请求访问Servlet索要所有省份信息

2.创建Dao类,编写方法获取所有省份信息

3.创建处理省份信息的Servlet类,调用Dao得到全部省份信息,转换成json格式字符串写入响应体

4.【levelSearch.jsp】接收到响应数据后更新省份下拉列表DOM对象

5.给省份下拉列表绑定change事件,当下拉列表的选项改变时,使用Ajax函数发送请求,携带省份编号向Servlet索要省份中所有的城市信息。

6.在Dao类里编写方法获取省份id对应所有城市信息

7.创建处理城市信息的Servlet类,调用Dao得到全部城市信息,转换成格式字符串写入响应体

8.【levelSearch.jsp】接收到响应数据后,更新城市下拉列表DOM对象

4.创建用户交互页面

创建levelSearch.jsp,编写页面

  1. 编写基本页面标签
  2. 使用jQuery实现Ajax
    1. 发送请求

      • 当页面刚加载完时,使用Ajax函数发送请求,索要所有省份信息
      • 当省份下拉列表选项改变时,使用Ajax函数发送请求,携带被选中的省份id,索要所有城市信息
    2. 接收响应数据

      • 调用empty函数清除下拉列表原有的子选项
      • 调用each函数遍历json对象
      • 每遍历一次,就给下拉列表添加一个子选项,设置value等于id,内容等于name
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>级联查询</title>
</head>
<style type="text/css">
    * {
        font-size: 20px;
    }
</style>
<%--<script type="text/javascript" src="https://www.jq22.com/jquery/jquery-3.3.1.js"></script>--%>
<script type="text/javascript" src="js/jquery-3.4.1.js"></script>
<script type="text/javascript">
    //定义加载省份信息函数
    function loadProList() {
        $("#proList").empty();//每次查询前,先清空原有子对象
        $.ajax({
            url:"findAllProList",
            dataType:"json",
            success:function(resp) {
                // alert(resp)//【测试语句】
                //resp=[{"id":1,"name":"河北","simpleName":"冀","proCap":"石家庄"},...]
                $.each(resp,function(index,element) {
                    // <option value=element.id>element.name</option>
                    $("#proList").append("<option value="+ element.id +">" + element.name + "</option>")
                })
            }

        })
    }
    $(function() {
        //当页面加载完毕时加载省份信息
        loadProList()
        //监听省份列表改变事件
        $("#proList").change(function() {
            // alert("发生change事件")//【测试】
            $("#cityList").empty();
            //获取当前被选中的省份编号
            var proId = $("#proList>option:selected").val();
            //调用Ajax函数
            $.get("findAllCityList",{"proId":proId},addCityOption,"json")
            // $.ajax({
            //     url:"findAllCityList",
            //     data:{"proId":proId},
            //     dataType:"json",
            //     success:function(resp) {
            //         $.each(resp,function(index,element) {
            //             $("#cityList").append("<option value="+ element.cityId +">" + element.cityName + "</option>");
            //         })
            //     }
            // })
        })
    })
    //定义添加城市选项函数
    function addCityOption(resp){
        $.each(resp,function(index,element) {
            // alert(resp)【测试】
            $("#cityList").append("<option value=" + element.cityId + ">" + element.cityName + "</option>")
        })
    }

</script>
<body>
<center>
    <font style="color: red;">省市级联查询</font>
    <table border="1" cellspacing="0" cellpadding="0">
        <!-- 省份下拉列表 -->
        <tr>
            <td>省份:</td>
            <td>
                <select id="proList">
                    <option>--请选择省份--</option>
                </select>
            </td>
        </tr>
        <!-- 城市下拉列表 -->
        <tr>
            <td>城市:</td>
            <td>
                <select id="cityList">
                    <option>--请选择城市--</option>
                </select>
            </td>
        </tr>
    </table>
</center>

</body>
</html>

5.编写Dao类

package com.tsccg.dao;

import com.tsccg.entity.City;
import com.tsccg.entity.Province;
import com.tsccg.util.JdbcUtil;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: TSCCG
 * @Date: 2021/09/01 22:12
 */
public class ListFindDao {
    /**
     * 查询所有省份信息
     * @return 返回存有所有省份信息的List集合
     */
    public List<Province> findProList() {
        PreparedStatement ps = null;
        ResultSet rs = null;
        Province pro = null;
        List<Province> proList = new ArrayList<>();
        String sql = "select id,name,simpleName,proCap from province";
        try {
            ps = JdbcUtil.getPs(sql);
            rs = ps.executeQuery();
            while(rs.next()) {
                Integer id = rs.getInt("id");
                String name = rs.getString("name");
                String simpleName = rs.getString("simpleName");
                String proCap = rs.getString("proCap");
                //将本条省份信息添加到省份实体类对象中
                pro = new Province(id,name,simpleName,proCap);
                //将省份实体类对象添加到集合对象中
                proList.add(pro);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            JdbcUtil.closeAll(rs);
        }
        //将集合对象返回
        return proList;
    }

    /**
     * 根据省份id查询所有城市信息
     * @param proId 省份id
     * @return 返回存有所有城市信息的List集合
     */
    public List<City> findCityList(Integer proId) {
        PreparedStatement ps = null;
        ResultSet rs = null;
        City city = null;
        List<City> cityList = new ArrayList<>();
        String sql = "select id,name,provinceid from city where provinceid = ?";
        try {
            ps = JdbcUtil.getPs(sql);
            ps.setInt(1,proId);
            rs = ps.executeQuery();
            while(rs.next()) {
                Integer id = rs.getInt("id");
                String name = rs.getString("name");
                //将本条城市信息添加到城市实体类对象中
                city = new City(id,name,proId);
                //将城市实体类对象添加到集合对象中
                cityList.add(city);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            JdbcUtil.closeAll(rs);
        }
        //将集合对象返回
        return cityList;
    }
}

6.创建Servlet用于处理请求

6.1处理省份查询的Servlet

创建com.tsccg.controller.FindAllProListServlet,别称:findAllProList

package com.tsccg.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.tsccg.dao.ListFindDao;
import com.tsccg.entity.Province;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

/**
 * @Author: TSCCG
 * @Date: 2021/09/01 22:09
 */
public class FindAllProListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String jsonStr = "{}";
        //1.调用Dao将查询信息推送到数据库服务器中,返回一个包含所有省份信息的List集合
        ListFindDao dao = new ListFindDao();
        List<Province> proList = dao.findProList();
        //2.将List集合转换为json格式字符串,通过输出流写入到响应体中
        ObjectMapper mapper = new ObjectMapper();
        jsonStr = mapper.writeValueAsString(proList);
        response.setContentType("application/json;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print(jsonStr);
        out.flush();
        out.close();
    }
}

6.2处理城市查询的Servlet

创建com.tsccg.controller.FindAllCityListServlet,别称:findAllCityList

package com.tsccg.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.tsccg.dao.ListFindDao;
import com.tsccg.entity.City;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

/**
 * @Author: TSCCG
 * @Date: 2021/09/02 13:55
 */
public class FindAllCityListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String jsonStr = "{}";
        //1.调用请求对象获取请求头的中的省份编号
        String proId = request.getParameter("proId");
        if (proId != null && proId.length() > 0) {
            //2.调用Dao将查询语句推送给数据库服务器,返回对应省份的所有城市信息
            ListFindDao dao = new ListFindDao();
            List<City> cityList = dao.findCityList(Integer.parseInt(proId));
            //3.将所有城市信息转换为json格式字符串,写入响应体中
            ObjectMapper mapper = new ObjectMapper();
            jsonStr = mapper.writeValueAsString(cityList);
        }
        response.setContentType("application/json;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print(jsonStr);
        out.flush();
        out.close();
    }
}

7.测试

发布网站,开启服务器。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TSCCG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值