ExtJS(三)--Ajax实现省份城市联动

实现Extjs4下拉三级联动与Struts2数据交互 ExtJS 4中的ComboBox组件是用于表单输入的重要工具,它不仅提供了自动完成的功能,还能增强用户体验。ComboBox组件允许用户在输入文本的同时,从下拉列表中选择预定义的选项,这有助于减少用户输入错误和加快数据输入速度。一个典型的ComboBox通常包含一个文本输入区域,一个展开箭头以及一个可选的下拉列表。在实际应用中,ComboBox组件可以非常灵活地通过配置属性来适应不同场景的需求。例如,通过设置queryMode属性,可以定义ComboBox查询模式,支持本地过滤(local。 阅读详情

        今天学习了Ajax技术,刚刚做了一个省份-城市联动的Ajax应用示例。可能很多人都已经写过了,也是一个比较简单的例子,在这里分享出来大家共同学习交流一下。希望能给到那些像我一样的菜鸟程序员参考一点帮助吧!

效果截图:

       省份-城市联动就是当你在省份下拉列表框选择一个省份的时候,旁边的城市下拉列表框就会动态地生成该省份对应的城市列表。如:省份是广东,则城市的下拉框对应显示广州、茂名、梅州等城市;省份是北京,城市的下拉列表框则显示海淀、朝阳等城市。因为我本人主要从事JavaEE的相关开发,因此这个小应用示例也就写专业一点啦!使用model2的两层架构。因为是一个小应用示例,因此没有跟数据库打交道,数据就都保存到内存中。

       好了,我讲的废话太多了,下面开始叙述省份-城市联动的开发过程。

  实施步骤:

  1. 编写后台service层。在三层架构中,层与层之间使用接口连接,因此要编写service接口。
  2. 编写后台web层的控制器servlet(省份的控制器和城市的控制器),主要负责加载后台省份和城市的数据,并将其传输到前台页面。
  3. 编写前台html静态页面,负责给用户显示数据。
  4. 编写javascript脚本程序,处理用户选择省份的请求操作。

整个应用的流程图:

 

(一)service层的接口代码

package cn.itcast.ajax.service;

import java.util.List;

public interface ProvinceCityService {
	/**
	 * 返回省份数据集合
	 * @return
	 */
	List<String> loadProvince();
	/**
	 * 根据省份返回城市的集合
	 * @param province
	 * @return
	 */
	List<String> loadCity(String province);
}

实现接口中定义的功能

package cn.itcast.ajax.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import cn.itcast.ajax.service.ProvinceCityService;

public class ProvinceCityServiceImpl implements ProvinceCityService {
	/*
	 * 因为是一个省份与城市下拉的ajax小应用实例,因此不与数据库交道了,使用map存储数据 (non-Javadoc)
	 * 
	 * @see cn.itcast.ajax.service.ProvinceService#loadProvince()
	 */
	private Map<String, List<String>> provinceMap = new HashMap<String, List<String>>();
	String[] gdCity = new String[] { "广州", "汕头", "梅州", "茂名" };
	String[] bjCity = new String[] { "海淀", "朝阳", "中关村" };

	public ProvinceCityServiceImpl() {
		provinceMap.put("广东", Arrays.asList(gdCity));
		provinceMap.put("北京", Arrays.asList(bjCity));
	}

	@Override
	public List<String> loadProvince() {
		List<String> provinces = new ArrayList<String>();
		Set<String> keySet = provinceMap.keySet();
		for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) {
			String province = iterator.next();
			provinces.add(province);
		}
		return provinces;
	}

	@Override
	public List<String> loadCity(String province) {
		return provinceMap.get(province);
	}

}

(二)控制层Servlet代码

因为需要对省份和城市分开不同处理,所以使用ProvinceServlet和CityServlet两个servlet控制器

ProvinceServlet:

package cn.itcast.ajax.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.ajax.service.ProvinceCityService;
import cn.itcast.ajax.service.impl.ProvinceCityServiceImpl;

