(修订版)AJAX入门!

 
 

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

一、什么是Ajax

Ajax(Asynchronous JavaScript and XML) 异步JavaScript和XML

Ajax实际上是下面这几种技术的融合:

客户端与服务器,可以在【不必刷新整个浏览器】的情况下,与服务器进行异步通讯的技术    

二、为什么我们需要Ajax?

在我们之前的开发,每当用户向服务器发送请求,哪怕只是需要更新一点点的局部内容,服务器都会将整个页面进行刷新。

Ajax就是能够做到局部刷新

640?wx_fmt=png
这里写图片描述

三、XMLHttpRequest

XMLHttpRequest对象是Ajax中最重要的一个对象使用Ajax更多的是编写客户端代码,而不是服务端的代码。

3.1XMLHttpRequest 工作原理

传统的web前端与后端的交互中,浏览器直接访问Tomcat的Servlet来获取数据。Servlet通过转发把数据发送给浏览器。

当我们使用AJAX之后,浏览器是先把请求发送到XMLHttpRequest异步对象之中,异步对象对请求进行封装,然后再与发送给服务器。服务器并不是以转发的方式响应,而是以流的方式把数据返回给浏览器

XMLHttpRequest异步对象会不停监听服务器状态的变化,得到服务器返回的数据,就写到浏览器上【因为不是转发的方式,所以是无刷新就能够获取服务器端的数据】

640?wx_fmt=jpeg
这里写图片描述

3.2创建XMLHttpRequest对象

要创建XMLHttpRequest对象是要分两种情况考虑的:

<script type="text/javascript">    var httpRequest;    if(window.XMLHttpRequest) {        //在IE6以上的版本以及其他内核的浏览器(Mozilla)等        httpRequest = new XMLHttpRequest();    }else if(window.ActiveXObject) {        //在IE6以下的版本        httpRequest = new ActiveXObject();    }</script>

    var httpRequest;

    if(window.XMLHttpRequest) {

        //在IE6以上的版本以及其他内核的浏览器(Mozilla)等
        httpRequest = new XMLHttpRequest();
    }else if(window.ActiveXObject) {

        //在IE6以下的版本
        httpRequest = new ActiveXObject();
    }


</script>

3.3了解XMLHttpRequest对象的属性和方法

3.3.1方法

常用的方法就是黑色粗体的前三个

3.3.2属性

640?wx_fmt=jpeg
这里写图片描述

上面有两个地方都提及了回调函数,回调函数是什么??

回调函数就是接收服务器返回的内容!

640?wx_fmt=jpeg
这里写图片描述

四、编写第一个Ajax程序

检测用户输入的用户名是否为"zhongfucheng",只要不是zhongfucheng,就可以使用!

4.1html代码

<input type="text" id="username"><input type="button" onclick="checkUsername()" value="检测用户名是否合法"><div id="result"></div>
<input type="button" onclick="checkUsername()" value="检测用户名是否合法">
<div id="result">

</div>

4.2JavaScript代码

<script type="text/javascript">    var httpRequest;    function checkUsername() {        if(window.XMLHttpRequest) {            //在IE6以上的版本以及其他内核的浏览器(Mozilla)等            httpRequest = new XMLHttpRequest();        }else if(window.ActiveXObject) {            //在IE6以下的版本            httpRequest = new ActiveXObject();        }        //创建http请求        httpRequest.open("POST", "Servlet1", true);        //因为我使用的是post方式,所以需要设置消息头        httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");        //指定回调函数        httpRequest.onreadystatechange = response22;        //得到文本框的数据        var name = document.getElementById("username").value;        //发送http请求,把要检测的用户名传递进去        httpRequest.send("username=" + name);    }    function response22() {        //判断请求状态码是否是4【数据接收完成】        if(httpRequest.readyState==4) {            //再判断状态码是否为200【200是成功的】            if(httpRequest.status==200) {                //得到服务端返回的文本数据                var text = httpRequest.responseText;                //把服务端返回的数据写在div上                var div = document.getElementById("result");                div.innerText = text;            }        }    }</script>

    var httpRequest;
    function checkUsername() {

        if(window.XMLHttpRequest) {

            //在IE6以上的版本以及其他内核的浏览器(Mozilla)等
            httpRequest = new XMLHttpRequest();
        }else if(window.ActiveXObject) {

            //在IE6以下的版本
            httpRequest = new ActiveXObject();
        }


        //创建http请求
        httpRequest.open("POST""Servlet1"true);

        //因为我使用的是post方式,所以需要设置消息头
        httpRequest.setRequestHeader("Content-type""application/x-www-form-urlencoded");

        //指定回调函数
        httpRequest.onreadystatechange = response22;

        //得到文本框的数据
        var name = document.getElementById("username").value;

        //发送http请求,把要检测的用户名传递进去
        httpRequest.send("username=" + name);

    }

    function response22() {

        //判断请求状态码是否是4【数据接收完成】
        if(httpRequest.readyState==4) {

            //再判断状态码是否为200【200是成功的】
            if(httpRequest.status==200) {

                //得到服务端返回的文本数据
                var text = httpRequest.responseText;

                //把服务端返回的数据写在div上
                var div = document.getElementById("result");
                div.innerText = text;
            }

        }
    }
</script>

4.3效果

实现了局部更新,不需要刷新整一个页面

640?wx_fmt=gif
这里写图片描述

五、XMLHttpRequest解决中文乱码

在传统的Web中我们已经解决过中文乱码问题了。

接下来,要介绍的是:我们可以屏蔽任何浏览器和任何服务器的编码格式,浏览器发送给服务器的数据不造成乱码问题!

具体我们是这样做的:

为啥我能说这种方式屏蔽任何浏览器和服务器的编码格式,都不会乱码呢??

640?wx_fmt=png
这里写图片描述

六、XMLHttpRequest解决缓存问题

在传统的Web中我们也解决过缓存的问题,通过设置response的头信息,返回给浏览器就可以实现不缓存页面了。

但是呢,现在我们使用XMLHttpRequest,拿到的不是全新的页面,仅仅是服务器端发送过来的数据!!

那我们要怎么解决缓存的问题呢??产生缓存的原因就是:我们请求了同一个地址,做了相同的操作。服务端认为我的操作并没有什么变化,就直接把缓存的信息给我了。这样的话,我就不能更换验证码图片了(等等应用)。

我们可以这样做:

if(url.indexOf("?") >= 0){url = url + "&t=" + (new Date()).valueOf();} else{url = url + "?t=" + (new Date()).valueOf();}"?") >= 0){
url = url + "&t=" + (new Date()).valueOf();
else{
url = url + "?t=" + (new Date()).valueOf();
}

七、XMLHttpRequest跨域访问

使用XMLHttpRequest去跨域访问是会出现错误的

640?wx_fmt=png
这里写图片描述

我们要怎么解决呢??这时候就要用代理思想了

640?wx_fmt=png
这里写图片描述

这个时候,XMLHttpRequest跨域访问就分两种(GET和POST)情况了,因为这两种提交数据的方式是不一样的!

7.1浏览器代码

7.2GET方式

GET方式是直接把参数的信息都放在url地址上,所以处理起来会相对简单。

步骤:

BufferedReader reader = new BufferedReader(new InputStreamReader(URL对象.openSteam(),"UTF-8"));  new InputStreamReader(URL对象.openSteam(),"UTF-8"));  

7.3POST方式

POST方式把参数的信息都封装到HTTP请求中,在URL进行连接的时候,需要把数据写给远程服务器

步骤:

URL url = new URL(url);URLConnection connection = url.openConnection;connection.setDoOutPut(true);
URLConnection connection = url.openConnection;
connection.setDoOutPut(true);
OutputSteamWriter writer = new OutputSteamWriter(conncetion.getOutputSteam)
BufferedReader reader =  new BufferedReader(new InputSteamReader(conncetion.inputSteamReader,"UTF-8"));new InputSteamReader(conncetion.inputSteamReader,"UTF-8"));

八、AJAX二级下拉联动案例【XML版】

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

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

640?wx_fmt=jpeg
这里写图片描述

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


8.1分析

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

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

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

8.1.1前台分析

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

8.1.2后台分析


8.2写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>
  User: ozc
  Date2017/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>

8.3Servlet

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);    }}
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);
    }
}

8.4效果:

640?wx_fmt=gif
这里写图片描述

8.5XML方式总结


九、AJAX二级下拉联动案例【JSON版】

前面我们已经使用过了XML作为数据载体在AJAX中与服务器进行交互。当时候我们的案例是二级联动,使用Servlet进行控制

这次我们使用JSON作为数据载体在AJAX与服务器交互,使用三级联动,使用Action进行控制….


9.1分析

与上次是一样的,只不过这次换了用JSON,使用Action控制罢了…

监听下拉框的变动,使用异步对象与服务器进行交互。

9.1.1前台分析

9.1.2后台分析


9.2监听省份JSP页面

