JAVA WEB DAY 08_AJAX & JOSN

AJAX&JSON

目标

01_全局和局部刷新概述-[★★]

全局剧新:每次刷新页面是刷新整个网页的内容
局部剧新:刷新页面中某个区域的内容

02_Ajax概述-[★★]

概念:

  • Asynchronous JavaScript And XML
  • 异步 JavaScript 和 XML

作用:

  • 发送异步请求到服务器获取数据实现页面局部刷新

03_同步请求与异步请求的区别-[★★]

同步和异步发送请求的区别:

  • 同步请求:浏览器发送的请求,请求如果没有响应回来则用户只能等待,无法执行其他操作
  • 异步请求:由 JS 发送的请求,用户不需要等待请求响应回来就可以继续执行其他操作

04_原生 ajax 案例-异步校验用户名-[★]

  1. 原生ajax引擎核心操作对象叫什么? XMLHttpRequest
  2. 实现js异步请求服务器端代码实现步骤?
    2.1 创建请求对象: XMLHttpRequest
    2.2 监听准备状态值的变化:回调函数
    * 判断准备状态值是否为4并且状态码是否200:通过请求对象的responseText获取服务器返回数据
    2.3 打开与服务器的连接:请求方式 请求地址 是否是异步
    2.4 调用send方法发送请求

什么是原生ajax

  • 原生ajax: 指所有的 AJAX 的操作代码都使用纯 JS 去完成,不使用任何框架。开发效率相对低,代码量更大些。
  • 核心对象: XMLHttpRequest,这是一个请求对象,用于将请求发送给服务器。接收从服务器发送回来数据。

XMLHttpRequest 对象介绍

创建 XMLHttpRequest 对象说明
new XMLHttpRequest()创建一个请求对象
XMLHttpRequest 对象的事件说明
onreadystatechange当这个请求对象的准备状态发生改变时,激活这个事件。
如:后台操作的时候,发送请求给服务器,这个状态就会发生变化。
如:响应回来,这个状态也会发生变化。
XMLHttpRequest对象的属性说明
readyState这个属性用来得到准备状态的值,如果这个值等于4表示请求结束并且服务器已经响应回来
status状态码,服务器状态码是200,表示响应正确
responseText取得从服务器发送回来的数据,文本格式

readyState状态值的范围0~4
0:未初始化
1:已与服务器建立连接
2:服务器接收到请求
3:服务器处理请求中
4:服务器响应结束

XMLHttpRequest对象的方法说明
open(“GET”,“URL”,true)作用:打开与服务器的连接。
参数:
1.GET或POST,以什么方式打开连接。GET方式的参数在URL上传递。
2.URL服务器的访问地址.
3.true代码异步执行,false代码同步执行。
send()作用:发送请求给服务器。
  • 需求说明:
    用户注册时输入一个用户名,失去焦点以后,通过ajax后台判断用户名是否存在。
    服务器先不访问数据库,直接判断用户名,如果用户名为admin,则表示用户已经存在,否则用户名可以注册使用。

  • 实现步骤:
    1.创建一个Servlet用于接收用户名校验用户名,最后返回结果。
    2.创建一个html页面发送异步请求给Servlet并且获取返回的结果更新到页面上。

  • 示例代码:

  • CheckUsernameServlet代码

/**
 * 目标:检查用户名是否存在:admin 存在,否则不存在
*/
@WebServlet(urlPatterns = "/check")
public class CheckUsernameServlet extends HttpServlet {
  
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       // 设置内容类型和编码
       response.setContentType("text/html;charset=utf-8");
       // 获得字符打印流
       PrintWriter out = response.getWriter();
      // 1. 获取用户名
      String username = request.getParameter("username");
      // 2. 判断用户名是否存在
      if ("admin".equals(username)){
          // 3. 响应数据给浏览器
          out.println("已被注册");
      } else {
          out.println("可以使用");
      }
  }
}
  • html页面代码
 <!DOCTYPE html>
  <html lang="zh-CN">
  <head>
      <meta charset="UTF-8">
      <title>注册页面</title>
  
      <script>
          // 网页加载完毕执行
          window.onload = function () {
              // 1. 给文本输入框注册一个失去焦点事件
              document.getElementById("user").onblur = function () {
                  // 2. 获得用户名字符串
                  var username = this.value.trim();
                  if (username.length == 0)return;
                  // 3. 创建Ajax引擎对象:请求对象==>发送请求到服务器获取数据
                  var request = new XMLHttpRequest();
                  // 4. 监听准备状态值的变化:回调函数
                  request.onreadystatechange = function () {
                      // readyState状态值的范围0~4
                      // 0:未初始化
                      // 1:已与服务器建立连接
                      // 2:服务器接收到请求
                      // 3:服务器处理请求中
                      // 4:服务器响应结束
                      if (request.readyState == 4 && request.status == 200) {
                          // 获取服务器响应数据并显示在页面元素上:span元素
                          document.getElementById("info").innerHTML = request.responseText;
                      }
                  };
                  // 5. 调用请求对象的open方法:与服务器建立连接
                  // 参数1:请求方式
                  // 参数2:请求地址
                  // 参数3:是否异步请求,默认是true:异步   false:同步请求
                  request.open("GET","check?username="+username,true);
                  // 6. 调用请求对象的send方法:发送请求
                  request.send();
              }
          }
      </script>
  
  </head>
  <body>
      用户名:<input type="text" name="username" id="user">
      <span id="info"></span>
  </body>
  </html>

05_ jQuery 异步请求方法1-全局 get 方法-[★★★★★]

  1. get异步请求的参数有几个? 哪个参数是必须的?
    四个,url参数必须:请求地址
  2. 请求参数的数据格式有几种? 分别是什么?
    格式1:键=值&…
    格式2:{键:值,…}
  • 需求:使用jQuery提供的get方法完成检查用户名是否存在案例
  • HTML 页面代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>

    <script src="js/jquery-3.3.1.js"></script>

    <script>
        // 监听网页加载完毕
        $(function () {
            // 注册失去焦点事件
            $("#user").blur(function () {
                // 1. 获取用户名
                var username = $(this).val().trim();
                if (username.length == 0) return;
                /*
                 $.get(url, [data], [callback], [type])
                   url:请求地址(必须)
                   data:请求参数
                      格式1:键1=值1&键2=值2 比如:username=jack&password=123
                      格式2:{键1:值1,..}:JSON格式字符串,比如:{username:jack,password:123}
                   callback:回调函数:接收服务器返回的数据
                   type:指定服务器返回数据的类型
                      常见类型值:text(默认值),json,xml,html,script....
                */
               // 发送异步请求:GET请求
               $.get(
                   "check", // 请求地址
                   "username="+username, // 请求参数
                   function (result) { // 回调函数
                       $("#info").html(result);
                   },
                   "text" // 返回数据类型
               );
            });
        })
    </script>

</head>
<body>
    用户名:<input type="text" name="username" id="user">
    <span id="info"></span>
</body>
</html>

06_ jQuery 异步请求方法2-全局 post 方法-[★★★★★]

  1. post方法提交异步请求相比get方法有什么好处?
    POST提交相对安全,而且没有数据大小限制。
  • 需求:使用jQuery提供的post方法完成检查用户名是否存在案例
  • HTML 页面代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>

    <script src="js/jquery-3.3.1.js"></script>

    <script>
        // 监听网页加载完毕
        $(function () {
            // 注册失去焦点事件
            $("#user").blur(function () {
                // 1. 获取用户名
                var username = $(this).val().trim();
                if (username.length == 0) return;
                /*
                 $.post(url, [data], [callback], [type])
                   url:请求地址(必须)
                   data:请求参数
                      格式1:键1=值1&键2=值2 比如:username=jack&password=123
                      格式2:{键1:值1,..}:JSON格式字符串,比如:{username:jack,password:123}
                   callback:回调函数:接收服务器返回的数据
                   type:指定服务器返回数据的类型
                      常见类型值:text(默认值),json,xml,html,script....
                */
               // 发送异步请求:post请求
               $.post(
                   "check", // 请求地址
                   "username="+username, // 请求参数
                   function (result) { // 回调函数
                       $("#info").html(result);
                   },
                   "text" // 返回数据类型
               );
            });
        })
    </script>

