一、准备工作
数据库:
province(省)
city(市)
area(区)
utils工具包:
连接数据库
package cn.zc.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBHelper {
// Mysql5.5及以上版本需要在数据库名称后面添加?charart---等解释,5.5以下的版本则不用
public static final String URL="JDBC:mysql://localhost:3306/chick?characterEncoding=utf8&useSSL=false&serverTimezone=UTC";
// 数据库账号
public static final String USERNAME="root";
// 账号密码
public static final String PSW="123456";
public static Connection Conn;
public static Connection getConn(){
try {
Class.forName("com.mysql.jdbc.Driver");
try {
Conn = DriverManager.getConnection(URL,USERNAME,PSW);
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return Conn;
}
// 关闭数据库
public static void closeconn(Connection conn){
if (Conn!=null){
try {
Conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//若不为空则代表连接成功
public static void main(String[] args) {
System.out.println(DBHelper.getConn());
}
}
domin包:
Province对象
package cn.zc.domain;
public class Province {
public Integer pid;
public String pname;
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Province(Integer pid, String pname) {
this.pid = pid;
this.pname = pname;
}
public Province() {
}
@Override
public String toString() {
return "Province{" +
"pid=" + pid +
", pname='" + pname + '\'' +
'}';
}
}
City对象:
package cn.zc.domain;
public class City {
public Integer cid;
public String cname;
public Integer pid;
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public City() {
}
public City(Integer cid, String cname, Integer pid) {
this.cid = cid;
this.cname = cname;
this.pid = pid;
}
@Override
public String toString() {
return "City{" +
"cid=" + cid +
", cname='" + cname + '\'' +
", pid=" + pid +
'}';
}
}
Area对象:
package cn.zc.domain;
public class Area {
public Integer aid;
public String aname;
public Integer cid;
public Integer getAid() {
return aid;
}
public void setAid(Integer aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public Area() {
}
public Area(Integer aid, String aname, Integer cid) {
this.aid = aid;
this.aname = aname;
this.cid = cid;
}
@Override
public String toString() {
return "Area{" +
"aid=" + aid +
", aname='" + aname + '\'' +
", cid=" + cid +
'}';
}
}
二、前端页面
<%--
Created by IntelliJ IDEA.
User: zhang
Date: 2021/03/03
Time: 11:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>三级联动</title>
<script src="js/jquery-3.4.1.js"></script>
<script>
$(function () {
$.ajax({
type:"get",
url:"findprovince",
dataType:"json",
success:function (data) {
var obj = $('#province');
for(var i=0;i<data.length;i++){
var ob = "<option value='"+data[i].pid+"'>"+data[i].pname+"</option>";
obj.append(ob);
}
}
});
$('#province').change(function () {
$('#city option').remove();
$.ajax({
type:"get",
//关闭异步
async:false,
url:"findcity?id="+$('#province').val(),
dataType:"json",
success:function (data) {
var obj = $('#city');
for(var i=0;i<data.length;i++){
var ob = "<option value='"+data[i].cid+"'>"+data[i].cname+"</option>";
obj.append(ob);
}
}
});
});
$('#city,#province').change(function () {//省或市任一更改时,区都会发生变化
$('#area option').remove();
$.ajax({
type:"get",
async:false,
url:"findarea?id="+$('#city').val(),
dataType:"json",
success:function (data) {
var obj = $('#area');
for(var i=0;i<data.length;i++){
var ob = "<option value='"+data[i].aid+"'>"+data[i].aname+"</option>";
obj.append(ob);
}
}
});
});
});
</script>
</head>
<body>
<select id="province">
<option value="0" disabled selected hidden>请选择</option>
</select>省
<select id="city">
<option value="0" disabled selected hidden>请选择</option>
</select>市
<select id="area">
<option value="0" disabled selected hidden>请选择</option>
</select>区/县
</body>
</html>
三、构建后端实现方法
province
servlet层:
package cn.zc.servlet;
import cn.zc.dao.Impl.ProvinceDaoImpl;
import cn.zc.dao.ProvinceDao;
import cn.zc.domain.Province;
import com.alibaba.fastjson.JSONObject;
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.util.ArrayList;
@WebServlet("/findprovince")
public class FindProvinceServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
ArrayList<Province> plists = new ArrayList<>();
ProvinceDao provinceDao = new ProvinceDaoImpl();
plists = provinceDao.findprovince();
response.getWriter().write(JSONObject.toJSONString(plists));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Dao和Impl
package cn.zc.dao;
import cn.zc.domain.Province;
import java.util.ArrayList;
public interface ProvinceDao {
ArrayList<Province> findprovince();
}
package cn.zc.dao.Impl;
import cn.zc.dao.ProvinceDao;
import cn.zc.domain.Province;
import cn.zc.utils.DBHelper;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class ProvinceDaoImpl implements ProvinceDao {
@Override
public ArrayList<Province> findprovince() {
ArrayList<Province> lists = new ArrayList<>();
Connection conn = DBHelper.getConn();
String sql = "select *from province";
try {
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
Province pro = new Province();
pro.setPid(rs.getInt(1));
pro.setPname(rs.getString(2));
lists.add(pro);
}
} catch (SQLException e) {
e.printStackTrace();
}
return lists;
}
}
city:
servlet:
package cn.zc.servlet;
import cn.zc.dao.CityDao;
import cn.zc.dao.Impl.CityDaoImpl;
import cn.zc.domain.City;
import com.alibaba.fastjson.JSONObject;
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.util.ArrayList;
@WebServlet("/findcity")
public class FindCityServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
ArrayList<City> clist = new ArrayList<>();
String id = request.getParameter("id");
CityDao cityDao = new CityDaoImpl();
clist = cityDao.findCityById(Integer.parseInt(id));
response.getWriter().write(JSONObject.toJSONString(clist));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
dao和Impl
package cn.zc.dao;
import cn.zc.domain.City;
import java.util.ArrayList;
public interface CityDao {
ArrayList<City> findCityById(int id);
}
package cn.zc.dao.Impl;
import cn.zc.dao.CityDao;
import cn.zc.domain.City;
import cn.zc.utils.DBHelper;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class CityDaoImpl implements CityDao {
@Override
public ArrayList<City> findCityById(int id) {
Connection conn = DBHelper.getConn();
ArrayList<City> clist = new ArrayList<>();
String sql = "select *from city where pid=?";
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);
ResultSet rs = ps.executeQuery();
while (rs.next()){
City city = new City();
city.setCid(rs.getInt(1));
city.setCname(rs.getString(2));
city.setPid(rs.getInt(3));
clist.add(city);
}
} catch (SQLException e) {
e.printStackTrace();
}
return clist;
}
}
Area:
servlet:
package cn.zc.servlet;
import cn.zc.dao.AreaDao;
import cn.zc.dao.Impl.AreaDaoImpl;
import cn.zc.domain.Area;
import com.alibaba.fastjson.JSONObject;
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.util.ArrayList;
@WebServlet("/findarea")
public class FindAreaServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
ArrayList<Area> alist = new ArrayList<>();
String id = request.getParameter("id");
AreaDao areaDao = new AreaDaoImpl();
alist = areaDao.findAreaById(Integer.parseInt(id));
response.getWriter().write(JSONObject.toJSONString(alist));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Dao和Impl
package cn.zc.dao;
import cn.zc.domain.Area;
import java.util.ArrayList;
public interface AreaDao {
ArrayList<Area> findAreaById(int id);
}
package cn.zc.dao.Impl;
import cn.zc.dao.AreaDao;
import cn.zc.domain.Area;
import cn.zc.utils.DBHelper;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class AreaDaoImpl implements AreaDao {
@Override
public ArrayList<Area> findAreaById(int id) {
ArrayList<Area> alist = new ArrayList<>();
Connection conn = DBHelper.getConn();
String sql = "select *from area where cid=?";
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);
ResultSet rs = ps.executeQuery();
while (rs.next()){
Area area = new Area();
area.setAid(rs.getInt(1));
area.setAname(rs.getString(2));
area.setCid(rs.getInt(3));
alist.add(area);
}
} catch (SQLException e) {
e.printStackTrace();
}
return alist;
}
}