User-Profile-Image
hankin
  • 5
  • Java
  • Kotlin
  • Spring
  • Web
  • SQL
  • MegaData
  • More
  • Experience
  • Enamiĝu al vi
  • 分类
    • Zuul
    • Zookeeper
    • XML
    • WebSocket
    • Web Notes
    • Web
    • Vue
    • Thymeleaf
    • SQL Server
    • SQL Notes
    • SQL
    • SpringSecurity
    • SpringMVC
    • SpringJPA
    • SpringCloud
    • SpringBoot
    • Spring Notes
    • Spring
    • Servlet
    • Ribbon
    • Redis
    • RabbitMQ
    • Python
    • PostgreSQL
    • OAuth2
    • NOSQL
    • Netty
    • MySQL
    • MyBatis
    • More
    • MinIO
    • MegaData
    • Maven
    • LoadBalancer
    • Kotlin Notes
    • Kotlin
    • Kafka
    • jQuery
    • JavaScript
    • Java Notes
    • Java
    • Hystrix
    • Git
    • Gateway
    • Freemarker
    • Feign
    • Eureka
    • ElasticSearch
    • Docker
    • Consul
    • Ajax
    • ActiveMQ
  • 页面
    • 归档
    • 摘要
    • 杂图
    • 问题随笔
  • 友链
    • Spring Cloud Alibaba
    • Spring Cloud Alibaba - 指南
    • Spring Cloud
    • Nacos
    • Docker
    • ElasticSearch
    • Kotlin中文版
    • Kotlin易百
    • KotlinWeb3
    • KotlinNhooo
    • 前端开源搜索
    • Ktorm ORM
    • Ktorm-KSP
    • Ebean ORM
    • Maven
    • 江南一点雨
    • 江南国际站
    • 设计模式
    • 熊猫大佬
    • java学习
    • kotlin函数查询
    • Istio 服务网格
    • istio
    • Ktor 异步 Web 框架
    • PostGis
    • kuangstudy
    • 源码地图
    • it教程吧
    • Arthas-JVM调优
    • Electron
    • bugstack虫洞栈
    • github大佬宝典
    • Sa-Token
    • 前端技术胖
    • bennyhuo-Kt大佬
    • Rickiyang博客
    • 李大辉大佬博客
    • KOIN
    • SQLDelight
    • Exposed-Kt-ORM
    • Javalin—Web 框架
    • http4k—HTTP包
    • 爱威尔大佬
    • 小土豆
    • 小胖哥安全框架
    • 负雪明烛刷题
    • Kotlin-FP-Arrow
    • Lua参考手册
    • 美团文章
    • Java 全栈知识体系
    • 尼恩架构师学习
    • 现代 JavaScript 教程
    • GO相关文档
    • Go学习导航
    • GoCN社区
    • GO极客兔兔-案例
    • 讯飞星火GPT
    • Hollis博客
    • PostgreSQL德哥
    • 优质博客推荐
    • 半兽人大佬
    • 系列教程
    • PostgreSQL文章
    • 云原生资料库
    • 并发博客大佬
Help?

Please contact us on our email for need any support

Support
    首页   ›   Web   ›   Ajax   ›   正文
Ajax

Ajax——省市联动

2020-03-07 20:08:25
730  0 0

阅读完需:约 5 分钟

这个是Ajax与xml的数据交互!

jsp页面:

  <body>
 	<h1>省市联动</h1> 
    <select name="province" id="p">
    	<option>===请选择省===</option>
    </select>
     <select name="city" id="c">
    	<option>===请选择市===</option>
    </select>
  </body>

jsp里的常规第一步:

function createXMLHttpRequest(){
			try {
				return new XMLHttpRequest();//大多数游览器
			} catch (e) {
				try {
					return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
				} catch (e) {
					try {
						return ActvieXObject("Microsoft.XMLHTTP");//IE5.5以及更早
					} catch (e) {
						alert("错误");
						throw e;
					}
				}
			}
			
		}