</head>
<body>
    用户名:<input type="text" name="username" id="user">
    <span id="info"></span>
</body>
</html>

07_ jQuery 异步请求方法3-全局 ajax 方法-[★★★★★]

  1. ajax方法发送异步请求比get/post方法有什么更好的地方?
    有错误处理回调函数
  • 需求:使用jQuery提供的ajax方法实现后台用户登录的功能。
  • 案例说明:
    1.页面上有用户名和密码两个文本框,点登录按钮,使用后台AJAX完成登录成功。
    2.如果用户登录成功显示登录成功,否则显示登录失败。
    3.后台服务器暂不使用数据库,如果用户名为:admin,密码为:123,则登录成功。

服务器端实现

  • LoginServlet实现步骤
  1. 设置响应类型和获取打印流对象
  2. 获得用户名和密码
  3. 判断用户名和密码是否正确
  4. 如果正确则返回:欢迎您,admin,登录成功
  5. 错误则返回:登录失败
  • LoginServlet实现代码
/**
 * 目标:实现用户登录
 */
@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         // 设置内容类型和编码
         response.setContentType("text/html;charset=utf-8");
         // 获得字符打印流
         PrintWriter out = response.getWriter();


         // 0. 设置请求参数编码
         request.setCharacterEncoding("utf-8");
         // 1. 获取用户名和密码
         String username = request.getParameter("username");
         String password = request.getParameter("password");
         // 2. 判断是否正确
         if ("admin".equals(username) && "123".equals(password)) {
             // 3. 响应数据给浏览器
             out.println("欢迎你,"+username +",登录成功");
         } else {
             out.println("登录失败");
         }
    }
}

前端页面实现

  • login.html实现步骤
  1. 页面上有一个登录的表单数据。注:登录按钮是一个普通的button
  2. 给登录按钮添加点击事件
  3. 得到表单中所有的数据项
  4. 使用$.ajax方法提交数据给服务器,设置url请求地址,data数据,method发送方式,dataType返回数据类型,success成功的回调函数,等属性。
  5. 在回调函数中直接使用alert弹出服务器返回的数据
  • login.html页面代码
<html>
<head>
    <meta charset="utf-8">
    <title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
    <form action="login" id="loginForm">
        用户名:<input id="name" type="text" name="username"><br>
        密码:<input id="password" type="password" name="password"><br>
        <input id="login" type="button" value="登录">
    </form>
</body>

<script src="js/jquery-3.3.1.js"></script>
<script>

    // 监听登录按钮点击
    $("#login").click(function () {
        // $.ajax([settings])	只有一个对象做为参数,这个对象有多个属性
        /**
           settings:是JSON对象,常用属性值如下:
                url: 请求地址
                data: 请求参数
                    格式1:username=admin&password=123
                method: 请求方式
                dataType: 服务器响应数据类型
                success: 成功回调
                error: 错误回调
                async: 是否异步,默认是true
         */
        // 获取表单数据
        var data = $("#loginForm").serialize();
        // 调用ajax方法发送异步请求实现登录
        $.ajax({
            url:"login",   // 请求地址
            data:data,     // 请求参数
            method:"get",     // 请求方式
            dataType:"text",  // 响应数据类型
            success:function (result) {  // 成功回调
                alert(result);
            },
            error:function () {    // 失败回调
                // 一般给用户一个友好提交
                alert("服务器忙...");
            }
        })
    });

</script>
</html>

