省 市 县 三级联动

news/2024/3/28 23:07:41/文章来源:https://blog.csdn.net/m0_61911999/article/details/128082293

大纲


 一、导入省市县数据表(t_region)

 二、引入jar包

三、导入所需util类(整体框架)

 

四、编写代码

 1、配置数据库相关信息(数据库名、用户名、密码)    config.propreties

#oracle9i
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#pwd=123#sql2005
#driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
#url=jdbc:sqlserver://localhost:1433;DatabaseName=test1
#user=sa
#pwd=123#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
user=root
pwd=1234

 2、创建数据库中对应数据表(t_region)的省市县实体类,即 Region.java

package com.zking.jquery.entity;
/*** 地区实体类* @author gss**/
public class Region {private long id;//编号private long parent_id;//父级编号private long region_id;private long region_parent_id;private String region_name;//名称private Integer region_type;//类型 1省 2市 3县public long getId() {return id;}public void setId(long id) {this.id = id;}public long getParent_id() {return parent_id;}public void setParent_id(long parent_id) {this.parent_id = parent_id;}public long getRegion_id() {return region_id;}public void setRegion_id(long region_id) {this.region_id = region_id;}public long getRegion_parent_id() {return region_parent_id;}public void setRegion_parent_id(long region_parent_id) {this.region_parent_id = region_parent_id;}public String getRegion_name() {return region_name;}public void setRegion_name(String region_name) {this.region_name = region_name;}public Integer getRegion_type() {return region_type;}public void setRegion_type(Integer region_type) {this.region_type = region_type;}public Region() {super();}@Overridepublic String toString() {return "Region [id=" + id + ", parent_id=" + parent_id + ", region_id=" + region_id + ", region_parent_id="+ region_parent_id + ", region_name=" + region_name + ", region_type=" + region_type + "]";}	
}

3、 工具类  BaseDao.java