/**
 * Servlet implementation class ProvinceServlet
 */
public class ProvinceServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private ProvinceCityService provinceService = new ProvinceCityServiceImpl();

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		List<String> provinces = provinceService.loadProvince();
		StringBuffer sb = new StringBuffer();
		sb.append("[");
		for (int i =0;i<provinces.size();i++) {
			String province = provinces.get(i);
			sb.append("\"").append(province).append("\"");
			// 如果i的值小于list的长度的时候就添加一个逗号,确保最后一个不会添加多一个逗号
			if (i < provinces.size() - 1) {
				sb.append(",");
			}
		}
		sb.append("]");
		response.setHeader("Content-Type", "text/html; charset=UTF-8");
		response.getWriter().println(sb.toString());
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
	
	public void testData() {
		List<String> provinces = provinceService.loadProvince();
		StringBuffer sb = new StringBuffer();
		sb.append("[");
		for (int i =0;i<provinces.size();i++) {
			String province = provinces.get(i);
			sb.append("\"").append(province);
			// 如果i的值小于list的长度的时候就添加一个逗号,确保最后一个不会添加多一个逗号
			if (i < provinces.size() - 1) {
				sb.append(",");
			}
		}
		sb.append("]");
		System.out.println(sb.toString());
	}

}

CityServlet:

package cn.itcast.ajax.servlet;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.ajax.service.ProvinceCityService;
import cn.itcast.ajax.service.impl.ProvinceCityServiceImpl;

/**
 * Servlet implementation class CityServlet
 */
public class CityServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private ProvinceCityService cityService = new ProvinceCityServiceImpl();

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String province = request.getParameter("province");
		List<String> citys = cityService.loadCity(province);
		StringBuffer sb = new StringBuffer("[");
		for (int i = 0; i < citys.size(); i++) {
			sb.append("\"").append(citys.get(i)).append("\"");
			if (i < citys.size() - 1) {
				sb.append(",");
			}
		}
		sb.append("]");
		response.setHeader("Content-Type", "text/html; charset=UTF-8");
		response.getWriter().println(sb.toString());
		response.getWriter().close();
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

(三)前台html静态页面province_city.html

这里要注意一点,省份的数据需要首先加载出来,添加到省份的下拉列表框中,因此在这个页面载入的时候就必须从后台加载数据出来。

<!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=UTF-8">
<title>省份-城市下拉联动</title>
<script type="text/javascript" src="province_city.js"></script>
</head>
<body>
	请选择省份:<select id="province" onchange="provinceChange()"></select>
	请选择城市:<select id="city"></select>
</body>
</html>


(四)javascript脚本程序province_city.js

// 初始化XMLHttpRequest对象
function createXmlHttpRequest() {
	var xmlhttp = null;
	try {
		// Firefox, Opera 8.0+, Safari
		xmlhttp = new XMLHttpRequest();
	} catch (e) {// IE7.0以下的浏览器以ActiveX组件的方式来创建XMLHttpRequest对象
		var MSXML = [ 'MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.5.0',
				'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP',
				'Microsoft.XMLHTTP' ];
		for ( var i = 0; i < MSXML.length; i++) {
			try {
				xmlhttp = new ActiveXObject(MSXML[i]);
				break;
			} catch (e) {

			}
		}
	}
	// 返回对象
	return xmlhttp;
}
window.onload = function() {
	loadProvinces();
};
// 加载省份数据
function loadProvinces() {
	var province = document.getElementById("province");
	//alert("sdhgjf");
	// 创建XMLHttpRequest对象
	var xhr = createXmlHttpRequest();
	// 发送请求
	xhr.open("get", "ProvinceServlet", true);
	xhr.send(null);
	// 接收服务器端传递回来的数据
	xhr.onreadystatechange = function() {
		// 判断数据是否处理完全
		if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {
			var provinces = eval("(" + xhr.responseText + ")");
			//alert(provinces);
			// 处理返回来的字符串
			var s = "<option>请选择</option>";
			for ( var i = 0; i < provinces.length; i++) {
				s+="<option>"+provinces[i]+"</option>";
			}
			province.innerHTML = s;
		}
	};
}
// 省份选择发生改变的时候的处理函数
function provinceChange() {
	// 获取当前选中的省份
	var provinces = document.getElementById("province");
	var province = provinces.options[provinces.selectedIndex].value;
	var city = document.getElementById("city");
	//alert(province);
	var xhr = createXmlHttpRequest();
	xhr.open("post", "CityServlet", true);
	// 以post方式发送请求的时候需要设置请求的方式
	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xhr.send("province="+province);
	// 处理服务器端返回来的数据
	xhr.onreadystatechange = function() {
		// 判断数据是否处理完全
		if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {
			var citys = eval("(" + xhr.responseText + ")");
			//alert(provinces);
			// 处理返回来的字符串
			var s = "<option>--</option>";// 创建一个option子元素
			for ( var i = 0; i < citys.length; i++) {// 将返回来的城市数据添加到option元素中
				s+="<option>"+citys[i]+"</option>";
			}
			city.innerHTML = s;
		}
	};
}

 