08_ jQuery 3.0 新增方法-全局 get 和 post 方法-[★★★★]

  1. jQuery3.0新增get/post方法比原有ajax方法更好在什么地方?
    直接写明了请求方法类型,代码更加简洁。
    以后推荐大家使用jQuery3.0的新增的get或post方式发送异步请求。
  • 需求:使用 jQuery 3.0 新增的 get 和 post 方法发送异步请求

  • login02.html页面代码(get)

<html>
<head>
    <meta charset="utf-8">
    <title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
    <form action="login" id="loginForm">
        用户名:<input id="name" type="text" name="username"><br>
        密码:<input id="password" type="password" name="password"><br>
        <input id="login" type="button" value="登录">
    </form>
</body>

<script src="js/jquery-3.3.1.js"></script>
<script>

    // 监听登录按钮点击
    $("#login").click(function () {
         // jq3.0新增的get方法发送异步请求
        // $.get([settings])只有一个对象做为参数,这个对象有多个属性
        /**
           settings:是JSON对象,常用属性值如下:
                url: 请求地址
                data: 请求参数
                    格式1:username=admin&password=123
                method: 请求方式
                dataType: 服务器响应数据类型
                success: 成功回调
                error: 错误回调
                async: 是否异步,默认是true
         */
        // 获取表单数据
        var data = $("#loginForm").serialize();
        // 调用ajax方法发送异步请求实现登录
        $.get({
            url:"login",   // 请求地址
            data:data,     // 请求参数
            success:function (result) {  // 成功回调
                alert(result);
            },
            error:function () {    // 失败回调
                // 一般给用户一个友好提交
                alert("服务器忙...");
            }
        })
    });

</script>
</html>
  • login03.html页面代码(post)
<html>
<head>
    <meta charset="utf-8">
    <title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
    <form action="login" id="loginForm">
        用户名:<input id="name" type="text" name="username"><br>
        密码:<input id="password" type="password" name="password"><br>
        <input id="login" type="button" value="登录">
    </form>
</body>

<script src="js/jquery-3.3.1.js"></script>
<script>

    // 监听登录按钮点击
    $("#login").click(function () {
         // jq3.0新增的post方法发送异步请求
        // $.post([settings])只有一个对象做为参数,这个对象有多个属性
        /**
           settings:是JSON对象,常用属性值如下:
                url: 请求地址
                data: 请求参数
                    格式1:username=admin&password=123
                method: 请求方式
                dataType: 服务器响应数据类型
                success: 成功回调
                error: 错误回调
                async: 是否异步,默认是true
         */
        // 获取表单数据
        var data = $("#loginForm").serialize();
        // 调用ajax方法发送异步请求实现登录
        $.post({
            url:"login",   // 请求地址
            data:data,     // 请求参数
            success:function (result) {  // 成功回调
                alert(result);
            },
            error:function () {    // 失败回调
                // 一般给用户一个友好提交
                alert("服务器忙...");
            }
        })
    });

</script>
</html>

09_ JSON 概述-[★★]

  1. JSON是什么:一个特殊格式字符串
  2. JSON的作用:用于异步请求时服务器与浏览器之间的数据传输
  • 在使用ajax发送异步请求从服务器获取数据时,服务器返回的数据格式最常见莫过于JSON,偶尔也会有XML。
  • 无论JSON还是XML都是一种特殊格式的字符串,按照特定的规则描述数据结构。
  • JSON 概述
  • JSON本质上,就是一个“特殊格式”的字符串。
  • JSON是网络上用来传输数据使用最广泛的数据格式之一。
  • JSON出生草根,是Javascript的子集,是Javascript的SON,专门用来描述数据结构。
  • json 的类型和语法
三种类型语法描述
对象类型{键:值, 键:值}代表一个对象,有多个属性名和属性值
数组/集合类型[元素,元素,元素]代表一个集合,有多个元素
混合类型[{键:值},{键:值},{键:值}]
{键: [元素,元素,元素]}
代表一个集合,有多个对象
一个对象,某个属性是一个集合

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null

