首先要实现的效果,如图:
那么,针对整个项目的前提思路:
Ajax案例之三级联动:
功能需求:
页面中有三个下拉框选项,分别为省下拉框,市下拉框,区/县下拉框选择省,则市下拉框中出现对应的该省下的市信息,选择市,则区/县下拉框中出现对应的该市下面的区/县信息
技术分析:
ajax技术+jsp+servlet+jdbc
需求分析(思路):
1、创建页面:页面中有三个下拉框,分别为省、市、区/县
2、页面加载成功发起ajax请求,请求省的信息,并将响应结果填充到省下拉框中
3、选择省触发一个新的js函数 的执行,该函数中发起新的ajax请求请求该省下的市信息,并将响应数据填充到市下拉框
4、选择市信息触发一个新的js函数的执行,该函数中发起新的ajax请求请求该市下的区/县信息,并将数据填充到区/县下拉框中
数据库设计:
创建表(area):存储了省、市、区/县信息
设计表实现一:只存储了数据,但是数据之间的层级关系没有存储。
地区id:areaid
地区名:areaname
设计表实现二:
地区id:areaid
地区名:areaname
地区上级id:parentid
sql语句设计:
查询所有的省信息:
select * from area where parentid=0;
查询选择的省的市信息(假如:选择的山东省的areaid为110000,)
select * from area where parentid=110000;
查询选择的市的区/县信息(假如:选择的山东省的济南市areaid为110001)
select * from area where parentid =110001;
代码中
select * from area where parentid=?;
数据库实现:将资料中提供的area.sql文件导入到数据库中即可
功能实现:参照源码即可
代码缺陷:发现请求省,市,县的代码中基本上是一致的。代码的冗余量有点大
解决:考虑使用封装
实现:形同的保留,不同的传参。
附上数据库表以及源码:
dao层接口:
package com.zc.dao;
import java.util.List;
import com.zc.pojo.Area;
public interface AreaDao {
/*
* 根据pid查询地区信息
*/
List<Area> getAreaInfoDao(String pid);
}
dao层实现类:
package com.zc.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.zc.dao.AreaDao;
import com.zc.pojo.Area;
import com.zc.util.DBUtil;
public class AreaDaoImpl implements AreaDao {
@Override
public List<Area> getAreaInfoDao(String pid) {
//声明jdbc变量
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
//声明变量
ArrayList<Area> la = null;
try {
//获取连接
conn = DBUtil.getConnection();
//创建SQL命令
String sql = "select * from area where parentid = ?";
//创建SQL命名对象
ps = conn.prepareStatement(sql);
//给占位符赋值
ps.setString(1, pid);
//执行sql
rs = ps.executeQuery();
la = new ArrayList<>();
//遍历结果
while(rs.next()){
//创建实体类对象
Area a = new Area();
a.setAreaid(rs.getInt("areaid"));
a.setAreaname(rs.getString("areaname"));
a.setParentid(rs.getInt("parentid"));
a.setArealevel(rs.getInt("arealevel"));
a.setStatus(rs.getInt("status"));
la.add(a);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtil.closeAll(rs, ps, conn);
}
//关闭资源
//返回
return la;
}
}
pojo包实体类:
package com.zc.pojo;
public class Area {
private int areaid;
private String areaname;
private int parentid;
private int arealevel;
private int status;
public Area() {
super();
}
public Area(int areaid, String areaname, int parentid, int arealevel,
int status) {
super();
this.areaid = areaid;
this.areaname = areaname;
this.parentid = parentid;
this.arealevel = arealevel;
this.status = status;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + areaid;
result = prime * result + arealevel;
result = prime * result
+ ((areaname == null) ? 0 : areaname.hashCode());
result = prime * result + parentid;
result = prime * result + status;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass()