ajax下拉列表联动 spring,使用jQuery+spring+json实现二级联动菜单

实现效果

6661991e20f9

GIF.gif

1 创建项目及准备工作

DAY11-01-AJAX-DropDownMenu Maven的war项目

导入springmvc和jackson的jar包

pom.xml

org.springframework

spring-webmvc

3.2.8.RELEASE

com.fasterxml.jackson.core

jackson-core

2.2.3

com.fasterxml.jackson.core

jackson-annotations

2.2.3

com.fasterxml.jackson.core

jackson-databind

2.2.3

web.xml

CharacterEncodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

utf-8

CharacterEncodingFilter

/*

SpringMVC

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:applicationContext.xml

1

SpringMVC

*.do

applicationContext.xml

class="org.springframework.http.converter.StringHttpMessageConverter">

text/html;charset=utf-8

application/json;charset=utf-8

*/*;charset=utf-8

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

2 设计数据

----- 请选择 -----

1.广东省 1.广州,2.深圳,3.珠海

2.河北省 4.石家庄,5.保定,6.秦皇岛

3 设计服务端的功能:

URL : getCities.do

请求类型:GET

参数:provinceId

返回:ResponseResult,其中的数据部分是List,City中至少封装id,name

a) 创建cn.tedu.spring.bean.ResponseResult,属性包括:int state,String message,Object data;

package cn.tedu.spring.bean;

public class ResponseResult {

private int state;

private String message;

private Object data;

public ResponseResult() {

super();

}

public ResponseResult(int state) {

super();

this.state = state;

}

public ResponseResult(int state, String message) {

super();

this.state = state;

this.message = message;

}

public ResponseResult(int state, Object data) {

super();

this.state = state;

this.data = data;

}

public ResponseResult(int state, String message, Object data) {

super();

this.state = state;

this.message = message;

this.data = data;

}

public int getState() {

return state;

}

public void setState(int state) {

this.state = state;

}

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

public Object getData() {

return data;

}

public void setData(Object data) {

this.data = data;

}

}

b) 创建cn.tedu.spring.bean.City,属性包括:int id,String name;

package cn.tedu.spring.bean;

public class City {

private int id;

private String name;

public City() {

super();

}

public City(int id, String name) {

super();

this.id = id;

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

c) 创建cn.tedu.spring.controller.CityController,添加public String getCities(int provinceId)方法,映射到getCites.do路径,在方法内部,根据参数provinceId进行判断,然后得到List,封装到ResponseResult中,最后转换为JSON字符串,作为方法的返回值

@Controller

public class CityController {

@RequestMapping("getCities.do")

@ResponseBody

public String getCities(int provinceId){

List cityes = new ArrayList();

switch (provinceId){

case 1:

cityes.add(new City(1,"广州"));

cityes.add(new City(2,"深圳"));

cityes.add(new City(3,"珠海"));

case 2:

cityes.add(new City(4,"石家庄"));

cityes.add(new City(5."保定"));

cityes.add(new City(6,"秦皇岛"));

break;

default:

break;

}

}

}

6661991e20f9

2017-12-26 20-27-20.png

d) 通过浏览器测试

6661991e20f9

2017-12-26 20-27-35屏幕截图.png

6661991e20f9

2017-12-26 20-28-15屏幕截图.png

4 创建前端页面index.html,并添加2个下拉菜单,其中第1个下拉菜单中添加1广东省、2河北省这2个有效选项。

Ajax -- 二级联动菜单

----- 请选择 -----

广东省

河北省

5 设计AJAX请求

Ajax -- 二级联动菜单

function $(id) {

return document.getElementById(id);

}

function getXMLHttpRequest() {

var xmlhttp = null;

if (window.XMLHttpRequest) {

xmlhttp = new XMLHttpRequest();

} else {

xmlhttp = new ActiveObject("Microsoft.XMLHttp");

}

return xmlhttp;

}

function getCities(provinceId) {

// 无论选中哪个选项,先清空“城市”列表

while ($("cities").firstChild) {

$("cities").removeChild($("cities").firstChild);

}

// 判断provinceId是否有效

if (provinceId == 0) {

return;

}

// 获取XMLHttpRequest

var xmlhttp = getXMLHttpRequest();

// 设计响应函数

xmlhttp.onreadystatechange = function() {

if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {

// 获取响应的正文文本

var text = xmlhttp.responseText;

// 将响应的正文文本转换为JSON对象

var jsonObject = JSON.parse(text);

// 判断JSON对象中state是否正确

if (jsonObject.state == 1) {

// 遍历JSON对象中的data对应的数组

for (var i = 0; i < jsonObject.data.length; i++) {

// 将数组中的每个数据设计为一个个

var opt = document.createElement("option");

// 珠海

// "data":[

// {"id":1,"name":"广州"},

// {"id":2,"name":"深圳"},

// {"id":3,"name":"珠海"}

// ]

opt.value = jsonObject.data[i].id;

opt.innerHTML = jsonObject.data[i].name;

// 将添加到“城市”列表中

$("cities").appendChild(opt);

}

}

}

};

// 发出请求

var url = "getCities.do?provinceId=" + provinceId;

xmlhttp.open("GET", url, true);

xmlhttp.send();

}

----- 请选择 -----

广东省

河北省

测试效果

6661991e20f9

2017-12-27 21-01-08屏幕截图.png

6661991e20f9

2017-12-27 21-02-55 的屏幕截图.png

AJAX的数据缓存问题

如果反复向同一个URL发出请求,并且请求参数没有发生变化的话,可能会获取到缓存的数据,即获取到的不是最新数据!

针对这个问题的解决方案:使得每次请求参数都不同!例如为每次的请求多添加1个参数,参数名可以自定义,参数值使用随机数即可!

jQuery AJAX 实现二级联动

JQuery AJAX - load()

在使用了JQuery后,关于AJAX的应用也得到了极大的简化,通过load()函数可以快速的提交AJAX的异步请求,并且将响应的结果填充到某个标签中。

注意:这种做法适用于(但不局限于)将结果直接填充到标签中!

这种做法的语法格式是:

$(选择器).load(URL,参数);

在以上语法中,$(选择器)表示需要将结果填充到哪个标签中,URL表示请求路径,参数表示发出请求时向服务器提交的参数,参数值的格式可以是字符串格式,例如:

username=tomcat&password=123456

参数值的格式还可以是JSON对象格式:

{"username":"tomcat","password":"123456"}

其实,load()函数的完整格式是:

$(选择器).load(URL,参数,处理响应结果的函数);

也就是说,load()函数还可以有第3个参数,第3个参数是一个函数,专门用于处理结果,类似于传统方式中的xmlhttp.onreadystatechange属性的值。

另外,其实在jQuery中,还有另一个也叫做load()的函数,也是被某个标签对象所调用的,但是,其参数是某个函数,用于表示标签加载完成时的自定义处理,这2个load()函数,至于执行的是哪个,取决于参数的设计。

1 引入jQuery

6661991e20f9

2017-12-27 21-05-47屏幕截图.png

2 添加load.html页面,使用load()函数提交AJAX请求

load.html

JQuery AJAX -- load

function loadContent(){

$("#content").load("getCities.do","provinceId=1");

}

3 测试效果

6661991e20f9

2017-12-27 21-31-30屏幕截图.png

jQuery AJAX - ajax()

在使用jQuery时,通过ajax()函数可以设置AJAX请求过程中所有的可设置项!

使用ajax()的基本语法是:

$.ajax({配置});

以上语法中,“配置”及左右两侧的{}整体表现为一个JSON对象格式。

在“配置”中,通常会设置的属性有:

url:请求的路径

例如:

$.ajax({

"url":"getCities.do",

"success":function(obj){

}

});

还会设置的属性有:

type:请求的类型(请求方式),取值为"GET"或"POST"

data:请求的参数,参数值可以是字符串格式的,也可以是JSON对象格式的

dataType:响应结果的数据的类型,常用的取值有"text"、"json",当取值为"text"时,后续success属性对应的处理函数中的参数将是字符串类型的,当取值为"json"时,后续success属性对应的处理函数中参数将是JSON对象

success:成功得到响应结果时的处理函数,即该属性的值是某个函数,该函数仅会在成功得到响应结果后被调用,所以,在函数内部,无须再判断状态码为4或响应码为200,并且,在编写处理函数时,请为该函数添加参数,参数名称可自行定义,参数将是成功得到响应结果时的响应结果,类似于xmlhttp.responseTest

在配置以上属性时,不区分先后顺序,即先配置哪个,并没有要求!

除此以外,ajax()函数还可以配置许多属性,如有需要,请参考相关文档。

1 使用$.ajax({配置});提交AJAX请求

JQuery Ajax -- 二级联动菜单

// 为了便于可能存在的事件绑定,

// 凡是与事件相关的函数,

// 能不定义参数就不要定义参数

// 对于那些动态的、可能变化的值,

// 推荐在函数内部去动态获取

function getCities(){

// 清空“城市”的下拉列表

$("#cities").empty(); // 相当于 innerHTML=""

// 获取当前选中的“省份”的value

var pid = $("#provinces").val();

// 如果获取到的是0,则不处理

if(pid == 0){

return;

}

// 发出请求并处理响应结果

$.ajax({

"url":"getCities.do", // 请求地址

"type":"GET", // 请求方式

"data":"provinceId="+pid, // 请求参数

"dataType":"json", // 服务器返回的数据类型

"success":function(obj){ // 服务器处理正常对应的回调函数

// 判断JSON对象中的state

if(obj.state == 1){

//"data":[

// {"id":1,"name":"广州"},

// {"id":2,"name":"深圳"},

// {"id":3,"name":"珠海"}

//]

// 遍历JSON对象中的data(数组)

for(var i = 0;i

// 创建的HTML代码(字符串)

var op = ""+obj.data[i].name+""

// 将的HTML代码添加到"城市"下拉菜单

$("#cities").append(op);

}

}

}

});

}

jQuery Ajax -- 二级联动菜单

----- 请选择 -----

广东省

河北省

2 测试效果

6661991e20f9

2017-12-27 21-32-18屏幕截图.png

3 动态效果

6661991e20f9

GIF.gif

回顾

[*****] HTML

用于规划网页内容,需要掌握有哪些标签,什么时候用什么标签,什么样的标签默认有什么样式

[***] CSS

[***] Javascript

处理界面与用户的交互

[***] jQuery

[*****] jQuery AJAX

[***] Servlet

用于接收用户的请求,并向客户返回响应结果。

需要掌握:定位、注册、注册时配置参数

[**] Filter

用于对请求进行过滤,运行在Servlet之前

需要掌握:字符编码过滤器

[*****] JSP

向客户端提供响应的视图

需要掌握:EL、JSTL

a + b

a > b

EL是表达式,JSTL进行逻辑处理

[*****] SQL

需要掌握:创建库、创建表、增删改查、关联表查询、事务

需要了解:聚合函数、Having、Group By、存取过程、触发器

[*****] Spring

Spring解决了创建对象的问题,使得开发者可以不通过new语法获取对象。

DI(依赖注入)是实现的手段,IOC(控制反转)是最终的实现效果。

*****] Spring MVC

Spring MVC提供完整的接收请求、分发请求、响应请求的机制,最终表现为开发者可以自定义Controller类,并在Controller自定义方法去处理请求。

