AJAX

02.ajax介绍与应用场景【理解】


浏览器请求服务器获取资源数据包含2种方式:

1.页面有刷新请求服务器资源数据,我们之前使用的方式。

2.页面无刷新请求服务器资源数据,那么什么是无刷新请求呢?就是Ajax

ajax介绍

***A***synchronous ***J***avaScript ***A***nd ***X***ML(异步的JavaScript和XML)。使用ajax可以进行异步请求,无刷新获取服务器的数据。以前是浏览器发送有刷新同步请求,现在是js发送无刷新异步请求。

异步无刷新AJAX应用场景
  1. 异步检验用户名

    [外链图片转存失败(img-AP5hsxqC-1566890487621)(assets/)]

  2. 内容自动补全

    [外链图片转存失败(img-2Rb8TPXJ-1566890487622)(assets/)]

小结
  • 什么是ajax?

    无刷新技术,局部刷新,js发送异步请求,异步无刷新技术

03.同步与异步请求区别和ajax实现原理过程【理解】


同步与异步请求区别

[外链图片转存失败(img-sZld1Wrq-1566890487622)(assets)]

同步方式发送请求

浏览器发送请求,服务器处理(用户处于等待),服务器返回数据给浏览器,浏览器加载整个页面

异步方式发送请求

js发送异步请求,服务器处理(用户不需要等待),服务器返回的数据给js,js操作dom更新局部页面,也叫局部刷新

04.原生js实现ajax案例1-servlet处理异步校验请求【应用】


需求

实现用户注册功能异步校验用户名是否存在

效果

[外链图片转存失败(img-Ja0QC69e-1566890487623)(assets/)]

注册页面素材
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>
    用户名:<input type="text" id="username" name="username"><span id="info"></span>
</p>
<script type="text/javascript">
       //目标:提交异步请求验证用户名是否已被注册
</script>
</body>
</html>
实现步骤

[外链图片转存失败(img-sRQDHfeW-1566890487623)(assets/)]

服务器返回true,代表已被注册

服务器返回false,代表可以使用

[外链图片转存失败(img-FuB8ZjQh-1566890487623)(assets/)] 

CheckUserNameServlet代码
package com.itheima.web;

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;

@WebServlet(name = "CheckUserNameServlet",urlPatterns = "/CheckUserNameServlet")
public class CheckUserNameServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.获取请求数据username
        String username = request.getParameter("username");

        //2.校验用户名是否为admin
        if("admin".equals(username)) {

            //3.是admin,返回true,代表用户名已被注册
            response.getWriter().write("true");
        }else {

            //4.不是,返回false,代表用户名可以使用
            response.getWriter().write("false");
        }
    }
}

05.原生js实现ajax案例2-前端发送异步请求与更新页面【了解】


发送异步请求语法

原生api方法,原生异步核心js对象XMLHttpRequest

[外链图片转存失败(img-iNgAc5ro-1566890487624)(assets/)]

ajax连接状态
            // readyState存有ajax连接状态,从 0 到 4 发生变化。
            // 0: 请求未初始化
            // 1: 服务器连接已建立
            // 2: 请求已接收
            // 3: 请求处理中
            // 4: 请求已完成,且响应已就绪

[外链图片转存失败(img-UhlyjBHC-1566890487625)(assets/)]

实现代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>
    用户名:<input type="text" id="username" name="username"><span id="info"></span>
</p>
<script type="text/javascript">
    //目标:提交异步请求验证用户名是否已被注册

    //1.给文本框注册失去焦点事件
    document.getElementById("username").onblur=function () {

        //2.获取输入的用户名
        var username = this.value;

        //3.用户名有值,发送异步请求
        if(username){

            //4.发送异步请求
            //4.1 创建ajax引擎对象【重点】
            var xmlHttp = new XMLHttpRequest();

            //4.2 设置异步请求回调函数,用于获取服务器返回的数据更新到页面上
            xmlHttp.onreadystatechange = function () {

                //获取服务器返回的数据有2个前提:
                //  1.ajax引擎与服务器通信状态readyState=4, 代表获取服务器响应的数据完成
                //  2.http协议通信状态码status=200, 代表通信正常
                if(xmlHttp.readyState==4 && xmlHttp.status==200){

                    //获取服务器返回的数据
                    var isRegister = xmlHttp.responseText;//返回数据有:"true"或“false”

                    if(isRegister=="true"){
                        //如果服务器返回“true”,显示已被注册
                        document.getElementById("info").innerHTML="已被注册";
                    }else{
                        //如果服务器返回“false”,显示可以使用
                        document.getElementById("info").innerHTML="可以使用";
                    }
                }
            };

            //4.3 初始化请求,设置请求提交数据方法、访问服务器的资源路径
            xmlHttp.open("get","CheckUserNameServlet?username="+username,true);
            //  参数1:设置提交请求数据的方法,get或post
            //  参数2:访问服务器的资源路径
            //  参数3:设置是否异步提交请求,true代表异步,并且是默认值,可以省略

            //4.4 发送异步请求
            xmlHttp.send();

        }
    }
</script>
</body>
</html>
小结
  • ajax引擎核心操作对象叫什么?

    XMLHttpRequest

  • 服务器处理异步请求返回数据给前端,前端如何将数据更新到页面上?

    js操作dom

06.原生js实现ajax案例3-调试测试运行【应用】


目标

使用debug调试条码运行,观察整个异步发送请求、服务器处理、js更新页面的运行过程。

实现步骤
前端调试
  1. 使用浏览器的开发者工具

  2. 设置断点

  3. 每一行运行

    [外链图片转存失败(img-94GFO5Yz-1566890487625)(assets/)]

后端调试
  1. 设置断点

  2. 每一行运行

    [外链图片转存失败(img-sl1eTLCo-1566890487626)(assets/)]

小结
  • 如何调试知道前端发送异步请求成功了?

    在后端设置断点,并能进入运行

  • 如何调试知道服务器成功处理了异步请求?

    在前端回调函数里面设置断点,并能进入运行

07.jq实现ajax的五种方式1-全局对象get方法【应用】


jq五种常用ajax方法语法

[外链图片转存失败(img-lF0dpQ81-1566890487626)(assets/)]

实现代码

[外链图片转存失败(img-ebmet4RR-1566890487626)(assets/)] 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
<p>
    用户名:<input type="text" id="username" name="username"><span id="info"></span>
</p>

<script type="text/javascript">
    //目标:提交异步请求验证用户名是否已被注册

    //1.给文本框注册失去焦点事件
    $("#username").blur(function () {

        //2.获取输入的用户名
        var username = $(this).val();

        //3.用户名有值,发送异步请求
        if(username){

            //4.使用jquery的全局get方法发送异步请求
            /*
            * 语法:
            *   $.get(url[,data][,callback][,type]);
            *   参数1:url,设置提交请求的服务器资源路径地址
            *   参数2:data,提交的请求数据,支持2中提交数据格式:
            *           格式1:键值对的字符串格式,"key1=value1&key2=value2..."
            *           格式2:js对象格式(json对象)格式,{key1:value1,key2:value2,...}
            *   参数3:callback,服务返回数据成功的回调函数
            *   参数4:type,设置服务返回的数据类型,默认返回文本字符串
            *       type="text",默认值,返回的文本字符串
            *       type="html",默认值,返回的文本html代码
            *       type="scripts",默认值,返回的文本js代码
            *       type="xml",默认值,返回的文本xml数据
            *       type="json",默认值,返回的文本json字符串数据,jquery并且将其转换为js对象(json对象)
            *               json字符串='{"key1":value1,"key2":value2,....}';  json字符串格式规范要求里面的key必须使用双引号括起来
            *               这里会将其服务器发很好的json字符串转换为json对象={key1:value1,key2:value2,...}
            *               疑问:返回js对象有什么好处?答:方便解析数据,格式=对象.属性名  获取数据
            *               例子:var person={username:"张三",age:20}
            *               获取张三格式,person.username
            *
            *   注意:此方法url参数是必须有的,其他参数可有可无
            * */
             $.get(
                 "CheckUserNameServlet",//服务器资源地址
                 "username="+username,//提交的请求数据
                 function (isRegister) {  //服务器成功返回数据的回调函数
                     //isRegister是服务器返回的数据
                     if(isRegister=="true"){
                         //如果服务器返回“true”,显示已被注册
                         $("#info").html("已被注册");
                     }else{
                         //如果服务器返回“false”,显示可以使用
                         $("#info").html("可以使用");
                     }
                 }
             );

        }
    });