示例源代码下载

 

       因为这个小应用纯粹用于学习总结,因此写了比较多的注释,但是总体还算比较易于阅读的。





 

 

【原创】基于Extjs4的城市选择器插件 简述插件各个结构的组成部分和运行机制,最上层的是继承自Extjs自身的一个picker类,piker包含了一个tabpanel,tabpanel有山个子项即省、市、县3个tab选项卡。 从外往里说,extjs所有的这种选择器都是继承自picker类,继承这个类实现一个重要的方法createPicker 方法,在这个方法里创建一个本选择器需要用到的组件,我这里创建的是tabpanel,tabpanel继承自Ext.tab.Panel这个类没什么好说的,内部就是一些选项卡的切换以及调用方法渲染内部的选项卡;最后就是最内层的选项卡界面,这个是继承自Ext.Component这个基础类,几乎所有的Extjs内部的显示组件都是继承自这个类,这个类有一个重要的配置项就是renderTpl,这个是界面的骨架。完整这个骨架之后还得处理显示的数据,我这里是在tabpanel里面处理的,通过Extjs提供的Ajax从服务端获取数据,并将数据设置为需要渲染用到的数据最终将界面展示出来。 立即下载

相关推荐

extjs+struts2省市区三级联动完整示例

应用extjs4和struts2开发的省市区三级联动完整示例,导入myeclipse即可用,无需再导入任何jar包

Extjs二级联动

