12.Ajax

12.Ajax

一、简介

  • 全称:Asynchronous JavaScript And Xml,翻译过来就时异步的JavaScript和Xml
  • 在Ajax中通过JavaScript发生请求,通过Xml作为响应数据,后来Xml被JSON替代
  • Ajax主要用来提升用户的体验
  • 同步和异步的区别
    • 同步请求
      • 当发送一个同步请求时,必须等到服务器响应成功之后才能发送其他请求,有一个等待的过程,而且响应成功之后会刷新整个页面
    • 异步请求
      • 当发送一个异步请求时,不需要等到服务器响应成功就可以发送其他请求,而且响应成功之后可以局部刷新页面

二、通过JavaScript发送Ajax请求

  • 1)创建XMLHttpRequest对象(除了IE6和IE5浏览器)
//1.创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
  • 2)设置请求信息

    • GET请求
     //2.设置请求信息
              /*
                open(method,url,async)
                  method:设置请求方式,get或post
                  url:设置请求地址
                  async:接收一个布尔类型的值,设置发送异步请求还是同步请求,默认值是true,
                        发送的是异步请求
               */
              xhr.open("get","${pageContext.request.contextPath}/AjaxServlet?username=admin&password=123456");
    
    • POST请求
    //2.设置请求信息
              /*
                open(method,url,async)
                  method:设置请求方式,get或post
                  url:设置请求地址
                  async:接收一个布尔类型的值,设置发送异步请求还是同步请求,默认值是true,
                        发送的是异步请求
               */
              xhr.open("post","${pageContext.request.contextPath}/AjaxServlet");
              //POST请求在发送请求之前需要设置请求头对请求体中的数据进行URL编码
              xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    
  • 3)发送请求

    • GET请求
    //3.发送请求
              /*
                send(body)
                send方法中需要传入请求体,get请求没有请求体
               */
              xhr.send();
    
    • POST请求
    //3.发送请求
              /*
                send(body)
                send方法中需要传入请求体
               */
              xhr.send("username=admin&password=123456");
    
  • 4)接收响应

    • 接收字符串类型的数据
     //给XHMLHttpRequest对象绑定onreadystatechange事件判断它的状态
              xhr.onreadystatechange = function () {
                //当xhr的readyState的值为4并且状态码为200时才接收响应
                if(xhr.readyState == 4 && xhr.status == 200){
                  //4.接收响应
                  var text = xhr.responseText;
                  //将响应信息设置到span标签中
                  var spanEle = document.getElementById("msg");
                  spanEle.innerText = text;
                }
              };
    
    • 接收XML格式的数据
    //给XHMLHttpRequest对象绑定onreadystatechange事件判断它的状态
              xhr.onreadystatechange = function () {
                //当xhr的readyState的值为4并且状态码为200时才接收响应
                if(xhr.readyState == 4 && xhr.status == 200){
                  //4.接收响应
                  //接收XML格式的响应数据
                  var doc = xhr.responseXML;
                  //获取根标签student
                  var rootEle = doc.getElementsByTagName("student")[0];
                  //获取name标签
                  var nameEle = rootEle.getElementsByTagName("name")[0];
                  //获取name标签中的文本节点
                  var textNode = nameEle.firstChild;
                  //获取文本节点的节点值
                  var text = textNode.nodeValue;
                  //获取显示响应数据的span标签
                  var spanEle = document.getElementById("msg2");
                  spanEle.innerText = text;
                }
              };
    
    • AjaxServlet中的代码
    package com.atguigu.ajax.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    //处理Ajax请求的Servlet
    @WebServlet("/AjaxServlet")
    public class AjaxServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("doPost方法被调用");
            //获取用户名和密码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println(username);
            System.out.println(password);
            response.setContentType("text/xml;charset=utf-8");
            //给浏览器响应一个字符串
            PrintWriter writer = response.getWriter();
            //响应一个XML格式的数据
            writer.write("<student><name>张三</name><age>18</age></student>");
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("doGet方法被调用");
            //获取用户名和密码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println(username);
            System.out.println(password);
            response.setContentType("text/html;charset=utf-8");
            //给浏览器响应一个字符串
            PrintWriter writer = response.getWriter();
            writer.write("响应成功!");
        }
    }
    