</script>
</body>
</html>
小结
  • get异步请求的参数有几个?哪一个参数是必须的?

    4个,url是必须的。

  • 异步请求传递请求参数数据格式有几种?分别是什么?

    2种

    格式1:以key=value字符串形式,例如:'key1=value1&key2=value2...'
    格式2:json普通对象格式,{key1:value1,key2:value2}
    

08.jq实现ajax的五种方式2-全局对象post方法【应用】


实现步骤
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
<p>
    用户名:<input type="text" id="username" name="username"><span id="info"></span>
</p>
<script type="text/javascript">
    //目标:提交异步请求验证用户名是否已被注册

    //1.给用户名文本框注册失去焦点事件
    $("#username").blur(function () {

        //2.获取输入的用户名
        var username  = $(this).val();

        //3.校验用户名是否有值
        if(username){

            //4.用户名有值提交异步请求【jquery的post方法实现ajax异步请求】
            /*
            * 语法:$.post(url[,data][,callback][,type]);
            * 参数1: url, 设置服务器资源地址,这是必须的参数
            * 参数2: data, 设置提交的请求数据,支持2种格式
            *        格式1:键值对的字符串形式,eg:"key1=value1&key2=value2..."
            *        格式2:js对象方式(json对象),eg:{key1:value1,key2:value2,...}
            * 参数3: callback, 设置成功的回调函数
            *       格式:function(result){...}
            *       result是服务器返回的结果,使用一个参数接收
            * 参数4:设置服务器返回数据的类型,默认文本字符串
            *       type="xml",设置服务器返回xml格式的字符串
            *       type="text",设置服务器返回文本字符串,默认值
            *       type="script",设置服务器返回javascript字符串
            *       type="html",设置服务器返回html格式字符串
            *       type="json",设置服务器返回json格式字符串,并将其转换为json对象(js对象)
            *           json格式字符串:'{"key1":value1,"key2":value2,...}' 注意:要求json字符串里面的可以必须使用双引号括起来
            * */
            $.post(
                "CheckUserNameServlet",
                {name:username},
                function (result) {
                    //更新页面显示
                    //result有2个值true或false字符串
                    if(result=="true"){
                        //页面显示“已被注册”
                        $("#info").text("已被注册");
                    }else{
                        //页面显示“可以使用”
                        $("#info").text("可以使用");
                    }
                }
            );
        }
    });

</script>
</body>
</html>
小结
  • post提交异步请求比get好在哪里?

    提交数据大小没有限制

09.jq实现ajax的五种方式3-全局对象ajax方法【应用】


目标

实现异步登录

效果

[外链图片转存失败(img-9Okmos2v-1566890487627)(assets/)]

[外链图片转存失败(img-CuloNQg2-1566890487627)(assets/)]

页面素材

<!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>
</head>
<body>
<h2>用户登录</h2>
<form action="login" method="post" id="loginForm">
    <table>
        <tr>
            <td>用户名</td>
            <td><input type="text" name="username" id="username" placeholder="请输入用户名"/></td>
        </tr>
        <tr>
            <td>密码</td>
            <td><input type="password" name="password" id="password" placeholder="请输入密码"/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="button" value="登录" id="btnLogin"/></td>
        </tr>
    </table>
