Java省市县三级级联

介绍

在很多应用中,我们经常需要选择省、市、县三级联动的功能,这样用户可以方便地选择所在地区。本文将介绍如何使用Java实现省市县三级级联功能,以及如何在前端页面中展示和使用这些数据。

数据源

首先,我们需要准备好省市县的数据源。这些数据可以从数据库中获取,也可以是事先定义好的静态数据。在本文中,我们将使用静态数据来进行演示。

以下是一个简单的省市县数据的示例:

public class Province {
    private String name;
    private List<City> cities;
    
    // 省的构造函数和getter、setter方法省略
}

public class City {
    private String name;
    private List<County> counties;
    
    // 市的构造函数和getter、setter方法省略
}

public class County {
    private String name;
    
    // 县的构造函数和getter、setter方法省略
}

// 初始化省市县数据
List<Province> provinces = new ArrayList<>();

// 省1
Province province1 = new Province();
province1.setName("省1");

// 市1
City city1 = new City();
city1.setName("市1");

// 县1
County county1 = new County();
county1.setName("县1");
city1.getCounties().add(county1);

// 县2
County county2 = new County();
county2.setName("县2");
city1.getCounties().add(county2);

province1.getCities().add(city1);

provinces.add(province1);

// 省2、市2、县3 同上略

// 其他省、市、县的数据略

后端实现

在后端,我们需要提供接口来获取省市县的数据。这些接口可以使用Java的Web框架,如Spring MVC来实现。

首先,我们需要一个接口来获取所有的省份数据:

@GetMapping("/provinces")
public List<String> getProvinces() {
    List<String> provinceNames = new ArrayList<>();
    for (Province province : provinces) {
        provinceNames.add(province.getName());
    }
    return provinceNames;
}

接下来,我们需要一个接口来根据省份获取对应的城市数据:

@GetMapping("/cities/{province}")
public List<String> getCities(@PathVariable("province") String provinceName) {
    for (Province province : provinces) {
        if (province.getName().equals(provinceName)) {
            List<String> cityNames = new ArrayList<>();
            for (City city : province.getCities()) {
                cityNames.add(city.getName());
            }
            return cityNames;
        }
    }
    return Collections.emptyList();
}

最后,我们需要一个接口来根据城市获取对应的县区数据:

@GetMapping("/counties/{province}/{city}")
public List<String> getCounties(@PathVariable("province") String provinceName,
                                @PathVariable("city") String cityName) {
    for (Province province : provinces) {
        if (province.getName().equals(provinceName)) {
            for (City city : province.getCities()) {
                if (city.getName().equals(cityName)) {
                    List<String> countyNames = new ArrayList<>();
                    for (County county : city.getCounties()) {
                        countyNames.add(county.getName());
                    }
                    return countyNames;
                }
            }
        }
    }
    return Collections.emptyList();
}

前端实现

在前端,我们可以使用HTML、CSS和JavaScript来实现省市县三级联动的功能。以下是一个简单的HTML页面示例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>省市县三级联动</title>
</head>
<body>
    <label for="province">省份:</label>
    <select id="province" onchange="getCityData()">
        <option value="">请选择省份</option>
    </select>

    <label for="city">城市:</label>
    <select id="city" onchange="getCountyData()">
        <option value="">请选择城市</option>
    </select>

    <label for="county">县区:</label>
    <select id="county">
        <option value="">请选择县区</option>
    </select>

    <script>
        // 获取省份数据
        fetch('/provinces')
            .then(response => response.json())
            .then(provinces => {
                const provinceSelect = document.getElementById('province');
                provinces.forEach(province => {
                    const option = document.createElement('option');
                    option.value = province;
                    option.text = province;
                    provinceSelect.appendChild(option);
                });