Java Web应用开发案例|使用AJAX实现省市区三级联动效果

简介: 使用AJAX实现省市区三级联动效果,即选择省后,该省下的所有市数据动态填充到下拉框中,区县数据也会根据市的变化而动态填充该市下的区县数据。

image.png

01、案例:省市区三级联动

省市区三级联动,在位置查找时非常有用,如查找景点、查找酒店等操作。

项目操作步骤如下

(1) 定义省、市、区三个实体对象。

public class Province{
private String id;
private String name;
private List < City> cityList;
}
public class City{
private String id;
private String name;
private List < Country> countryList;
}
public class Country {
private String id;
private String name;
}

(2) 新建city.jsp,显示省市区信息。

< table border ="1">
< tr >< td>省级 :</td >
<td>< select name ="shengSelect"onchange = "getShiList()";
id="shengID”onclick = getShengName()">
<option value ="nulISelect">-- 请选择--</option>
<c:forEach var ="sheng" items ="{SarrSheng}">
S{sheng.id}">
< option value =${sheng.name}
</option>
</c:forEach >
</select ></td>
< td>市级: </td>"getQvList()">
<td>< select name ="shiSelect” id="shiID"onchange< option> --请选择 --</option ></select ></td><td>区县: </td><td>< select name ="gvSelect"id ="gvID”onclick = "getQvName()">-- 请选择-- </option >< option ></select ></td>
</tr >
</table>

(3) 访问 http://localhost:8080/CityThree/, web.xml中的欢迎页指向GetShengSvl。

<welcome- file-list >
< welcome - file> GetShengSvl </welcome - file></welcome- file-list>

(4) 新建控制器GetShengSvl。

@WebServlet("/GetShengSvl"
public class GetShengSvl extends HttpServlet{
   
   

读取所有省的数据,并转向 city.jsp 。

public void doPost(HttpServletRequest request
HttpServletResponse response)
throws ServletException,IOException{
   
   
 (TestBiz testBiz = new TestBiz();
List < Province> arrSheng = testBiz.getAllSheng();
if(arrSheng != null){
   
   
request.setAttribute("arrSheng",arrSheng);
request.getRequestDispatcher("/WEB - INF/main/city.jsp”)
forward(request,response)
}

(5) 参见city.jsp,所有省的数据是使用JSTL填充的。

<c:forEach var ="sheng” items ="S(arrSheng]">
<option value ="s(sheng.id">Ssheng.name
</option>
</c:forEach >

(6) 在city.jsp页选择省的数据,会触发下拉框的onchange()事件。

function getShiList()
if($("# shengID").val() != "nullSelect"){
   
   
$ .getJSON("GetShiSvl",{
   
   sheng: ("# shengID").val()},
function callback(data)
$("# shiID").empty();
S (data).each( function(i){
   
   
S("<option value=” + datalil.id + ">"
+ data[i].name +"</option >").appendTo("# shiID");;
});
$ ("# shiID").change();  //触发#shiID的onChange 事件

else{
   
     
S ("# shiID").empty();
$ ("# qvID").empty();
$("< option >-- 请选择 -- </option >").appendTo("# shiID");
$("<option>--请选择 -- </option >").appendTo("#qvID");
}
}

(7) 新建控制器GetShiSvl,根据省的id返回该省下的所有市数据。

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
   
   
String shengID = request.getParameter("sheng”);
TestBiz testBiz = new TestBiz();
List < City> cityList = testBiz.getShiBySheng(shengID);
JSONArray jsonArray = JSONArray.fromObject(cityList);
response.setCharacterEncoding("utf - 8");
response.getWriter().print(jsonArray.toString())
}

(8) 选择市,会触发下拉框的onchange()事件。

function getOvList(){
   
   
 {
   
   mathJaxContainer[0]} ("# shiID").val(),
sheng:$("# shengID").val())function callback(data){
   
   
("# qvID").empty();
S (data).each(function(i){
   
   
$("<option value=" + datalil.id + ">"
+ data[i].name +"</option >").appendTo("# qvID");;
});
$("# qvID").click();

(9) 新建控制器GetQvSvl,根据市的id返回该市下的所有区县数据。

@WebServlet("/GetQvSvl") 
public class GetQvSvl extends HttpServlet{
   
   
public void service(HttpServletRequest request,HttpServletResponse response)
throw ServletException,IOException{
   
   
String provinceID = request.getParamenter("sheng");
String CityID = request.getParamenter("shi");
TestBiz biz = new TestBiz();
List<Country>qvList = biz.getCountrys(provinceID,CityID);
JSONArray jsonArray = JSONArray.fromObject(qvList);
response.setCharracterEncoding("UTF-8");
response.GetWriter().print(jsonArray.toString())
}
}

(10) 选择省,根据省的id返回该省下的所有市数据,JSON格式如下:

[("id":"tj01","name":"和平区"),
["id":"tj02","name":"河东区"},
["id":"tj03","name":"河西区"},
{
   
   "id":"tj04","name":"南开区"},
{
   
   "id":"tj05","name":"河北区"),
{
   
   "id":"tj06","name""红桥区"),
{
   
   "id":"tj07","name":"塘沽区"),
"id":"tj08","name":"汉沽区"),
{
   
   "id":"tj0g""name":"大港区"),
{
   
   "id":"tj10","name":"东丽区"),
"d":"tj11","name":"西青区"),
["id""tj12","name":"津南区"],
"id":"tj13","name":"北辰区"),
"d":"tj14","name":"武清区"),
"d"."tj15”"name":"宝抵区"}]

(11) 选择市,根据市的id返回的该市下的所有区县数据,JSON格式如下:

[("id":"tj16","name":"宁河县"),
"id":"tj17","name":"静海县"},
"id":"tj18","name":"蓟县"}]
目录
相关文章
|
1月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
1月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
205 4
|
2月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
2月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
104 0
|
3月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
193 2
|
3月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
213 3
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
130 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
150 1
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案