10_ JSON 语法演示-[★★★★]

  • 需求
    需求1:创建一个JSON对象类型
    需求2:创建一个数组,其中每个元素是JSON对象
    需求3:创建一个JSON对象:某个属性值是一个集合:集体中每个元素是一个JSON对象

  • 示例代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <!--
    - 需求1:创建一个JSON对象类型
    - 需求2:创建一个数组,其中每个元素是JSON对象
    - 需求3:创建一个JSON对象:某个属性值是一个集合:集体中每个元素是一个JSON对象
    -->
    <script>
        // 需求1:创建一个JSON对象类型
        var user = {
            "username":"孙悟空",
            "nickName":"弼马温",
            "age":20
        };
        // 输出JSON对象数据
        // document.write:将内容输出到网页上
        document.write("姓名:" + user.username + "<br>");
        document.write("昵称:" + user.nickName + "<br>");
        document.write("年龄:" + user.age + "<hr>");

        // 需求2:创建一个数组,其中每个元素是JSON对象
        var userList = [{
            "username":"孙悟空",
            "nickName":"弼马温",
            "age":20
        },{
            "username":"猪八戒",
            "nickName":"天蓬元帅",
            "age":28
        },{
            "username":"沙悟净",
            "nickName":"卷帘大将",
            "age":26
        }];
        // 遍历数组
        // for...of变量
        for(var user of userList){
            document.write("姓名:" + user.username + "<br>");
            document.write("昵称:" + user.nickName + "<br>");
            document.write("年龄:" + user.age + "<hr>");
        }
        // 需求3:创建一个JSON对象:某个属性值是一个集合:集体中每个元素是一个JSON对象
        var user = {
            username:"唐三藏",
            age:20,
            baobao:[{
                    "username":"孙悟空",
                    "nickName":"弼马温",
                    "age":20
                },{
                    "username":"猪八戒",
                    "nickName":"天蓬元帅",
                    "age":28
                },{
                    "username":"沙悟净",
                    "nickName":"卷帘大将",
                    "age":26
                }
            ]
        };
        document.write("姓名:" + user.username + "<br>");
        document.write("年龄:" + user.age + "<br>");
        document.write("徒弟如下:<hr>");
        for(var u of user.baobao){
            document.write("姓名:" + u.username + "<br>");
            document.write("昵称:" + u.nickName + "<br>");
            document.write("年龄:" + u.age + "<hr>");
        }

    </script>
</head>
<body>

</body>
</html>

11_ JSON 转换工具- Jackson 的使用-[★★★★]

  1. jackson可以做什么? 将Java对象转换为JSON格式的字符串
  2. jackson的核心类和方法分别是什么?
    ObjectMapper
    writeValueAsString
  • 需求:使用Jackson工具将java对象或集合转换成json格式的字符串
  • Jackson工具使用步骤:
    1.导入json相关jar包
    jackson-annotations-2.2.3.jar
    jackson-core-2.2.3.jar
    jackson-databind-2.2.3.jar
    2.创建java对象或集合
    3.使用jackson的ObjectMapper对象的writeValueAsString方法进行转换
ObjectMapper对象中的方法说明
String writeValueAsString(Object o)将对象转成一个JSON格式的字符串形式

Jackson工具使用演示

  • 实体类:User
public class User {

    private int id;
    private String username;
    private int age;

    public User(int id, String username, int age) {
        this.id = id;
        this.username = username;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", age=" + age +
                '}';
    }

