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

    之前有写过是从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来实现。

  • 相关阅读:
    Centos6.5下本地yum源及局域网yum源配置
    计算机网络之应用层_part -3
    计算机网络之应用层_part -2
    计算机网络之应用层_part -1
    LeetCode-Minimum Path Sum[dp]
    LeetCode-Interleaving String[dp]
    LeetCode-Best Time to Buy and Sell Stock III[dp]
    LeetCode-Palindrome Partitioning II[dp]
    用hexo + github 快速搭建个人博客,由于刚搭建好,有点小激动,就分享下,不好的地方还请指出,谢谢
    搭建node.js 本地服务器
  • 原文地址:https://www.cnblogs.com/sunshine6/p/6043739.html
Copyright © 2011-2022 走看看