三、通过jQery发送Ajax请求

  • 1)通过$.ajax()方法发送Ajax请求

    • jsp页面
    <%--
      Created by IntelliJ IDEA.
      User: 韩总
      Date: 2021/5/29
      Time: 16:16
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>通过jQuery发送Ajax请求</title>
        <script src="${pageContext.request.contextPath}/script/jquery-1.7.2.js"></script>
        <script>
            $(function () {
                //给按钮绑定单击事件
                $("#btnId").click(function () {
                    //通过jQuery的ajax()方法发送Ajax请求响应字符串类型的数据
                    /*
                        $.ajax(url,[settins])
                            url:必须的。用来设置请求地址
                            settings:可选的。常用的参数
                                type:用来设置请求方式,默认是get
                                data:用来设置请求参数
                                success:用来设置一个回调函数,响应成功之后系统会自动调用该函数,
                                        响应数据会以参数的形式传入到该函数中
                                error:用来指定出现异常时调用的函数
                                dataType:用来指定响应数据的类型
                     */
                    $.ajax({
                        url:"${pageContext.request.contextPath}/JQueryServlet",
                        type:"get",
                        data:"username=admin&password=666666",
                        success:function (res) {
                            //将响应信息设置到span标签中
                            $("#msg").text(res);
                        },
                        error:function () {
                            alert("出现异常了!");
                        },
                        dataType:"text"
                    });
                });
            });
        </script>
    </head>
    <body>
    <button id="btnId">通过jQuery的ajax()方法发送Ajax请求响应字符串类型的数据</button><span id="msg" style="color: red"></span><br>
    </body>
    </html>
    
    
    • JQueryServlet
    package com.atguigu.ajax.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    //处理通过jQuery发送的Ajax请求的Servlet
    @WebServlet("/JQueryServlet")
    public class JQueryServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("doPost方法被调用");
            //获取用户名和密码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println(username);
            System.out.println(password);
            response.setContentType("text/html;charset=utf-8");
            //给浏览器响应一个字符串
            PrintWriter writer = response.getWriter();
            writer.write("响应成功!");
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("doGet方法被调用");
            //获取用户名和密码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println(username);
            System.out.println(password);
            response.setContentType("text/html;charset=utf-8");
            //给浏览器响应一个字符串
            PrintWriter writer = response.getWriter();
            writer.write("响应成功!");
        }
    }
    
  • 2)通过 . g e t ( ) 或 .get()或 .get().post()发送Ajax请求

    • 前端Js代码
    //给第二个按钮绑定单击事件
                $("#btnId2").click(function () {
                    //通过jQuery的get()/post方法发送Ajax请求响应字符串类型的数据
                    /*
                   $.get(url, [data], [callback], [type])
                       url:必须的。用来设置请求地址
                       data:可选的。用来设置请求参数
                       callback:可选的。用来设置一个回调函数,响应成功之后系统会自动调用该函数,
                                        响应数据会以参数的形式传入到该函数中
                       type:可选的。用来设置响应数据的类型
                */
                    //设置请求地址
                    var url = "${pageContext.request.contextPath}/JQueryServlet";
                    //设置发送的请求参数
                    var params = "username=admin&password=111111";
                    $.post(url,params,function (res) {
                        //将响应数据设置到span标签中
                        $("#msg2").text(res);
                    },"text");
                });
    

