location.sql

-- MySQL dump 10.13  Distrib 8.0.11, for macos10.13 (x86_64)
--
-- Host: 127.0.0.1    Database: test
-- ------------------------------------------------------
-- Server version    8.0.11

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
 SET NAMES utf8mb4 ;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `city`
--

DROP TABLE IF EXISTS `city`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
 SET character_set_client = utf8mb4 ;
CREATE TABLE `city` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(11) DEFAULT NULL,
  `pid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `pro` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `city`
--

LOCK TABLES `city` WRITE;
/*!40000 ALTER TABLE `city` DISABLE KEYS */;
INSERT INTO `city` VALUES (1,'西安市',1),(2,'渭南市',1),(3,'宝鸡市',1),(4,'郑州市',2),(5,'洛阳市',2),(6,'南京市',3),(7,'南通市',3),(8,'苏州市',3),(9,'榆林市',1);
/*!40000 ALTER TABLE `city` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `pro`
--

DROP TABLE IF EXISTS `pro`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
 SET character_set_client = utf8mb4 ;
CREATE TABLE `pro` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `pro`
--

LOCK TABLES `pro` WRITE;
/*!40000 ALTER TABLE `pro` DISABLE KEYS */;
INSERT INTO `pro` VALUES (1,'陕西省'),(2,'河南省'),(3,'江苏省');
/*!40000 ALTER TABLE `pro` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `area`
--

DROP TABLE IF EXISTS `area`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
 SET character_set_client = utf8mb4 ;
CREATE TABLE `area` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(11) DEFAULT NULL,
  `cid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `cid` (`cid`),
  CONSTRAINT `area_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `city` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `area`
--

LOCK TABLES `area` WRITE;
/*!40000 ALTER TABLE `area` DISABLE KEYS */;
INSERT INTO `area` VALUES (1,'新城区',1),(2,'莲湖区',1),(3,'高新区',2),(4,'东湖区',3),(5,'福田区',4),(6,'雁塔区',1);
/*!40000 ALTER TABLE `area` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2019-07-25 22:04:42

 index.jsp

<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-25
  Time: 20:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
  $(function(){
    $("#pro").change(function () {
      var id = $("#pro").val();
      $.ajax({
          url:"/location.do",
          type:"POST",
          data:{
              method:"findCityByPid",
              pid:id
          },
          dataType:"JSON",
          success:function(data){
            var content = "";
              for(var i=0;i<data.length;i++){
                content += "<option value='"+data[i].id+"'>"+data[i].name+"</option>";
              }
              $("#city").html(content);
          }
      });
    });
  });
</script>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <select id="pro">
    <c:forEach items="${requestScope.list}" var="pro">
      <option value="${pro.id}">${pro.name}</option>
    </c:forEach>
  </select>
  <select id="city">
    <c:forEach items="${requestScope.cities}" var="city">
      <option value="${city.id}">${city.name}</option>
    </c:forEach>
  </select>
  <select id="area">
    <c:forEach items="${requestScope.areas}" var="area">
      <option value="${area.id}">${area.name}</option>
    </c:forEach>
  </select>
  </body>
</html>

 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

 c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

    <named-config name="testc3p0">

        <!-- 指定连接数据源的基本属性 -->
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</property>

        <!-- 若数据库中连接数不足时, 一次向数据库服务器申请多少个连接 -->
        <property name="acquireIncrement">5</property>
        <!-- 初始化数据库连接池时连接的数量 -->
        <property name="initialPoolSize">5</property>
        <!-- 数据库连接池中的最小的数据库连接数 -->
        <property name="minPoolSize">5</property>
        <!-- 数据库连接池中的最大的数据库连接数 -->
        <property name="maxPoolSize">10</property>

    </named-config>

</c3p0-config>

 LocationServlet.java

package com.southwind.controller;

import com.southwind.entity.City;
import com.southwind.entity.Province;
import com.southwind.service.LocationService;
import com.southwind.service.impl.LocationServiceImpl;
import net.sf.json.JSONArray;

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.List;

@WebServlet("/location.do")
public class LocationServlet extends HttpServlet {

    private LocationService locationService = new LocationServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("UTF-8");
        String method = req.getParameter("method");
        if(method == null){
            method = "index";
        }
        switch (method){
            case "index":
                List<Province> list = locationService.findAll();
                req.setAttribute("list",list);
                req.setAttribute("cities", locationService.findCityByPid(1L));
                req.setAttribute("areas", locationService.findAreaByCid(1L));
                req.getRequestDispatcher("index.jsp").forward(req,resp);
                break;
            case "findCityByPid":
                String pidStr = req.getParameter("pid");
                Long pid = Long.parseLong(pidStr);
                List<City> cities = locationService.findCityByPid(pid);
                JSONArray jsonArray = JSONArray.fromObject(cities);
                resp.getWriter().write(jsonArray.toString());
                break;
        }

    }
}

 Area.java

package com.southwind.entity;

public class Area {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

City.java

package com.southwind.entity;

import java.util.List;

public class City {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

Province.java

package com.southwind.entity;

import java.util.List;

public class Province {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

 AreaRepository.java

package com.southwind.repository;

import com.southwind.entity.Area;

import java.util.List;

public interface AreaRepository {
    public List<Area> findByCid(Long id);
}

CityRepository.java

package com.southwind.repository;

import com.southwind.entity.City;

import java.util.List;

public interface CityRepository {
    public List<City> findByPid(Long id);
}

ProvinceRepository.java

package com.southwind.repository;

import com.southwind.entity.Province;

import java.util.List;

public interface ProvinceRepository {
    public List<Province> findAll();
}

 AreaRepositoryImpl.java

package com.southwind.repository.impl;

import com.southwind.entity.Area;
import com.southwind.repository.AreaRepository;
import com.southwind.util.JDBCTools;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;

public class AreaRepositoryImpl implements AreaRepository {
    @Override
    public List<Area> findByCid(Long id) {
        Connection connection = JDBCTools.getConnection();
        String sql = "select * from area where cid = ?";
        QueryRunner queryRunner = new QueryRunner();
        List<Area> list = null;
        try {
            list = queryRunner.query(connection,sql,new BeanListHandler<>(Area.class),id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
}

CityRepositoryImpl.java

package com.southwind.repository.impl;

import com.southwind.entity.City;
import com.southwind.repository.CityRepository;
import com.southwind.util.JDBCTools;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class CityRepositoryImpl implements CityRepository {
    @Override
    public List<City> findByPid(Long id) {
        Connection connection = JDBCTools.getConnection();
        String sql = "select * from city where pid = ?";
        QueryRunner queryRunner = new QueryRunner();
        List<City> list = null;
        try {
            list = queryRunner.query(connection,sql,new BeanListHandler<>(City.class),id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
}

ProvinceRepositoryImpl.java

package com.southwind.repository.impl;

import com.southwind.entity.Province;
import com.southwind.repository.ProvinceRepository;
import com.southwind.util.JDBCTools;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class ProvinceRepositoryImpl implements ProvinceRepository {
    @Override
    public List<Province> findAll() {
        Connection connection = JDBCTools.getConnection();
        String sql = "select * from pro";
        QueryRunner queryRunner = new QueryRunner();
        List<Province> list = null;
        try {
            list = queryRunner.query(connection,sql,new BeanListHandler<>(Province.class));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
}

 LocationService.java

package com.southwind.service;

import com.southwind.entity.Area;
import com.southwind.entity.City;
import com.southwind.entity.Province;

import java.util.List;

public interface LocationService {
    public List<Province> findAll();
    public List<City> findCityByPid(Long id);
    public List<Area> findAreaByCid(Long id);
}

 LocationServiceImpl.java

package com.southwind.service.impl;

import com.southwind.entity.Area;
import com.southwind.entity.City;
import com.southwind.entity.Province;
import com.southwind.repository.AreaRepository;
import com.southwind.repository.CityRepository;
import com.southwind.repository.ProvinceRepository;
import com.southwind.repository.impl.AreaRepositoryImpl;
import com.southwind.repository.impl.CityRepositoryImpl;
import com.southwind.repository.impl.ProvinceRepositoryImpl;
import com.southwind.service.LocationService;

import java.util.List;

public class LocationServiceImpl implements LocationService {

    private ProvinceRepository provinceRepository = new ProvinceRepositoryImpl();
    private CityRepository cityRepository = new CityRepositoryImpl();
    private AreaRepository areaRepository = new AreaRepositoryImpl();

    @Override
    public List<Province> findAll() {
        return provinceRepository.findAll();
    }

    @Override
    public List<City> findCityByPid(Long id) {
        return cityRepository.findByPid(id);
    }

    @Override
    public List<Area> findAreaByCid(Long id) {
        return areaRepository.findByCid(id);
    }
}

 JDBCTools.java

package com.southwind.util;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class JDBCTools {
    private static DataSource dataSource;
    static{
        dataSource = new ComboPooledDataSource("testc3p0");
    }
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
    public static void release(Connection connection){
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
02-01 04:55