<%--  Created by IntelliJ IDEA.  User: ozc  Date: 2017/5/18  Time: 13:36  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html>  <head>    <title>使用JSON数据载体与服务器进行交互</title>      <script type="text/javascript" src="js/ajax.js"></script>  </head>  <body>  <%--############前台页面##############################--%>  <select name="province" id="provinceId">    <option>请选择省份</option>    <option>广东</option>    <option>北京</option>  </select>  <select name="city" id="cityId">    <option>请选择城市</option>  </select>  <select name="area" id="areaId">    <option>请选择区域</option>  </select>  <%--############监听省份##############################--%>  <script type="text/javascript">      document.getElementById("provinceId").onchange= function () {          // 得到选中的下拉框的值          var provinceValue = this.options[this.selectedIndex].innerHTML;          /***************ajax代码*************************/          if("请选择省份" != provinceValue) {              //每次访问的时候,都要清空select的值              var citySelect = document.getElementById("cityId");              citySelect.options.length = 1;              var ajax = createAJAX();              var method = "post";              var url = "${pageContext.request.contextPath}/province_findCityByProvince?time=" + new Date().getTime();              ajax.open(method, url);              ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");              //顾及到发送的key、value值有很多,于是我们使用对象吧。              ajax.send("bean.name=" + provinceValue);              /***************等待服务器的响应,得到服务器返回的数据************************/              ajax.onreadystatechange = function () {                  if(ajax.readyState==4) {                      if(ajax.status==200) {                        var jsonJava = ajax.responseText;                        //解析成是JS类型的JSON                        var json = eval("(" + jsonJava + ")");                        //得到每个城市的值                        for(var i=0;i<json.city.length;i++) {                          var city = json.city[i];                          //动态创建option控件                          var option = document.createElement("option");                          option.innerHTML = city;                          citySelect.appendChild(option);                        }                      }                  }              };          }      };  </script>  </body></html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>使用JSON数据载体与服务器进行交互</title>

      <script type="text/javascript" src="js/ajax.js"></script>
  </head>
  <body>


  <%--############前台页面##############################--%>
  <select name="province" id="provinceId">
    <option>请选择省份</option>
    <option>广东</option>
    <option>北京</option>
  </select>

  <select name="city" id="cityId">
    <option>请选择城市</option>
  </select>


  <select name="area" id="areaId">
    <option>请选择区域</option>
  </select>

  <%--############监听省份##############################--%>
  <script type="text/javascript">

      document.getElementById("provinceId").onchange= function () {

          // 得到选中的下拉框的值
          var provinceValue = this.options[this.selectedIndex].innerHTML;


          /***************ajax代码*************************/
          if("请选择省份" != provinceValue) {

              //每次访问的时候,都要清空select的值
              var citySelect = document.getElementById("cityId");
              citySelect.options.length = 1;

              var ajax = createAJAX();
              var method = "post";
              var url = "${pageContext.request.contextPath}/province_findCityByProvince?time=" + new Date().getTime();
              ajax.open(method, url);
              ajax.setRequestHeader("content-type""application/x-www-form-urlencoded");

              //顾及到发送的key、value值有很多,于是我们使用对象吧。
              ajax.send("bean.name=" + provinceValue);

              /***************等待服务器的响应,得到服务器返回的数据************************/
              ajax.onreadystatechange = function () {

                  if(ajax.readyState==4) {
                      if(ajax.status==200) {
                        var jsonJava = ajax.responseText;

                        //解析成是JS类型的JSON
                        var json = eval("(" + jsonJava + ")");

                        //得到每个城市的值
                        for(var i=0;i<json.city.length;i++) {
                          var city = json.city[i];

                          //动态创建option控件
                          var option = document.createElement("option");
                          option.innerHTML = city;

                          citySelect.appendChild(option);
                        }
                      }
                  }
              };

          }

      };

  
</script>

  </body>
</html>

9.3监听省份Action

要想Struts2能够把Action的数据封装成JSON,就需要导入Struts2的开发包

640?wx_fmt=png
这里写图片描述

在Action中对应的成员属性需要给getter方法