    public User() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • 测试类
public class TestJackson {
    public static void main(String[] args) throws Exception{
        // User对象
        User user = new User(1,"小波",20);

        // List<User>对象
        List<User> userList = new ArrayList<>();
        userList.add(new User(1,"小波",21));
        userList.add(new User(2,"小明",22));
        userList.add(new User(3,"小泽",23));

        // Map<String,Object>对象
        Map<String,Object> map  = new HashMap<>();
        map.put("username", "老王");
        map.put("age", 20);
        map.put("gender","男");
        map.put("user", new User(4,"小红",30));
        map.put("hobbies", new String[]{"写代码","撸代码","敲代码"});

        // String数组
        String[] strs = {"写代码","撸代码","敲代码"};

        // 1. 创建ObjectMapper对象
        ObjectMapper objectMapper = new ObjectMapper();
        // 2. 调用方法将Java对象转换为JSON字符
        // {"id":1,"username":"小波","age":20}
        System.out.println("User对象:" + objectMapper.writeValueAsString(user));
        // [{"id":1,"username":"小波","age":20},....]
        System.out.println("List对象:" + objectMapper.writeValueAsString(userList));
        // {"username":"老王",....}
        System.out.println("Map对象:" + objectMapper.writeValueAsString(map));
        // ["写代码","撸代码","敲代码"]
        System.out.println("字符串数组:" + objectMapper.writeValueAsString(strs));

    }
}

12_ JavaScrpit 操作 JSON 的方法-[★★★★]

语法功能
JSON.parse(字符串)将一个字符串转成JSON对象
JSON.stringify(JSON对象)将一个JSON对象转成字符串

需求:

  1. 在JSON中键必须要使用双引号引起来
  2. 创建一个字符串:’{“name”: “张三”, “age”: 20}’, 使用上面的方法转成JSON对象
  3. 再使用上面的方法,转回成字符串
  • 示例代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS中与JSON有关的函数</title>
</head>
<body>
<script type="text/javascript">
    /*
    需求:
        1. 在JSON中键必须要使用双引号引起来
        2. 创建一个字符串:'{"name": "张三", "age": 20}', 使用上面的方法转成JSON对象
        3. 再使用上面的方法,转回成字符串
    * */
    // 字符串
    var jsonStr = '{"name": "张三", "age": 20}';
    // 将字符串转换为JSON对象
    var jsonObj = JSON.parse(jsonStr);
    document.write("name = " + jsonObj.name + ",age = " + jsonObj.age);

    // 将JSON对象转换为字符串
    var str = JSON.stringify(jsonObj);
    document.write("===> str = " + str);


</script>
</body>
</html>

13_ Ajax 的跨域问题概述和演示-[★★]

什么是跨域:

  • 一个服务器请求了另一个不同源(不同源:域名、端口号、协议三者有一个不同)的服务器

14_ Ajax 实现跨域访问方式-[★★★★]

服务器端需要设置哪个响应头实现资源可以跨域访问?

  • 设置响应头:Access-Control-Allow-Origin
  • 示例代码
@WebServlet(urlPatterns = "/demo01")
public class DemoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         // 设置内容类型和编码
         response.setContentType("text/html;charset=utf-8");
         // 设置响应头:Access-Control-Allow-Origin
         response.setHeader("Access-Control-Allow-Origin", "*");
         // 获得字符打印流
         PrintWriter out = response.getWriter();
         out.println("我是demo01项目的响应:端口号:8888");
    }
}

15_案例-省市联动-[★★★★]

在这里插入图片描述

  • 实体类
public class Area {
    private int id;
    private int pid; // 上一级id
    private String name;

    public Area() {
    }