四、JSON

  • 全称:JavaScript Object Notation,JavaScript对象的另一种表示方式,但是这个JS对象比较特殊,可以通过其他工具直接转换为一个字符串进行传输

  • JSON是一种跨平台、跨语言的数据交换格式

  • 由于XML格式的数据交换格式解析复杂、性能差,现在已经被JSON替代

  • XML格式的响应数据

    <student>
        <name>张三</name>
        <age>18</age>
    </student>
    
  • JSON格式的响应数据

    {"name":"张三","age":18}
    
  • JOSN格式

    • JSON对象
      • 格式:{“属性名1”:属性值,“属性名2”:属性值,“属性名3”:属性值}
      • 属性名必须使用双引号括起来;属性名和属性值之间使用冒号分隔;多个属性之间使用逗号分隔
    • JSON数组
      • 格式:[值1,值2,值3]
    • JOSN格式中的值能接受的类型
      • 字符串
      • 数字
      • null
      • 布尔类型的值
      • 对象
      • 数组
    <script>
            //声明JSON对象
            var jsonObj = {"name":"张三","age":18};
            //声明JSON数组
            var jsonArray = ["李四",24,null,true,jsonObj];
            //获取JSON数组中的第五个元素中的age属性值
            // alert(jsonArray[4].age);
            //声明一个稍微复杂的JSON对象
            var fzJsonObj = {"name":"唐僧","age":18,
                            "sons":[
                                {"name":"孙悟空","age":500},
                                {"name":"猪八戒","age":600,"wives":[
                                        {"name":"嫦娥","age":10000},
                                        {"name":"高翠兰","age":16},
                                        {"name":"某某菩萨","age":100000}
                                    ]},
                                {"name":"沙悟净","age":666},
                                {"name":"小白龙","age":1000}
                            ]
                            };
            //获取猪八戒第二任夫人的名字
            // alert(fzJsonObj.sons[1].wives[1].name);
        </script>
    
  • 在JavaScript中JSON对象与JSON字符串之间的转换

    • JSON对象转JSON字符串
      • JSON.stringify(JSON对象)
    • JSON字符串转JSON对象
      • JSON.parse(JSON字符串)
    <script>
            //声明JSON对象
            var jsonObj = {"name":"张三","age":18};
            //将JSON对象转换为JSON字符串
            var objToStr = JSON.stringify(jsonObj);
            // alert(objToStr);
            //声明一个JSON格式的字符串
            var JSONStr = '{"name":"女儿国国王","age":35}';
            //将JSON格式的字符串转换为JSON对象
            var strToObj = JSON.parse(JSONStr);
            //alert(strToObj);
    
        </script>
    
  • 在Java中将Java对象转换为JSON字符串

    • 通过第三方工具

      • gson
      • json-lib
      • jackson
    • 以gson为例

      • 导入gson的jar包
      • 创建Gson对象
      • 调用Gson中的toJson方法将Java对象转换为JSON字符串
       User user = new User(1, "张三", "333333", "zhangsan@lisi.com");
              //创建Gson对象
              Gson gson = new Gson();
              //将User对象转换为JSON格式的字符串
              String json = gson.toJson(user);
              System.out.println(json);
      
  • 通过发送Ajax请求接受JSON格式的数据

    • jsp页面
    <%--
      Created by IntelliJ IDEA.
      User: 韩总
      Date: 2021/5/31
      Time: 9:29
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>JSON格式</title>
        <script src="${pageContext.request.contextPath}/script/jquery-1.7.2.js"></script>
        <script>
            $(function () {
                //给按钮绑定单击事件
                $("#btnId").click(function () {
                    //通过jQuery的post/getJson方法发送Ajax请求响应JSON类型的数据
                    //设置请求地址
                    var url = "${pageContext.request.contextPath}/JSONServlet";
                    //通过$.post()方法发送Ajax请求
                    // $.post(url,function (res) {
                    //     // alert(res.id+"-"+res.username+"-"+res.password+"-"+res.email);
                    //     //将响应数据设置到span标签中
                    //     $("#msg").text(res.id+"-"+res.username+"-"+res.password+"-"+res.email);
                    // },"json");
                    //通过$.getJSON()方法接收JSON格式的响应数据,$.getJSON()发送的是一个GET请求
                    $.getJSON(url,function (res) {
                        //将响应数据设置到span标签中
                        $("#msg").text(res.id+"-"+res.username+"-"+res.password+"-"+res.email);
                    });
                });
            });
        </script>
    </head>
    <body>
    <button id="btnId">通过jQuery的post/getJson方法发送Ajax请求响应JSON类型的数据</button><span id="msg" style="color: red"></span><br>
    </body>
    </html>
    
    • 后台Servlet
    package com.atguigu.ajax.servlet;
    
    import com.atguigu.ajax.bean.User;
    import com.google.gson.Gson;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    //将Java对象转换为JSON字符串的Servlet
    @WebServlet(name = "JSONServlet",urlPatterns = "/JSONServlet")
    public class JSONServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //假设从数据库中查询到一个User对象
            User user = new User(1, "张三", "333333", "zhangsan@lisi.com");
            //创建Gson对象
            Gson gson = new Gson();
            //将User对象转换为JSON格式的字符串
            String json = gson.toJson(user);
            System.out.println(json);
            //解决响应乱码问题
            response.setContentType("text/html;charset=utf-8");
            //给浏览器响应一个JSON格式的字符串
            PrintWriter writer = response.getWriter();
            writer.write(json);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("doGet方法被调用");
            doPost(request,response);
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值