第一件事情:

	//1.在文档加载完毕时得到请求,得到所有的省份显示<select name="province">
	//2.在选择了新的省份时,发送请求(省份的名字)得到xml文档,即<province>元素
	//解析xml文档,得到其中所有的<city>,再得到<city>元素的内容,生成<option>,插入到<select>里
	
	window.onload=function(){
		/*
			ajax四步骤
		*/
		var xmlHttp= createXMLHttpRequest();
		xmlHttp.open("GET","oop",true);
		xmlHttp.send(null);
		xmlHttp.onreadystatechange=function(){
			if(xmlHttp.readyState==4 && xmlHttp.status==200){
				//获取服务器的响应
				
				var text=xmlHttp.responseText;
				
				//得到数组
				var arr=text.split(",");
				alert(arr);
				//循环遍历每个省份的名称,每个名称生成一个option对象,添加<select>中
				for(var i=0;i<arr.length;i++){
					var op=document.createElement("option");//创建一个指定名称的元素
					op.value=arr[i]; //设置op的实际值为省份
					var textNode=document.createTextNode(arr[i]);//创建文本节点
					op.appendChild(textNode);
					//appendChild() 方法可向节点的子节点列表的末尾添加新的子节点。
					document.getElementById("p").appendChild(op);
				}				
			}
		};
		

第二件事情:

给添加改变监听 使用选择省份的名字请求city,得到元素 获得元素中所有的元素,遍历之,获得每个的文本内容,即市名 使用每个市名创建元素添加到里

var pro=document.getElementById("p");
		pro.onchange=function(){
			var xmlHttp= createXMLHttpRequest();
			xmlHttp.open("POST","city",true);
			xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			xmlHttp.send("pname="+pro.value);//把列表的值给服务器
			
			xmlHttp.onreadystatechange=function(){
				if(xmlHttp.readyState==4 && xmlHttp.status==200){
					/* 
					清空select中的元素
					
					*/
					var cityslect=document.getElementById("c");
					//获取子元素
					var option=cityslect.getElementsByTagName("option");
					while(option.length>1){
						cityslect.removeChild(option[1]);//总是删除第一个下标
					}
					var doc=xmlHttp.responseXML;
					
					var citylist=doc.getElementsByTagName("city");
					
					for(var i=0;i<citylist.length;i++){
						var cityele=citylist[i];//得到每个city
						var cityName;
						
						//获取市的名称
						if(window.addEventListener){//识别游览器的差异
							cityName=cityele.textContent;
						}else{
							cityName=cityele.text;//支持IE
						}
						
						//用市名称创建元素,添加到<select>
						var op=document.createElement("option");
						op.value=cityName;
						//创建文本节点
						var textNode=document.createTextNode(cityName);
						op.appendChild(textNode);//把文本节点追加到op中
						
						//把op添加到<select>中
						
						cityslect.appendChild(op);
						
					}
				}
			};
		};
		

oop.java——servlet文件

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
//		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		//省的信息
				/* 
				 * 1.得到domcunt对象
				 * 创建解析器
				 * 调用解析器,传递一个流对象,到底是domcunt
				 * 
				 * */
				
				try {
					SAXReader reader=new SAXReader();
					InputStream input=this.getClass().getResourceAsStream("/china.xml");
					Document doc=reader.read(input);
					/*
					 * 查询所有的province的name属性,得到一堆字符串
					 * 遍历循环,把所有的属性连接成一共字符串,发送给客户端
					 * 
					 * */
					List <Attribute> arrList=doc.selectNodes("//province/@name");
					StringBuilder sb=new StringBuilder();
					for(int i=0;i<arrList.size();i++){
						sb.append(arrList.get(i).getValue());//把每个属性的值放在sb中
						if(i<arrList.size()-1){
							sb.append(",");
						}
					}
					response.getWriter().print(sb);
					
				} catch (Exception e) {
					throw new RuntimeException(e);
					
				}
		}

city.java——servlet文件

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/xml;charset=utf-8");
		/*
		 * 获取省份名称,加载该省对应的<province>元素
		 * 把元素转化成字符串发送给客户端
		 * 
		 * 获取省份的名称
		 * 使用省份名称查找对应的<provice>元素
		 * 把<provice>元素转换成字符串,发送!
		 * 
		 * */
		
		try {
			SAXReader reader=new SAXReader();
			InputStream inputStream=this.getClass().getResourceAsStream("/china." +
					"xml");
			Document document=reader.read(inputStream);
			
			String pname=request.getParameter("pname");
			Element pElement=(Element) document.selectSingleNode("//province[@name='"+pname+"']");
			String xmlString=pElement.asXML();//把元素转换成字符串
			//如Document 对象的document.asXML()就是将整个文件组成一个String了,
			//而Element对象的element.asXML();指的是这个节点(元素)的开始到结束包含的内容组成String
			response.getWriter().print(xmlString);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
	}

最后是xml数据的配置

<?xml version="1.0" encoding="UTF-8"?>
<china>
	<province name="北京">
	<city>东城区</city>
	<city>西城区</city>
	<city>南城区</city>
	<city>北城区</city>
	<city>房山区</city>
	<city>平谷区</city>
	<city>通州区</city>
	<city>阿瑟区</city>
	<city>掉风区</city>
	<city>身份区</city>
	<city>分割区</city>
	<city>考恐区</city>
	</province>
	
	<province name="天津">
	<city>和平区</city>
	<city>汉沽区</city>
	<city>北城区</city>
	<city>境内区</city>
	<city>大纲区</city>
	<city>河东区</city>
	<city>动力区</city>
	<city>虹桥区</city>
	<city>阿萨区</city>
	<city>发广区</city>
	<city>乱伦区</city>
	<city>品牌区</city>
	</province>


</china>

运行结果:

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

0 打赏
Enamiĝu al vi
不要为明天忧虑.因为明天自有明天的忧虑.一天的难处一天当就够了。
543文章 68评论 294点赞 594112浏览

随机文章
Kotlin-协程(专)—Flow 篇(四十一)
4年前
MyBatis笔记11—resultMap+分页
5年前
Kotlin-内置类型—区间(四)
4年前
Java—ArrayList源码走一波
5年前
Axios的简单使用
5年前
博客统计
  • 日志总数:543 篇
  • 评论数目:68 条
  • 建站日期:2020-03-06
  • 运行天数:1927 天
  • 标签总数:23 个
  • 最后更新:2024-12-20
Copyright © 2025 网站备案号: 浙ICP备20017730号 身体没有灵魂是死的,信心没有行为也是死的。
主页
页面
  • 归档
  • 摘要
  • 杂图
  • 问题随笔
博主
Enamiĝu al vi
Enamiĝu al vi 管理员
To be, or not to be
543 文章 68 评论 594112 浏览
测试
测试
看板娘
赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付