zoukankan      html  css  js  c++  java
  • AJAX二级下拉联动【XML方式】

    AJAX二级下拉联动案例

    我们在购物的时候,常常需要我们来选择自己的收货地址,先选择省份,再选择城市

    有没有发现:当我们选择完省份的时候,出现的城市全部都是根据省份来给我们选择的。这是怎么做到的呢???其实就是通过AJAX来完成的。使用AJAX技术让我们看起来网页非常“智能”,会根据省份来给出对应的城市信息。

    这里写图片描述

    我们这里就不读取数据库了,直接在Servlet写死数据来进行模拟测试


    分析

    我们知道AJAX与服务器之间的交互常用的传输载体格式有三种:

    • HTML
    • XML
    • JSON

    由于省份与城市是有层级关系的,因此我们只能用XML或者JSON

    我们这里首先就用XML来进行,后面会使用JSON,来看看他俩有什么不同的地方。。

    前台分析

    当用户选择了某个省份之后,就使用AJAX与服务器进行交互,那么在选择城市的时候就出现对应的城市信息。

    • 监听下拉框值变化事件
    • 只要下拉框值变化了,就与服务器进行交互
    • 得到服务器返回的值,解析XML
    • 使用DOM把数据写到城市下拉框列表中

    后台分析

    • 得到前台带过来的数据
    • 判断该数据是什么,返回对应的的XML文件

    写JSP页面

    
    <%--
      Created by IntelliJ IDEA.
      User: ozc
      Date: 2017/5/17
      Time: 19:38
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>多级联动</title>
        <script type="text/javascript" src="js/ajax.js"></script>
    </head>
    <body>
    
    <%--############前台页面###################--%>
    <select name="province" id="provinceId">
        <option value="-1">请选择省份</option>
        <option>广东</option>
        <option>湖南</option>
    </select>
    <select name="city" id="cityId">
        <option>请选择城市</option>
    </select>
    
    <%--############AJAX###################--%>
    
    <script type="text/javascript">
    
        document.getElementById("provinceId").onchange = function () {
    
    
            /**********定位到下拉框,获取下拉框的值***************/
            // 获取选中的下拉框索引值
            var index = this.selectedIndex;
            // 得到下拉框的值
            var province = this.options[index].innerHTML;
    
            //下拉框的值要是“请选择”,那么我们是不会访问服务器的
            if ("请选择省份" != province) {
    
                /********由于每次都会自动添加,因此每次在调用的时候清除***********/
                var citySelect = document.getElementById("cityId");
    
                //每次都将option变成长度只有1的
                citySelect.options.length = 1;
    
                /*************ajax代码*********************/
                //创建AJAX对象
                var ajax = createAJAX();
                //准备发送请求
                var method = "post";
                var url = "${pageContext.request.contextPath}/ProvinceServlet?time=" + new Date().getTime();
                ajax.open(method, url);
                //由于是POST方式,因此要设置头
                ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    
                ajax.send("province=" + province);
    
                /************ajax回调函数*********************/
                ajax.onreadystatechange = function () {
    
                    if (ajax.readyState == 4) {
                        if (ajax.status == 200) {
    
                            //得到服务器端带过来的XML
                            var XMLDocument = ajax.responseXML;
    
                            /**********解析XML文档,使用DOM写到下拉框中****************/
                            var cities = XMLDocument.getElementsByTagName("city");
    
                            //得到每一个cities节点的值,动态生成下拉框,添加到下拉框中
                            for (var i = 0; i < cities.length; i++) {
                                var value = cities[i].firstChild.nodeValue;
                                //动态生成下拉框
                                var optionElement = document.createElement("option");
                                optionElement.innerHTML = value;
    
                                //添加到下拉框中
                                citySelect.appendChild(optionElement);
    
                            }
                        }
                    }
                };
    
            }
    
        };
    
    </script>
    
    
    </body>
    </html>
    

    Servlet

    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * Created by ozc on 2017/5/17.
     */
    @javax.servlet.annotation.WebServlet(name = "ProvinceServlet",urlPatterns = "/ProvinceServlet")
    public class ProvinceServlet extends javax.servlet.http.HttpServlet {
        protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
    
            //设置中文编码
            request.setCharacterEncoding("UTF-8");
            String province = request.getParameter("province");
    
            //这里是返回的是XML,因此指定XML数据!
            response.setContentType("text/xml;charset=UTF-8");
    
            PrintWriter printWriter = response.getWriter();
    
            /****************返回XML文件给前台**************/
            printWriter.write("<?xml version='1.0' encoding='UTF-8'?>");
            printWriter.write("<root>");
            if("广东".equals(province)){
                printWriter.write("<city>广州</city>");
                printWriter.write("<city>深圳</city>");
                printWriter.write("<city>中山</city>");
            }else if("湖南".equals(province)){
                printWriter.write("<city>长沙</city>");
                printWriter.write("<city>株洲</city>");
                printWriter.write("<city>湘潭</city>");
                printWriter.write("<city>岳阳</city>");
            }
            printWriter.write("</root>");
    
            System.out.println("1111");
    
    
            /*******事后操作*******/
            printWriter.flush();
            printWriter.close();
    
    
        }
    
        protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
    
            this.doPost(request, response);
        }
    }
    
    

    效果:

    这里写图片描述

    XML方式总结

    • 监听下拉框的变化,如果变化了,那么就使用异步操作去访问服务器,得到对应的数据返回给异步对象
    • 异步对象解析服务器带过来的数据,使用DOM编程把数据动态添加到页面上
      • 在Servlet上记得要指定返回的是XML的数据!
      • 在前台解析XML文档的时候,不能直接使用innerHtml来得到节点的值,只能通过firstChild.nodeValue的方式获取。
      • 由于每次append到下拉框都会连续append,因此在响应事件的时候,把下拉框清零
      • 把下拉框options的长度赋值为1,那么就是清零的操作了
  • 相关阅读:
    leetcode 347. Top K Frequent Elements
    581. Shortest Unsorted Continuous Subarray
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 217. Contains Duplicate、219. Contains Duplicate II、220. Contains Duplicate、287. Find the Duplicate Number 、442. Find All Duplicates in an Array 、448. Find All Numbers Disappeared in an Array
    leetcode 461. Hamming Distance
    leetcode 19. Remove Nth Node From End of List
    leetcode 100. Same Tree、101. Symmetric Tree
    leetcode 171. Excel Sheet Column Number
    leetcode 242. Valid Anagram
    leetcode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7202940.html
Copyright © 2011-2022 走看看