通过Ajax异步提交的方法实现从数据库获取省份和城市信息实现二级联动(xml方法)-阿里云开发者社区

开发者社区> sunshine69> 正文

通过Ajax异步提交的方法实现从数据库获取省份和城市信息实现二级联动(xml方法)

简介: 之前有写过是从JavaScript数组里获取省市信息来实现二级联动,但是似乎有很多需求是要从数据库里获取信息,所以就需要根据异步提交,局部刷新的思想来实现来提高用户交互问题 第一种方法是xml方法 1.
+关注继续查看

之前有写过是从JavaScript数组里获取省市信息来实现二级联动,但是似乎有很多需求是要从数据库里获取信息,所以就需要根据异步提交,局部刷新的思想来实现来提高用户交互问题

第一种方法是xml方法

1.首先在jsp页面的JavaScript,这段代码是通用的,所以把他放在函数外面,可以供其他的函数共同使用

 1 var xhr=false;
 2     //创建XMLHttpRequst对象
 3     if(window.XMLHttpRequest)
 4     {
 5         xhr=new XMLHttpRequest();
 6     }
 7     else if(window.ActiveXObject)
 8     {
 9         xhr=new ActiveXObject("Microsoft.XMLHTTP");
10     }
11     else
12     {
13         xhr=false;
14     }

2.获取所选择的省份value值,并将value值通过异步提交传到servlet

 1 //获取城市的信息
 2     function getCity()
 3     {
 4         //省份下拉框的对象
 5         var provinceobj=document.getElementById("province");
 6         //被选择的省份的索引
 7         var index=provinceobj.selectedIndex;
 8         //被选择的省份的value值
 9         var provincevalue=provinceobj[index].value;
10         //被选择的省份的text值
11         var province=provinceobj[index].Text;
12         alert(provincevalue);
13         var url="<%=basepath%>CityServlet";/* post请求不在url上带参数 */
14         <%-- var url="<%=basepath%>CityServlet?provincevalue="+provincevalue; --%>//get请求在url上带参数
15         xhr.open("post",url,true);//设置为post提交方式,true表示为异步提交
16         //post提交方式的时候需要设置提交的编码
17         xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
18         //当状态改变时,调用callBack_XML来判断是否需要接收数据 
19      xhr.onreadystatechange=callBack_XML;//xml方法
20     //通过post提交的时候需要将数据放到send里传到servlet里
21     xhr.send("provincevalue="+provincevalue);
22     //xhr.send(null);
23   }

3.编写回调函数callBack_XML(),此函数判断当服务器响应正常时,接收数据并作出处理

 1 function callBack_XML()//xml方法来获取
 2     {
 3         //城市下拉选择框的对象
 4         var cityobj=document.getElementById("city");
 5         //当请求状态等于4时,相应已完成,可以访问服务器响应并使用它
 6         if(xhr.readyState==4)
 7         {
 8             //当状态为200时意味着,状态正常,未出错
 9             if(xhr.status==200)
10             {
11                 alert("响应成功");
12                 //获取相应的xml文档
13                 var cityxml=xhr.responseXML;
14                 alert(cityxml);
15                 //获取根元素
16                 var root=cityxml.documentElement;
17                 //获取根元素(city_info)下面的所有city元素
18                 var cities=root.getElementsByTagName("city");
19                 //将下拉框内容清除
20                 cityobj.options.length=1;
21                 for(var i=0;i<cities.length;i++)
22                 {
23                     var city=cities[i];
24                     //获取节点的值
25                     var cid=city.childNodes[0].firstChild.nodeValue;
26                     var cname=city.childNodes[2].firstChild.nodeValue;
27                     //alert(cid+"   "+cname);
28                     //放到下拉选择框里Option(文本内容,value值);
29                     cityobj.options[cityobj.options.length]=new Option(cname,cid);
30                 }
31                 
32             }
33             //当状态为404时,表示找不到页面
34             else if(xhr.status==404)
35             {
36                 alert("Request URL is not exists!");
37             }
38             else
39             {
40                 alert("Error:Status is:"+request.status);
41             }
42         }
43         
44     }

4.在servlet页面:

 1 String provincevalue=request.getParameter("provincevalue");
 2         System.out.println("省份编号:"+provincevalue);
 3         CityService cityservice=CityService.getCityService();
 4         List<City> citylist=cityservice.getCity(provincevalue);
 5         for(int i=0;i<citylist.size();i++)
 6         {
 7             System.out.println(citylist.get(i));
 8         }
 9 
10         //生成xml页面
11         StringBuffer xml=new StringBuffer();
12         
13         xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
14         xml.append("<city_info>");
15         for(City c : citylist)
16         {
17             xml.append("<city>");
18             xml.append("<id>"+c.getId()+"</id>");
19             xml.append("<cityid>"+c.getCityid()+"</cityid>");
20             xml.append("<cityname>"+c.getCity()+"</cityname>");
21             xml.append("<province>"+c.getFather()+"</province>");
22             xml.append("</city>");
23         }
24         xml.append("</city_info>");
25         
26         //设置响应字符集编码,防止中文乱码
27         response.setCharacterEncoding("utf-8");
28         response.setContentType("text/xml;charset=utf-8");
29         //将xml文档写出去
30         PrintWriter writer=response.getWriter();
31         //因为只能写字符串,所以toString
32         writer.write(xml.toString());
33         writer.flush();
34         writer.close();
35     }

这样就完成了用xml实现异步提交和局部刷新来实现省市二级联动

接下来会有利用json来实现。

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何用 ajax 连接mysql数据库,并且获取从中返回的数据。ajax获取从mysql返回的数据。responseXML分别输出不同数据的方法。
开讲前,先说下网上,大部分的关于这方面的博文或者其他什么的,就我自己的感觉,第一说得不详细,第二语言不能很好的被初学者了解。 我这篇博文的标题之所以用了三句,是为了方便其他人好查找;       这里介绍的方法有什么用呢? 使用它,就可以无闪刷新页面,并且从数据库获取实时改变的数据反馈回界面,显示出来!是不是很爽,的确。
990 0
【曹操】 angular js双向绑定数据通过bootstrap请求获取不到表单数据
在做项目的时候,在VidyoCallFlowEntry页面中,通过name字段双击跳转弹出VidyoCallFlow页面,同时传入name的值作为参数进行查询,并展示查询结果。但在路由中获取到name的值,通过angular js双向绑定的方式赋值给VidyoCallFlow页面的vidyoname的值,发现并没有查询到结果,但是根据该name的值在数据库中查询,是有结果的。
1251 0
MySQL---数据库从入门走向大神系列(十一)-Java获取数据库/结果集的元信息、将数据表写入excel表格
数据库的元信息: 首先介绍一下数据库的元信息(元数据): 元数据(Metadata)是关于数据的数据。 元数据是描述数据仓库内数据的结构和建立方法的数据。 存储的数据是什么类型,什么驱动等等,这些描述数据的数据,就是元数据! 准备: package cn.
1294 0
[20121227]v$datafile访问是从数据文件获取信息吗.txt
[20121227]v$datafile访问是从数据文件获取信息吗.txt记得以前开始学习oracle的时候,被问及访问v$datafile从哪里获取信息,当时想都没想,从数据文件.
674 0
+关注
11
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载