[*****] Mybatis

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
实现三级联动的基本思路是通过Ajax技术实现异步请求后端数据,然后动态生成页面元素实现级联效果。下面是一个Spring MVC+JSP实现三级联动的示例代码: 1. 前端JSP页面 ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>三级联动示例</title> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ // 加载省份列表 $.ajax({ url: "${pageContext.request.contextPath}/province", type: "GET", success: function(data){ var provinceList = JSON.parse(data); var html = ""; for(var i=0; i<provinceList.length; i++){ html += "<option value='"+provinceList[i].id+"'>"+provinceList[i].name+"</option>"; } $("#province").html(html); } }); // 根据省份id加载城市列表 $("#province").change(function(){ var provinceId = $(this).val(); $.ajax({ url: "${pageContext.request.contextPath}/city/"+provinceId, type: "GET", success: function(data){ var cityList = JSON.parse(data); var html = ""; for(var i=0; i<cityList.length; i++){ html += "<option value='"+cityList[i].id+"'>"+cityList[i].name+"</option>"; } $("#city").html(html); } }); }); // 根据城市id加载区县列表 $("#city").change(function(){ var cityId = $(this).val(); $.ajax({ url: "${pageContext.request.contextPath}/district/"+cityId, type: "GET", success: function(data){ var districtList = JSON.parse(data); var html = ""; for(var i=0; i<districtList.length; i++){ html += "<option value='"+districtList[i].id+"'>"+districtList[i].name+"</option>"; } $("#district").html(html); } }); }); }); </script> </head> <body> <select id="province"> <option value="">请选择省份</option> </select> <select id="city"> <option value="">请选择城市</option> </select> <select id="district"> <option value="">请选择区县</option> </select> </body> </html> ``` 2. 后端Controller代码 ```java @Controller public class RegionController { @Autowired private RegionService regionService; @RequestMapping(value="/province", method=RequestMethod.GET) @ResponseBody public String getProvinceList(){ List<Province> provinceList = regionService.getProvinceList(); return JSON.toJSONString(provinceList); } @RequestMapping(value="/city/{provinceId}", method=RequestMethod.GET) @ResponseBody public String getCityList(@PathVariable("provinceId") String provinceId){ List<City> cityList = regionService.getCityList(provinceId); return JSON.toJSONString(cityList); } @RequestMapping(value="/district/{cityId}", method=RequestMethod.GET) @ResponseBody public String getDistrictList(@PathVariable("cityId") String cityId){ List<District> districtList = regionService.getDistrictList(cityId); return JSON.toJSONString(districtList); } } ``` 3. Service层代码 ```java @Service public class RegionServiceImpl implements RegionService { @Autowired private RegionDao regionDao; @Override public List<Province> getProvinceList() { return regionDao.getProvinceList(); } @Override public List<City> getCityList(String provinceId) { return regionDao.getCityList(provinceId); } @Override public List<District> getDistrictList(String cityId) { return regionDao.getDistrictList(cityId); } } ``` 4. DAO层代码 ```java @Repository public class RegionDaoImpl implements RegionDao { @Autowired private JdbcTemplate jdbcTemplate; @Override public List<Province> getProvinceList() { String sql = "select province_id, province_name from tb_province"; List<Province> provinceList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Province>(Province.class)); return provinceList; } @Override public List<City> getCityList(String provinceId) { String sql = "select city_id, city_name from tb_city where province_id=?"; List<City> cityList = jdbcTemplate.query(sql, new Object[]{provinceId}, new BeanPropertyRowMapper<City>(City.class)); return cityList; } @Override public List<District> getDistrictList(String cityId) { String sql = "select district_id, district_name from tb_district where city_id=?"; List<District> districtList = jdbcTemplate.query(sql, new Object[]{cityId}, new BeanPropertyRowMapper<District>(District.class)); return districtList; } } ``` 其中Province、City和District是数据实体类,包含id和name两个属性。以上代码只是一个简单示例,实际项目中需要根据具体需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值