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,那么就是清零的操作了
  • 相关阅读:
    python--logging库学习_第一波
    花瓶并发请求的方法
    adb命令记录
    设置苹果机参数
    Appium 服务命令行参数
    sdk下载地址
    Monkey记录
    花瓶使用笔记 (抓数据时,记得添加host,不然抓不了包的)
    selenium笔记2017
    Mac安装appium 问题记录
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7202940.html
Copyright © 2011-2022 走看看