AJAX案例四:省市联动

Posted 凌晨三点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AJAX案例四:省市联动相关的知识,希望对你有一定的参考价值。

  1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3 
  4 
  5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  6 <html>
  7   <head>
  8     <title>My JSP \'ajax5.jsp\' starting page</title>
  9     
 10     <meta http-equiv="pragma" content="no-cache">
 11     <meta http-equiv="cache-control" content="no-cache">
 12     <meta http-equiv="expires" content="0">    
 13     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 14     <meta http-equiv="description" content="This is my page">
 15     <!--
 16     <link rel="stylesheet" type="text/css" href="styles.css">
 17     -->
 18 <script type="text/javascript">
 19 function createXMLHttpRequest() {
 20     try {
 21         return new XMLHttpRequest();//大多数浏览器
 22     } catch (e) {
 23         try {
 24             return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
 25         } catch (e) {
 26             try {
 27                 return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本    
 28             } catch (e) {
 29                 alert("用的是什么浏览器啊?");
 30                 throw e;
 31             }
 32         }
 33     }
 34 }
 35 /*
 36  * 1. 在文档加载完毕时发送请求,得到所有省份名称,显示在<select name="province"/>中
 37  * 2. 在选择了新的省份时,发送请求(参数为省名称),得到xml文档,即<province>元素
 38  *   解析xml文档,得到其中所有的<city>,再得到每个<city>元素的内容,即市名,使用市名生成<option>,插入到<select name="city">元素中
 39  */
 40 
 41 window.onload = function() {
 42     /*
 43     ajax四步,请求ProvinceServlet,得到所有省份名称
 44     使用每个省份名称创建一个<option>元素,添加到<select name="province">中
 45     */
 46     var xmlHttp = createXMLHttpRequest();
 47     xmlHttp.open("GET", "<c:url value=\'/ProvinceServlet\'/>", true);
 48     xmlHttp.send(null);
 49     xmlHttp.onreadystatechange = function() {
 50         if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
 51             // 获取服务器的响应
 52             var text = xmlHttp.responseText;
 53             // 使用逗号分隔它,得到数组
 54             var arr = text.split(",");
 55             // 循环遍历每个省份名称,每个名称生成一个option对象,添加到<select>中
 56             for(var i = 0; i < arr.length; i++) {
 57                 var op = document.createElement("option");//创建一个指名名称元素
 58                 op.value = arr[i];//设置op的实际值为当前的省份名称
 59                 var textNode = document.createTextNode(arr[i]);//创建文本节点
 60                 op.appendChild(textNode);//把文本子节点添加到op元素中,指定其显示值
 61                 
 62                 document.getElementById("p").appendChild(op);
 63             }
 64         }
 65     };
 66     
 67     
 68     /*
 69     第二件事情:给<select name="province">添加改变监听
 70     使用选择的省份名称请求CityServlet,得到<province>元素(xml元素)!!!
 71     获取<province>元素中所有的<city>元素,遍历之!获取每个<city>的文本内容,即市名称
 72     使用每个市名称创建<option>元素添加到<select name="city">
 73     */
 74     var proSelect = document.getElementById("p");
 75     proSelect.onchange = function() {
 76         var xmlHttp = createXMLHttpRequest();
 77         xmlHttp.open("POST", "<c:url value=\'/CityServlet\'/>", true);
 78         xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 79         xmlHttp.send("pname=" + proSelect.value);//把下拉列表中选择的值发送给服务器!
 80         xmlHttp.onreadystatechange = function() {
 81             if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
 82                 /*
 83                 把select中的所有option移除(除了请选择)
 84                 */
 85                 var citySelect = document.getElementById("c");
 86                 // 获取其所有子元素
 87                 var optionEleList = citySelect.getElementsByTagName("option");
 88                 // 循环遍历每个option元素,然后在citySelect中移除
 89                 while(optionEleList.length > 1) {//子元素的个数如果大于1就循环,等于1就不循环了!
 90                     citySelect.removeChild(optionEleList[1]);//总是删除1下标,因为1删除了,2就变成1了!
 91                 }
 92                 
 93                 
 94                 var doc = xmlHttp.responseXML;
 95                 // 得到所有名为city的元素
 96                 var cityEleList = doc.getElementsByTagName("city");
 97                 // 循环遍历每个city元素
 98                 for(var i = 0; i < cityEleList.length; i++) {
 99                     var cityEle = cityEleList[i];//得到每个city元素
100                     var cityName;
101                     // 获取市名称
102                     if(window.addEventListener) {//处理浏览器的差异
103                         cityName = cityEle.textContent;//支持FireFox等浏览器
104                     } else {
105                         cityName = cityEle.text;//支持IE
106                     }
107                     
108                     // 使用市名称创建option元素,添加到<select name="city">中
109                     var op = document.createElement("option");
110                     op.value = cityName;
111                     // 创建文本节点
112                     var textNode = document.createTextNode(cityName);
113                     op.appendChild(textNode);//把文本节点追加到op元素中
114                     
115                     //把op添加到<select>元素中
116                     citySelect.appendChild(op);
117                 }
118             }
119         };        
120     };
121 };
122 </script>
123   </head>
124   
125   <body>
126 <h1>省市联动</h1>
127 <select name="province" id="p">
128   <option>===请选择省===</option>
129 </select>
130    
131 <select name="city" id="c">
132   <option>===请选择市===</option>
133 </select>
134   </body>
135 </html>
index.jsp
 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 import org.dom4j.Document;