/** row1 start  */                                 {                                     layout : 'column',                                     border : false,                                     

苏叶的专栏 1508

Extjs3+MySQL后台数据库实现省份城市二级联动

NULL 博文链接:https://weijunfeng126.iteye.com/blog/784308

EXTJS6.2实现省市县级联下拉框的总结

EXTJS6.2实现省市县级联下拉框

qq_47432538的博客 703

EXT.JS常用控件集合

超好用的EXT.JS控件集合、适合EXT.JS入门的小伙伴。详细介绍

Extjs4.0 ComboBox如何实现三级联动

Extjs4.0 ComboBox如何实现三级联动,许多网友都很好奇这个问题,明确的一点是在extjs4.0中要使用load来获取数据,到底如何实现,下面小编为大家分享具体步骤

ExtJs之下拉框联动-前台纯JS实现

<br />通过extJS实现下拉框联动,即有两个下拉框,其中一个的下拉选项是根据另一个下拉框所选择的数据而变化的。现在网上有同学实现过,其实现思路是针对其中一个的下拉框的select事件编写代码,通过替换另一个下拉框store的proxy,然后重新装载实现级联的。代码如下:<br />Js代码 listeners:{            select : function(combo, record, index){          childStore.proxy= new Ext.data.Htt

3308

把群晖NAS变成游戏开发服务器:Perforce与虚幻引擎深度整合的5个关键配置(含.p4ignore模板)

本文详细介绍了如何将群晖NAS配置为游戏开发服务器,重点讲解了Perforce与虚幻引擎的深度整合。通过五个关键配置节点,包括用户权限架构、Workspace策略、资产同步优化、仓库清洁度保障和编辑器深度集成,帮助小型团队打造高效开发环境。文章还提供了实用的.p4ignore模板和优化技巧,显著提升开发效率。

weixin_30430677的博客 318

extjs 省市县级联

Ext.define('State', { extend: 'Ext.data.Model', fields: [ {type: 'string', name: 'nevalue'}, {type: 'string', name: 'contents'} ] }); ...

weixin_30634661的博客 202

MUJOCO+AUBO机械臂+强化学习+路径规划

最近在学习机械臂强化学习路径规划,参考了知乎教程。由于原教程较老(使用stable baselines3+panda-gym),新版本变化了,我略做调整,记录写在。上面这个教程用的是官方,环境封装较死(类似),最终基于重新开发。代码已开源至github:https://github.com/YellowThree-HS/mujoco-Aubo-RL-PathPlanning。

qq_63308550的博客 2044

浅谈车载控制器产线EOL实现方式

1、控制器生产产线上电路检测设计 2、客户总装产线检测设计

u012406840的博客 2万+

extjs 省市区三级联动combobox

原文地址: http://blog.youkuaiyun.com/flash8627/article/details/6453526     测试主文件JSP:     [xhtml] view plaincopy %@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

scoliver的专栏 2078

代付系统/代付系统源码/支付宝代付系统/API代付系统

简介: 其他站买的,没有做测试,源码是JAVA的,附带了安装文档,需要的拿无售后 源码下载地址https://www.skpan.cn/2QnIARSZDxG 代付系统/代付系统源码/支付宝代付系统/API代付系统 系统流程: 后台开通代理——开通商户——商户做代付(后台手工提交和 api 提交两种方式) 1、纯代付系统 2、支持个人支付宝全自动 3、支持单笔/批量/API接口方式代付 4、支持白名单、谷歌验证 5、收付款模式采用自动回调/自动转账 一、运营平台 商户管.

刀客源码网 5579

Extjs二级联动combo省城市

Extjs二级联动 Extjs combox根据省查询城市 实现效果如上图所示, store层代码: 1 Ext.define("ExtApp.store.TeacherProvince",{ 2 extend:"Ext.data.Store", 3 fields:['provinceCode','provinceName'], 4 a...

weixin_30457465的博客 124

Python爬虫实战:中国土地市场网招拍挂数据抓取与分析

本文详细介绍了如何使用Python爬虫技术从中国土地市场网抓取土地招拍挂数据,并进行初步的数据分析与可视化。文章涵盖了爬虫的基本原理、反爬虫策略应对、数据清洗与存储、数据分析与可视化等多个方面,为土地市场研究者提供了一套完整的数据获取与分析解决方案。

2201_76125261的博客 684

innovus:insert Power Switch失败,报告not covered by a row问题解析

这个问题就是switch找不到可以放置的row,分析就从两方面入手,一方面从voltage area下手,一方面从row和site入手。检查发现voltage area设置正确,row也存在,只不过lef里缺少对应switch的双倍高的site。更多学习内容请关注「拾陆楼」知识星球。

m0_61544122的博客 1159

ext中ComboBox+Ajax+分页联动代码和注释

今天花了1下午时间研究出了ComboBox+Ajax+分页联动效果.ext学习初步见效 下面代码直接就能运行,用list模拟了数据库中取数据 以下是目录结构  以下是代码 test1.jsp &lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt; &lt;!DOCTYPE HTML PUBLI...

wangwei2210 275

SPAD IMX479规格_分辨率

当然IMX479具备IMX459几乎全部的数字架构,但也有一个缺点就是贵,这个让头部的主机厂有些犹豫,毕竟大家都在集中火力想把车载LiDAR玩进千元机。如果用一片IMX479是不太可能实现千元内部的,当然国产也在奋起直追,特别在前面的几家SPAD厂商都具备开发IMX479的实力,但相对来说落地可能更是当下所考虑的,IMX479的迭代是基于IMX459,小编已经注意到国内有一两家已经在挑战479的规格了,如果国产SPAD没有大规模量产就直接流片IMX479的规格,可能就有点忽略市场的反馈闭环。

致力于lidar应用开发 2417

Extjs4---combobox省市区三级联动+struts2

欢迎光临我的小站,共同学习交流技术:http://www.luchg.com 只是做了个小例子,数据是写死在Action里面的 完整代码下载地址:http://www.luchg.com/resource/showResource_1.html combobox.js代码: Ext.onReady( function(){ Ext.define( 'model

lc448986375的专栏 6201

【图像超分】论文复现:CVPR 2024 | 轻量化超分 | 窗口注意力改进 | CAMixerSR的Pytorch源码复现,跑通源码,获得指标和超分结果,计算复杂度,架构梳理拆解,逐行注释!

本文介绍了超分辨率重建方法CAMixerSR的代码实现与运行指南。文章亮点包括:完整跑通源码获取PSNR/SSIM指标和可视化结果;详细解析模型架构与关键代码注释,帮助快速复现基线模型。实验部分提供了测试配置文件和训练设置说明,支持2K/4K/8K大图像超分和x2/x4轻量化超分。环境依赖PyTorch和BasicSR框架,数据集包含DIV2K等常用基准。测试结果与论文指标一致,可视化输出保存至指定目录。训练配置可自定义数据集路径、GPU数量等参数。该实现突出了CAMixerSR在降低W-MSA复杂度方面的

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 438

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jquery 简单2级联动

复习了一下JQUERY,做了一个JQUERY 实现的2级别联动,主要联系了一下JQUERY 的ajax功能,代码后台数据写死数据结构和之前我的EXTJS2级联动一样采用JSON 数据传输,代码框架也只直接从EXTJS2级联动代码中复制过来的 算是struts2+jquery +json吧    主要代码介绍   $(function(){ $.ajax({ ...

个人技术 263

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

extjs 点击下拉框三角形触发事件_省市县三级联动下拉框的具体实现

功能需求: ①页面中有三个下拉框选项,分别为省下拉框,市下拉框,区/县下拉框 ②选择省,则市下拉框中出现对应的该省下的市信息,选择市则区/县下拉框中出 现对应的该市下面的区/县信息。需求分析(思路): ①创建页面:页面中有三个下拉框,分别为省,市,区/县 ②页面加载成功发起ajax请求,请求省的信息,并将响应结果填充到省下拉框中 ③选择省触发一个新的js函数的执行,该函数中发起新的ajax请求,...

weixin_30767895的博客 233

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Ext 热门城市选择器

/** * ######################################### * ####### 热门城市选择器 开始 ####### * 取值时请用 selectedValue selectedText * value rawValue : * 还不清楚是哪里导致始终为展示的汉字... * #################...

weixin_30653097的博客 108

用ext读取XML写一个“省-市-邮编”三级联动

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt; &lt;html&gt; &lt;head&gt; &lt;link type="text/css" rel="stylesheet" href="js/ext/resources/css/ext-all.css"

rzy 165

ExtJS了解

Ext资源搜集 1 Ext实例部分: Extjs2.0之横向Radio经典布局 EXT2.0 下拉树例子 EXT2.0 checkbox树的扩展(支持单选,级联多选,只选叶子等) 用Ext 2.0 combobox 做的省份和城市联动选择框 EXT.FORM提交后的数据返回 Ext2.0 学习系列(转) ------- Ext Grid (一) Ext2.0 学习系列

mike_caoyong的专栏 1216
上一篇: ExtJS(二)--AJAX基础
下一篇: ExtJS梦想之旅(一)--第一个ExtJS程序(HelloWorld)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seven的代码实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值