    public Area(int id, int pid, String name) {
        this.id = id;
        this.pid = pid;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • AreaDao类
public class AreaDao {

    /**
     * 获取省市数据集合
     * @return
     */
    public  Map<Integer, List<Area>> getAllArea(){
        HashMap<Integer, List<Area>> map = new HashMap<>();

        // 添加省份
        List<Area> provinces = new ArrayList<>();
        provinces.add(new Area(1, 0, "广东省"));
        provinces.add(new Area(2, 0, "湖南省"));
        provinces.add(new Area(3, 0, "广西省"));
        map.put(0, provinces);

        // 添加城市:广东省城市
        List<Area> cities01 = new ArrayList<>();
        cities01.add(new Area(4, 1, "广州市"));
        cities01.add(new Area(5, 1, "深圳市"));
        cities01.add(new Area(6, 1, "中山市"));
        map.put(1, cities01);

        // 添加城市:湖南省城市
        List<Area> cities02 = new ArrayList<>();
        cities02.add(new Area(7, 2, "郴州市"));
        cities02.add(new Area(8, 2, "长沙市"));
        cities02.add(new Area(9, 2, "衡阳市"));
        map.put(2, cities02);

        // 添加城市:广西省城市
        List<Area> cities03 = new ArrayList<>();
        cities03.add(new Area(10, 3, "桂林市"));
        cities03.add(new Area(11, 3, "南宁市"));
        cities03.add(new Area(12, 3, "柳州市"));
        map.put(3, cities03);
        return map;
    }

    /*public static void main(String[] args) {
        Map<Integer, List<Area>> allArea = getAllArea();
        System.out.println(allArea.get(3));
    }*/

    /**
     * 根据pid查询城市或省份数据
     * pid=0,则代表查询的是省份数据
     */
    public List<Area> findCitiesByPid(int pid){
        // 查询数据
        Map<Integer, List<Area>> allArea = getAllArea();
        return allArea.get(pid);
    }
}

  • AreaService类
public class AreaService {

    private AreaDao areaDao = new AreaDao();

    /**
     * 根据pid查询城市或省份数据
     * pid=0,则代表查询的是省份数据
     */
    public List<Area> findCitiesByPid(int pid){
        return areaDao.findCitiesByPid(pid);
    }
}

  • AreaServlet类
// 查询省市数据
@WebServlet(urlPatterns = "/area")
public class AreaServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         // 设置内容类型和编码
         response.setContentType("text/html;charset=utf-8");
         // 设置响应头:Access-Control-Allow-Origin
         response.setHeader("Access-Control-Allow-Origin", "*");
         // 获得字符打印流
         PrintWriter out = response.getWriter();

         // 接收请求参数:pid
        String pid = request.getParameter("pid");
        // 调用业务层方法查询数据
        AreaService areaService = new AreaService();
        List<Area> cities = areaService.findCitiesByPid(Integer.parseInt(pid));

        // 将集合转换为JSON字符串
        String jsonStr = new ObjectMapper().writeValueAsString(cities);
        // 将JSON字符串返回给浏览器
        out.println(jsonStr);
    }
}
  • 前端页面
<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>省市级联</title>
        <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
        <script type="text/javascript">
            // 当网页加载完毕执行
            $(function () {
               // 发送请求查询省份数据
                $.get({
                    url:"area", // 请求地址
                    data:{pid:0}, // 请求参数
                    dataType:"json", // 设置服务器返回数据类型
                    success:function (jsonArray) {
                        // jsonArray是一个JSON对象
                        // 遍历省份数组
                        $(jsonArray).each(function (index, province) {
                            // 创建option元素
                            var option = $("<option value='"+province.id+"'>"+province.name+"</option>")
                            // 将option添加到省份下拉列表中
                            $("#province").append(option);
                        })
                    },
                    error:function () {
                      alert("服务器忙...");
                    }
                });

                // 监听省份下拉框值改变事件
                $("#province").change(function () {
                    $.get({
                        url:"area", // 请求地址
                        data:{pid:this.value}, // 请求参数
                        dataType:"json", // 设置服务器返回数据类型
                        success:function (jsonArray) {
                            // jsonArray是一个JSON对象
                            // 清空之前的城市数据
                            $("#city > option:gt(0)").remove();
                            // 遍历城市数组
                            $(jsonArray).each(function (index, city) {
                                // 创建option元素
                                var option = $("<option value='"+city.id+"'>"+city.name+"</option>")
                                // 将option添加到城市下拉列表中
                                $("#city").append(option);
                            })
                        },
                        error:function () {
                            alert("服务器忙...");
                        }
                    });
                });
            });

        </script>
    </head>
    <body>

    <select id="province">
        <option>---请选择省---</option>
    </select>

    <select id="city">
        <option>---请选择城市---</option>
    </select>
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值