10 import org.dom4j.Element;
11 import org.dom4j.io.SAXReader;
12 
13 public class CityServlet extends HttpServlet {
14 
15     public void doPost(HttpServletRequest request, HttpServletResponse response)
16             throws ServletException, IOException {
17         request.setCharacterEncoding("utf-8");
18         response.setContentType("text/xml;charset=utf-8");//注意:发送xml这里要修改!!!
19         
20         /*
21          * 获取省份名称,加载该省对应的<province>元素!
22          * 把元素转换成字符串发送给客户端
23          */
24         /*
25          * 1. 获取省份的名称
26          * 2. 使用省份名称查找到对应的<province>元素
27          * 3. 把<province>元素转换成字符串,发送!
28          */
29         try {
30             /*
31              * 得到Document
32              */
33             SAXReader reader = new SAXReader();
34             InputStream input = this.getClass().getResourceAsStream("/china.xml");
35             Document doc = reader.read(input);
36             
37             /*
38              * 获取参数
39              */
40             String pname = request.getParameter("pname");//获取省份名称
41             Element proEle = (Element) doc.selectSingleNode("//province[@name=\'" + pname + "\']");
42             String xmlStr = proEle.asXML();//把元素转换成字符串
43             response.getWriter().print(xmlStr);
44         } catch(Exception e) {
45             throw new RuntimeException(e);
46         }
47     }
48 }
CityServlet
 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 import java.util.List;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 import org.dom4j.Attribute;
11 import org.dom4j.Document;
12 import org.dom4j.io.SAXReader;
13 
14 public class ProvinceServlet extends HttpServlet {
15 
16     public void doGet(HttpServletRequest request, HttpServletResponse response)
17             throws ServletException, IOException {
18         response.setContentType("text/html;charset=utf-8");
19         /*
20          * 响应所有省份名称,使用逗号分隔!
21          */
22         /*
23          * 1. Document对象
24          *   * 创建解析器对象
25          *   * 调用解析器的读方法,传递一个流对象,得到Document
26          */
27         try {
28             SAXReader reader = new SAXReader();
29             InputStream input = this.getClass().getResourceAsStream("/china.xml");
30             Document doc = reader.read(input);
31             
32             /*
33              * 查询所有province的name属性,得到一堆的属性对象
34              * 循环遍历,把所有的属性值连接成一个字符串,发送给客户端
35              */
36             List<Attribute> arrList = doc.selectNodes("//province/@name");
37             StringBuilder sb = new StringBuilder();
38             for(int i = 0; i < arrList.size(); i++以上是关于AJAX案例四:省市联动的主要内容,如果未能解决你的问题,请参考以下文章

Ajax---案例(省市区联动)用到template()模块

314 Ajax案例:邮箱地址验证,搜索框输入自动提示,省市区三级联动

AJAX(四)实例 -- json格式数据

第15章WEB15-AJAX和JQuery案例篇

ajax省市区三级联动

三级联动 省市 ajax的代码