import com.opensymphony.xwork2.ActionSupport;import java.util.ArrayList;import java.util.List;/** * Created by ozc on 2017/5/18. */public class ProvinceAction  extends ActionSupport{    //自动封装数据    private Bean bean;    public Bean getBean() {        return bean;    }    public void setBean(Bean bean) {        this.bean = bean;    }    //封装城市的集合    private List<String> city = new ArrayList<>();    public List<String> getCity() {        return city;    }    public String findCityByProvince() throws Exception {        if ("广东".equals(bean.getName())) {            city.add("广州");            city.add("珠海");            city.add("从化");        } else if ("北京".equals(bean.getName())) {            city.add("一环");            city.add("二环");            city.add("三环");            city.add("四环");        } else {            System.out.println("没有你选择的地区");        }        return "ok";    }}

import java.util.ArrayList;
import java.util.List;

/**
 * Created by ozc on 2017/5/18.
 */

public class ProvinceAction  extends ActionSupport{

    //自动封装数据
    private Bean bean;
    public Bean getBean() {
        return bean;
    }
    public void setBean(Bean bean) {
        this.bean = bean;
    }

    //封装城市的集合
    private List<String> city = new ArrayList<>();
    public List<String> getCity() {
        return city;
    }

    public String findCityByProvince() throws Exception {

        if ("广东".equals(bean.getName())) {
            city.add("广州");
            city.add("珠海");
            city.add("从化");
        } else if ("北京".equals(bean.getName())) {
            city.add("一环");
            city.add("二环");
            city.add("三环");
            city.add("四环");

        } else {
            System.out.println("没有你选择的地区");

        }
        return "ok";
    }
}

返回给前端的时候,数据是这样子的:

640?wx_fmt=png
这里写图片描述

9.4效果

640?wx_fmt=gif
这里写图片描述

9.5监听城市JSP

<%--############监听城市##############################--%><script type="text/javascript">  document.getElementById("cityId").onchange = function () {      //清空值      var areaSelect = document.getElementById("areaId");      areaSelect.options.length = 1;      //得到选择选中的下拉框的值      var cityValue = this.options[this.selectedIndex].innerHTML;      if(cityValue!="请选择城市"){          var ajax = createAJAX();          var method = "post";          var url = "${pageContext.request.contextPath}/province_findAreaByCity?time=" + new Date().getTime();          ajax.open(method, url);          ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");          //顾及到发送的key、value值有很多,于是我们使用对象吧。          ajax.send("bean.name=" + cityValue);          /***************等待服务器的响应,得到服务器返回的数据************************/          ajax.onreadystatechange = function () {              if(ajax.readyState==4) {                  if(ajax.status==200) {                      var jsonJava = ajax.responseText;                      var json = eval("(" + jsonJava + ")");                      //得到每个地区的值                      for(var i=0;i<json.area.length;i++) {                          var area = json.area[i];                          //动态创建option控件                          var option = document.createElement("option");                          option.innerHTML = area;                          areaSelect.appendChild(option);                      }                  }              }          }      };  };</script>
<script type="text/javascript">
  document.getElementById("cityId").onchange = function () {

      //清空值
      var areaSelect = document.getElementById("areaId");
      areaSelect.options.length = 1;

      //得到选择选中的下拉框的值
      var cityValue = this.options[this.selectedIndex].innerHTML;
      if(cityValue!="请选择城市"){

          var ajax = createAJAX();
          var method = "post";
          var url = "${pageContext.request.contextPath}/province_findAreaByCity?time=" + new Date().getTime();
          ajax.open(method, url);
          ajax.setRequestHeader("content-type""application/x-www-form-urlencoded");

          //顾及到发送的key、value值有很多,于是我们使用对象吧。
          ajax.send("bean.name=" + cityValue);

          /***************等待服务器的响应,得到服务器返回的数据************************/
          ajax.onreadystatechange = function () {

              if(ajax.readyState==4) {
                  if(ajax.status==200) {

                      var jsonJava = ajax.responseText;

                      var json = eval("(" + jsonJava + ")");

                      //得到每个地区的值
                      for(var i=0;i<json.area.length;i++) {
                          var area = json.area[i];

                          //动态创建option控件
                          var option = document.createElement("option");
                          option.innerHTML = area;

                          areaSelect.appendChild(option);
                      }

                  }
              }
          }

      };
  };

</script>

9.6Action页面

public String findAreaByCity() throws Exception {    if ("广州".equals(bean.getName())) {        area.add("白云区");        area.add("黄浦区");        area.add("萝岗区");    } else if ("珠海".equals(bean.getName())) {        area.add("香江");        area.add("拱北");        area.add("EE");        area.add("xx");    } else {        System.out.println("没有你选择的地区");    }    return "ok";}

    if ("广州".equals(bean.getName())) {
        area.add("白云区");
        area.add("黄浦区");
        area.add("萝岗区");
    } else if ("珠海".equals(bean.getName())) {
        area.add("香江");
        area.add("拱北");
        area.add("EE");
        area.add("xx");
    } else {
        System.out.println("没有你选择的地区");

    }
    return "ok";
}

9.7最终效果:

640?wx_fmt=gif
这里写图片描述

9.8总结

这次使用的是JSON作为数据载体与服务器进行交互,和XML本质上是没有区别的。

只不过JSON是更加轻量级文本数据,在JavaScript能够方便地获取返回的数据


十、总结图

640?wx_fmt=jpeg
这里写图片描述

最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

640?wx_fmt=jpeg

有帮助?在看!转发! 640

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值