</form>
<script type="text/javascript">
   

</script>
</body>
</html>
ajax方法语法
        * 语法:$.ajax(json对象)  --api文档写法$.ajax([settings])
        * json对象常用属性如下:
        *   url	    服务器访问地址
            async	设置后台发送类型,是异步或同步发送。通常省略
                    默认值:true,异步发送请求
            data	发送给服务器的数据的格式
                    格式1:键=值
                    格式2:{键:值} 里面可以有多个键值对
            method	发送请求的方式:GET或POST,早期的版本这个属性叫:type
                    默认的请求方式,GET方式
            dataType	服务器返回的数据类型
                        取值可以是 xml, html, script, json, text, _default等
            success	服务器响应成功以后调用的回调函数
                    回调函数的参数是服务器返回的数据
            error	如果服务器出现异常调用这个函数
实现代码
LoginServlet代码

[外链图片转存失败(img-6rF0dvM3-1566890487627)(assets/)] 

package com.itheima.web;

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;

@WebServlet(name = "LoginServlet",urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int a=1/0;
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.获取请求数据username和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //2.校验用户名必须为admin,密码必须为123
        if("admin".equals(username) && "123".equals(password)) {

            //3.校验通过,返回true,代表登录成功
            response.getWriter().write("true");
        }else {

            //4.校验失败,返回false,代表登录失败
            response.getWriter().write("false");
        }
    }
}
04.jquery_ajax_ajax.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!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>
</head>
<body>
<h2>用户登录</h2>
<form action="login" method="post" id="loginForm">
    <table>
        <tr>
            <td>用户名</td>
            <td><input type="text" name="username" id="username" placeholder="请输入用户名"/></td>
        </tr>
        <tr>
            <td>密码</td>
            <td><input type="password" name="password" id="password" placeholder="请输入密码"/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="button" value="登录" id="btnLogin"/></td>
        </tr>
    </table>
</form>
<script type="text/javascript">

    //1.给登录按钮注册点击事件【注意,不可以使用表单的提交事件,因为提交是有刷新请求】
    $("#btnLogin").click(function () {

        //2.获取用户名与密码
        var username = $("#username").val();
        var password = $("#password").val();

        //3.使用jquery的ajax全局方法提交异步请求
        /*
        * 语法:$.ajax(json对象)
        * 这个全局方法参数json对象常用的属性如下:
        *   url	服务器访问地址
            async	设置后台发送类型,是异步或同步发送。通常省略
                    默认值:true,异步发送请求
            data	发送给服务器的数据的格式
                    格式1:键=值
                    格式2:{键:值} 里面可以有多个键值对
            method	发送请求的方式:GET或POST,早期的版本这个属性叫:type
                    默认的请求方式,GET方式
            dataType	服务器返回的数据类型
                        取值可以是 xml, html, script, json, text, _default等
            success	服务器响应成功以后调用的回调函数
                    回调函数的参数是服务器返回的数据
            error	如果服务器出现异常调用这个函数

         * 总结:ajax全局方法功能比全局的get,post方法强大如下:
         *       1.ajax全局方法可以设置是否异步,全局get,post只能异步
         *       2.ajax全局方法可以设置错误回调函数,全局get,post只有成功回调函数
        * */
        $.ajax({
            url:"LoginServlet",
            data:{username:username,password:password},
            method:"post",
            success:function (isLogin) {
                //isLogin服务器返回数据“true”或“false”
                if("true"==isLogin){
                    //返回“true”,代表登录成功
                    alert(username+"登录成功了");
                }else {
                    //返回“false”,代表登录失败
                    alert(username+"登录失败");
                }
            },
            error:function () {
                alert("服务器忙。。。");  //简单输出消息,以后会跳转到友好页面显示
            }
        });

    });


