AJAX多级下拉联动【JSON】

前言

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

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

  • 省份-城市-区域三级联动【Struts2 + JSON版】

分析

与上次是同样的,只不过此次换了用JSON,使用Action控制罢了…前端

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

前台分析

  • 监听下拉框的变更
  • 获得服务器返回的JSON数据
  • 使用eval()进行解析,获得具体的对象
  • 使用DOM编程把数据填充到对应的下拉框上

后台分析

  • 获得前台发送过来的数据
  • 判断具体的数据是什么,给出对应的数据
  • 使用Struts2提供的组件把数据封装成JSON
  • 返回给浏览器

监听省份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>

监听省份Action

要想Struts2可以把Action的数据封装成JSON,就须要导入Struts2的开发包ajax

  • struts2-json-plugin-2.3.4.1.jar

这里写图片描述

在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";
    }
}

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

这里写图片描述


效果

这里写图片描述


监听城市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>

Action页面

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

最终效果:

这里写图片描述

总结

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

只不过JSON是更加轻量级文本数据,在JavaScript可以方便地获取返回的数据服务器

  • 在Struts2中把Action数据封装成JSON格式,返回给异步对象
    • 须要导入jar包
    • 在配置文件中配置继承json包
    • 返回的类型是json
  • 若是使用POST时,发送的key、vaulue太多的话,咱们能够使用bean进行封装
  • 当选中省份时,把城市和区域的下拉框清空,当选择城市时,把区域的下拉框清空
相关文章
相关标签/搜索