package com.zking.jquery.dao;import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import com.zking.jquery.util.DBHelper;
import com.zking.jquery.util.PageBean;public class BaseDao<T> {public static interface CallBack<E>{public List<E> forEach(ResultSet rs) throws SQLException;}/*** 增删改通用方法* @param sql* @param params*/public void executeUpdate(String sql,Object[] params) {Connection conn=null;PreparedStatement stmt=null;try {conn=DBHelper.getConnection();stmt=conn.prepareStatement(sql);ParameterMetaData metadata = stmt.getParameterMetaData();for (int i = 0; i < metadata.getParameterCount(); i++) {stmt.setObject(i+1, params[i]);}int i = stmt.executeUpdate();if(i<1)throw new RuntimeException("执行失败,影响行数为0");} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBHelper.close(conn, stmt, null);}}/*** 查询方法* @param sql* @param params*/public List<T> executeQuery(String sql,PageBean pageBean,CallBack<T> callBack){Connection conn=null;PreparedStatement stmt=null;ResultSet rs=null;try {conn=DBHelper.getConnection();//判断是否分页if(null!=pageBean&&pageBean.isPagination()) {//第一次查询返回总记录数String countSql=this.getCountSql(sql);stmt=conn.prepareStatement(countSql);rs=stmt.executeQuery();if(rs.next()) {Object obj=rs.getObject(1);pageBean.setTotal(Integer.parseInt(obj.toString()));}//第二次查询返回指定页码数并满足条件的分页结果集sql=this.getPagerSql(sql, pageBean);}stmt=conn.prepareStatement(sql);rs=stmt.executeQuery();//遍历结果集return callBack.forEach(rs);} catch (Exception e) {e.printStackTrace();}finally {DBHelper.close(conn, stmt, rs);}return null;}/*** 将普通SQL语句转换成查询总记录数的SQL语句* @param sql* @return*/private String getCountSql(String sql) {return "select count(1) from ("+sql+") t1";}/*** 将普通SQL语句转换成查询分页记录集的SQL语句* @param sql* @param pageBean* @return*/private String getPagerSql(String sql,PageBean pageBean) {return sql+" Limit "+pageBean.getStartIndex()+","+pageBean.getRows();}
}

4、数据操作类 RegionDao.java 继承BaseDao.java

package com.zking.jquery.dao;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import com.zking.jquery.entity.Region;
import com.zking.jquery.util.CommonUtils;
import com.zking.jquery.util.StringUtils;public class RegionDao extends BaseDao<Region>{//查询public List<Region> queryRegionLst(Region region){String sql="select id,region_id,parent_id,region_parent_id,"+ "region_name,region_type from t_region where 1=1";//判断不为空if(StringUtils.isNotBlank(region.getParent_id()+""))sql+=" and parent_id="+region.getParent_id();return super.executeQuery(sql, null, new CallBack<Region>() {@Overridepublic List<Region> forEach(ResultSet rs) throws SQLException {try {return CommonUtils.toList(rs, Region.class);} catch (Exception e) {e.printStackTrace();}return null;}});}
}

5、 工具类 CommonUtils.java

package com.zking.jquery.util;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class CommonUtils {/*** 根据ResultSet数据集,利用反射机制动态赋值并返回List<T>* @param rs ResultSet数据集* @param clazz 实体类对象* @return 返回List实体集合* @throws Exception*/public static <T> List<T> toList(ResultSet rs,Class<T> clazz) throws Exception{//定义实体集合List<T> lst=new ArrayList<T>();//获取ResultSet的metadata列信息ResultSetMetaData metaData = rs.getMetaData();//获取对象属性集合Field[] fields=clazz.getDeclaredFields();//循环ResultSetwhile(rs.next()) {//反射机制实例化T obj = clazz.newInstance();for (int i = 0; i < metaData.getColumnCount(); i++) {//获取列名String columnName=metaData.getColumnLabel(i+1).toUpperCase();for (Field field : fields) {//判断属性名与列名是否相同if(field.getName().toUpperCase().equals(columnName)) {//获取属性对应的set方法名,方法名首字母大写String methodName="set"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);//获取属性对应的set方法Method method = obj.getClass().getDeclaredMethod(methodName, field.getType());//设置访问权限method.setAccessible(true);//执行set方法,将数据存储到对象中的相应属性中method.invoke(obj, rs.getObject(columnName));break;}}}lst.add(obj);}return lst;}/*** 多表查询时返回结果集,利用反射机制赋值 * @param rs* @return 返回List<Map<String,Object>>* @throws Exception*/public static List<Map<String,Object>> toList(ResultSet rs) throws Exception{//定义实体集合List<Map<String,Object>> lst=new ArrayList<Map<String,Object>>();//获取ResultSet的metadata列信息	ResultSetMetaData metaData = rs.getMetaData();Map<String,Object> set=null;while(rs.next()) {set=new HashMap<String,Object>();for (int i = 0; i < metaData.getColumnCount(); i++) {String columnName=metaData.getColumnLabel(i+1);set.put(columnName, rs.getObject(columnName));}lst.add(set);}return lst;}
}

6、测试Dao类是否有误        RegionDaoTest.java

package com.zking.jquery.dao;import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.zking.jquery.entity.Region;class RegionDaoTest {//实例化一个dao类对象private RegionDao regionDao = new RegionDao();private Region region;@BeforeEachvoid setUp() throws Exception {region=new Region();}@Testvoid testQueryRegionLst() {//给父级编号赋值region.setParent_id(7459);//调用Dao类查询方法List<Region> lst=regionDao.queryRegionLst(region);for (Region reg: lst) {System.out.print(reg);}}
}

测试结果没有报错,可以继续下一步


 7、RegionAction.java

package com.zking.jquery.action;import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zking.jquery.dao.RegionDao;
import com.zking.jquery.entity.Region;
import com.zking.mvc.framework.Action;
import com.zking.mvc.framework.DriverModel;public class RegionAction extends Action implements DriverModel<Region> {private RegionDao regionDao=new RegionDao();private Region region=new Region();private ObjectMapper mapper=new ObjectMapper();@Overridepublic Region getModel() {return region;}@Overridepublic String execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {List<Region> lst = regionDao.queryRegionLst(region);mapper.writeValue(res.getOutputStream(), lst);return null;}
}

1、创建 address.jsp 页面。先在 js 中引入 jquery.min.js 。

 将 jquery.min.js 引入到 address.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>省 市 县之三级联动</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.min.js"></script>
<script type="text/javascript">
$(function(){//初始化查询searchProvince(7459);//select的change事件$('#province').change(function(){//searchProvince($(this).val());//this:当前省份的selectvar pid=$(this).val();if(pid=="")return false;$.ajax({//请求路径url:'regionAction.action',//请求参数data:{'parent_id':pid},//提交方式type:'post',//数据类型dataType:'json',//是否同步async:false,//请求成功之后的回调方法success:function(data){//console.log(data);//清空选项,只保留第一个选项$('#city option:not(:first)').remove();//循环$.each(data,function(idx,elem){var region=elem;//绑定元素$('#city').append('<option value="'+region.id+'">'+region.region_name+'</option>');console.log(elem);});}});});$('#city').change(function(){//searchProvince($(this).val());var pid=$(this).val();if(pid=="")return false;$.ajax({//请求路径url:'regionAction.action',//请求参数data:{'parent_id':pid},//提交方式type:'post',//数据类型dataType:'json',//是否同步async:false,//请求成功之后的回调方法success:function(data){//console.log(data);//清空选项,只保留第一个选项$('#county option:not(:first)').remove();//循环$.each(data,function(idx,elem){var region=elem;//绑定元素$('#county').append('<option value="'+region.id+'">'+region.region_name+'</option>');console.log(elem);});}});});});function searchProvince(pid){//var pid=$(this).val();if(pid=="")return false;$.ajax({//请求路径url:'regionAction.action',//请求参数data:{'parent_id':pid},//提交方式type:'post',//数据类型dataType:'json',//是否同步async:false,//请求成功之后的回调方法success:function(data){//console.log(data);//清空选项,只保留第一个选项$('#province option:not(:first)').remove();//循环$.each(data,function(idx,elem){var region=elem;//绑定元素$('#province').append('<option value="'+region.id+'">'+region.region_name+'</option>');console.log(elem);});}});
}
</script></head>
<body><h2>省市县三级联动 lxy</h2><select id="province" style="border-radius: 4px;font-size:16px;font-family:宋体;background-color:#99FFFF"><option value="">-----请选择-----</option></select>&nbsp;<select id="city" style="border-radius: 4px;font-size:16px;font-family:宋体;background-color:#99FF99"><option value="">-----请选择-----</option></select>&nbsp;<select id="county" style="border-radius: 4px;font-size:16px;font-family:宋体;background-color:#FFCCCC"><option value="">-----请选择-----</option></select></body>
</html>

打印结果:


2、在 web.xml 中配置过滤器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><display-name>Jquery_address</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><filter><filter-name>FilterEncoding</filter-name><filter-class>com.zking.jquery.util.EncodingFilter</filter-class></filter><filter-mapping><filter-name>FilterEncoding</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>ActionServlet</servlet-name><servlet-class>com.zking.mvc.framework.ActionServlet</servlet-class><init-param><param-name>config</param-name><param-value>/mvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>ActionServlet</servlet-name><url-pattern>*.action</url-pattern></servlet-mapping></web-app>

3、将 mvc.xml 导入到 src 根目录下  配置RegionAction

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config[<!ELEMENT config (action*)><!ELEMENT action (forward*)><!ELEMENT forward EMPTY><!ATTLIST action path CDATA #REQUIREDtype CDATA #REQUIRED><!ATTLIST forwardname CDATA #REQUIREDpath CDATA #REQUIREDredirect (true|false) "false">
]><!-- config标签:可以包含0~N个action标签 --><config><action type="com.zking.jquery.action.RegionAction" path="/regionAction"></action>
</config>

                                            最终效果展示(可自行美化)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_38542.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsp393学生宿舍管理系统mysql

两个权限 管理员和 学生 1. 学生信息管理 添加学生信息&#xff08;学生号&#xff0c;姓名 院系 班级入学日期 &#xff09;修改学生信息 学生退宿舍&#xff08;可以删除指定的学生也可以成批删除&#xff09; 2. 宿舍信息管理 宿舍的基本信息&#xff08;公寓数 宿舍…

第五届“强网”拟态防御国际精英挑战赛——特邀战队篇

第五届“强网”拟态防御国际精英挑战赛即将在南京隆重开赛&#xff01;本届大赛面向全球顶尖CTF战队&#xff0c;在创新应用场景与技术的基础上&#xff0c;拓展升级赛道&#xff0c;全面覆盖典型网络设备。大赛汇集国内外60支精英战队&#xff0c;参赛阵容、数量再创新高。 本…

科普下抖音的规则,为什么别人的内容很容易火,而我的很难?

今天给大家科普下抖音的规则&#xff0c;为什么别人的内容很容易火&#xff0c;而我的很难&#xff1f; 上一篇给大家讲了现在做抖音还来得及么&#xff1f;肯定的回答&#xff0c;一直都来得及。 既然来得及&#xff0c;那么我们怎么才能做好抖音呢&#xff1f; 在我看来&a…

5 - 2 单选题

1.下列线索二叉树中&#xff08;用虚线表示线索&#xff09;&#xff0c;符合后序线索树定义的是&#xff1a;B 后序线索二叉树的构建流程就是&#xff1a; 1.后序遍历二叉树&#xff1a;d b c a 2.第一个结点的前驱是NULL&#xff0c;即d的前驱&#xff0c;d的左孩子为NULL …

web表单(详解)

目录 1. 表单的概述 1.1 表单组成 2. 表单标记 2.1 input标记 2.2 select标记 2.3 textarea标记 3.HTML5新增标记 3.1 datalist标记 3.2 date 输入类型 3.3 color输入类型 3.4 button标记 3.5 details标记和summary标记 3.6 progress标记 3.7 meter标记 4 综合…

云原生微服务治理技术朝无代理架构的演进之路

摘要&#xff1a;本文基于对微服务治理技术从SOA, 微服务框架&#xff0c;到云原生架构的历史发展总结&#xff0c;提出了一种新的基于Javaagent技术的新一代无代理架构的服务治理技术&#xff0c;并介绍了其相关的代表性开源项目Sermant。本文分享自华为云社区《云原生微服务治…

Docker安装Redis集群失败经历汇总

在程序员的开发过程中&#xff0c;Redis可以说基本上是必不可少的缓存中间件。不管是二进制包还是docker安装Redis的文章在网上都是数不胜数。我之前自己玩Redis的时候基本不是二进制包安装就是docker安装&#xff0c;也没有尝试过集群方式。每次需要的时候&#xff0c;网上百度…

Cloud-computing 实验镜像 chinaskills_cloud_iaas.iso chinaskills_cloud_paas.iso

Cloud-computing 实验镜像 最近因新项目再次进行云计算环境的搭建&#xff0c; 找这两个镜像&#xff08; 找chinaskills_cloud_paas.iso chinaskills_cloud_iaas.iso&#xff09;颇为费劲&#xff0c;用尽九牛二虎之力总算找到了&#xff0c;该大侠还分享了诸多系统镜像和完…

Centos7搭建SVN代码控制服务器

Centos7搭建SVN代码控制服务器检查SVN是否安装创建SVN版本库配置代码库设置允许访问远程仓库的用户帐号密码设置权限控制设置SVN服务配置启动svn与停止启动SVN关闭SVN访问拉取远程仓库代码检查SVN是否安装 1、centos7系统自带SVN rpm -qa subversion2、如果没有则通过yum安装 …

Day15--加入购物车-初始化vuex

1.加入购物车&#xff1a; 我的操作&#xff1a; ************************************************************************************************************* 2.购物车里面的商品数据在多个页面都会用到。所以把购物车里面的商品数据存储在vuex里面&#xff0c; 我的…

Windows10安装配置allure

1、allure官方文档&#xff1a; https://docs.qameta.io/allure/#_about 官方文档中&#xff0c;windows部署allure步骤&#xff1a; 奈何提示scoop不是內部命令 2、安装scoop scoop官方文档&#xff1a;https://scoop.sh/ 需要打开power shell&#xff0c;执行提示的两条…

外汇天眼:英国研究人员与南非合作应对气候变化

随着南非对气候变化的担忧加剧&#xff0c;英国卫生部已同意与南非就九个不同项目组建一个合作研究团队&#xff0c;旨在拯救生命。 南非总统西里尔拉马福萨 (Cyril Ramaphosa) 与英国卫生大臣在克里克研究所会面后达成了合作协议&#xff0c;克里克研究所如今被称为欧洲最大的…

BUUCTF Misc 来首歌吧 荷兰宽带数据泄露 面具下的flag 九连环

来首歌吧 下载文件 使用Audacity打开 可以发现框出来的一串,放大查看 有长有短有空格&#xff0c;大概率是摩斯密码 ...../-.../-.-./----./..---/...../-..../....-/----./-.-./-.../-----/.----/---../---../..-./...../..---/./-..../.----/--.../-../--.../-----/----./.…

汽车蓄电池低压报警设计

目 录 摘 要 I Abstract II 第一章 绪论 1 1.1 选题背景及意义 1 1.2 国内外发展状况 2 1.2.1国内发展现状 2 1.2.2 国外蓄电池监测系统研究现状 2 1.3 研究主要内容 4 第2章 系统总体设计与算法确定 5 2.1 监测系统总体设计原理 5 2.2 主控芯片的选择 6 2.2.1 89C51单片机的概…

IPv6进阶:IPv6 过渡技术之IPv6 over IPv4 手动隧道

实验拓扑 R1-R3-R2之间的网络为IPv4环境&#xff1b;PC1及PC2处于IPv6孤岛。 实验需求 R1及R2为IPv6/IPv4双栈设备&#xff1b;在R1及R2上部署IPv6 over IPv4手工隧道使得PC1及PC2能够互相访问。 配置及实现 R3的配置如下 [R3] interface GigabitEthernet0/0/0 [R3-Gigabi…

集合框架----源码解读LikedHashSet篇

1.官方介绍 Hash表和链表实现了Set接口&#xff0c;具有可预测的迭代顺序。该实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。该链表定义了迭代顺序&#xff0c;即元素插入集合的顺序(插入顺序)。注意&#xff0c;如果一个元素重新插入到集合中&#xff0c…

【JAVA案例】作业管理系统(控制台版本)

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录一、JAVA面向对象程序设计1.1 工程分包1.2 各类属性及功能二、数据初始化三、学生模块四、教师…

传奇单机架设登录器配置教程

传奇单机顾名思义就是在本地电脑上架设传奇&#xff0c;限制同一个局域网才能一起玩&#xff0c;我接触到几个朋友不明白外网和单机的区别 架设单机需要准备以下程序&#xff1a; 传奇服务端&#xff08;版本Mirserver&#xff09; DBC2000 (百度可直接下载&#xff09; 配套登…

基于SpringBoot的会员制医疗预约服务管理信息系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#…

Apifox:成熟的测试工具要学会自己写接口文档

好家伙&#xff0c; 在开发过程中&#xff0c;我们总是避免不了进行接口的测试&#xff0c; 而相比手动敲测试代码&#xff0c;使用测试工具进行测试更为便捷&#xff0c;高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman&#xff0c;他还拥有一个非常nb的功…