</script>
</body>
</html>
小结
  • ajax方法发送异步请求比get/post方法更好在什么地方?

    功能多

    可以传入是否是发送异步请求

    服务器发生异常的错误回调函数

10.jq3.0新增get-post签名方法发送异步请求【应用】


get签名方法方式
<script type="text/javascript">

    //1.给登录按钮注册点击事件【注意,不可以使用表单的提交事件,因为提交是有刷新请求】
    $("#btnLogin").click(function () {

        //2.获取用户名与密码
        var username = $("#username").val();
        var password = $("#password").val();

        //3.使用jquery的get全局方法提交异步请求
        /*
        * 语法:$.get(json对象)  由于明确写了get,所以叫get签名方法
        *
        * 这个全局方法参数json对象常用的属性如下:
        *   url	服务器访问地址
            async	设置后台发送类型,是异步或同步发送。通常省略
                    默认值:true,异步发送请求
            data	发送给服务器的数据的格式
                    格式1:键=值
                    格式2:{键:值} 里面可以有多个键值对
            dataType	服务器返回的数据类型
                        取值可以是 xml, html, script, json, text, _default等
            success	服务器响应成功以后调用的回调函数
                    回调函数的参数是服务器返回的数据
            error	如果服务器出现异常调用这个函数

         * 总结:jquery3.0新特性get全局方法与ajax全局方法功能对比如下:
         *       新特性方法少写method参数,达到了简化,可读性更强
        * */
        $.get({
            url:"LoginServlet",
            data:{username:username,password:password},
            success:function (isLogin) {
                //isLogin服务器返回数据“true”或“false”
                if("true"==isLogin){
                    //返回“true”,代表登录成功
                    alert(username+"登录成功了");
                }else {
                    //返回“false”,代表登录失败
                    alert(username+"登录失败");
                }
            },
            error:function () {
                alert("服务器忙。。。");  //简单输出消息,以后会跳转到友好页面显示
            }
        });

    });


</script>
post签名方法方式【推荐使用】
<script type="text/javascript">

    //1.给登录按钮注册点击事件【注意,不可以使用表单的提交事件,因为提交是有刷新请求】
    $("#btnLogin").click(function () {

        //2.获取用户名与密码
        var username = $("#username").val();
        var password = $("#password").val();

        //3.使用jquery的post全局方法提交异步请求
        /*
        * 语法:$.post(json对象)  由于明确写了post,所以叫post签名方法【推荐使用】
        *
        * 这个全局方法参数json对象常用的属性如下:
        *   url	服务器访问地址
            async	设置后台发送类型,是异步或同步发送。通常省略
                    默认值:true,异步发送请求
            data	发送给服务器的数据的格式
                    格式1:键=值
                    格式2:{键:值} 里面可以有多个键值对
            dataType	服务器返回的数据类型
                        取值可以是 xml, html, script, json, text, _default等
            success	服务器响应成功以后调用的回调函数
                    回调函数的参数是服务器返回的数据
            error	如果服务器出现异常调用这个函数

         * 总结:jquery3.0新特性post全局方法与ajax全局方法功能对比如下:
         *       新特性方法少写method参数,达到了简化,可读性更强
        * */
        $.post({
            url:"LoginServlet",
            data:{username:username,password:password},
            success:function (isLogin) {
                //isLogin服务器返回数据“true”或“false”
                if("true"==isLogin){
                    //返回“true”,代表登录成功
                    alert(username+"登录成功了");
                }else {
                    //返回“false”,代表登录失败
                    alert(username+"登录失败");
                }
            },
            error:function () {
                alert("服务器忙。。。");  //简单输出消息,以后会跳转到友好页面显示
            }
        });

    });


</script>
小结
  • jq3.0新增get/post签名方法比原有ajax方法更好在什么地方?

    简化了请求方式的设置,少设置一个参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值