Ajax全面介绍教你怎么使用Ajax

简介: Ajax全面介绍教你怎么使用Ajax

Ajax 基本介绍

Ajax 是什么

  1. AJAX 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML)
  2. Ajax 是一种浏览器异步发起请求(指定发哪些数据),局部更新页面的技术
  3. 传统的方式

Ajax 经典应用场景

  1. 搜索引擎根据用户输入关键字,自动提示检索关键字
  2. 动态加载数据,按需取得数据【树形菜单、联动菜单…】
  3. 改善用户体验。【输入内容前提示、带进度条文件上传…】
  4. 电子商务应用。 【购物车、邮件订阅…】
  5. 访问第三方服务。【访问搜索服务、rss 阅读器】
  6. 页面局部刷新

Ajax 原理示意图

传统的 WEB 应用

Ajax 原理示意图

JavaScript 原生 Ajax 请求

应用实例

验证用户名是否存在

演示 javascript 发送原生 ajax 请求的案例

  1. 在输入框输入用户名
  2. 点击验证用户名, 使用 ajax 方式, 服务端验证该用户名是否已经占用了, 如果该用户已经占用, 以 json 格式返回该用户信息
  3. 假定用户名为 king , 就不可用, 其它用户名可以=》 后面我们接入 DB[Mysql+JDBC]
  4. 对页面进行局部刷新, 显示返回信息

程序框架图

数据库的思路分析图

代码完成

User.java

/**
 * User类就是一个javabean/pojo/entity/domain
 */
public class User {
    private Integer id;
    private String username;
    private String pwd;
    private String email;
    //必须提供一个无参构造器, 是给我们的反射使用
    public User() {
    }
    public User(Integer id, String username, String pwd, String email) {
        this.id = id;
        this.username = username;
        this.pwd = pwd;
        this.email = email;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

CheckUserServlet.java

import com.google.gson.Gson;
import com.hspedu.ajax.entity.User;
import com.hspedu.ajax.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CheckUserServlet extends HttpServlet {
    //定义一个UserService属性
    private UserService userService = new UserService();
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //System.out.println("CheckUserServlet 被调用....");
        //接收ajax提交的数据
        String uname = request.getParameter("uname");
        System.out.println("uname= " + uname);
        response.setContentType("text/html;charset=utf-8");
        //到DB查询
        //如果有就返回user对象,否则,返回的是null
        //User user = userService.getUserByName(uname);
        //if (user != null) {//说明用户名存在..,返回该user的json格式数据字符串
         //   Gson gson = new Gson();
         //   String strUser = gson.toJson(user);
          //  response.getWriter().write(strUser);
       // } else {
        //response.getWriter().write("");
       // }
        //假定用户名为 king , 就不可用, 其它用户名可以
        if("king".equals(uname)) {//不能使用king用户名
            //后面这个信息,是从DB获取
            User king = new User(100, "king", "666", "king@sohu.com");
           //把 king 转成 json字符串
            String strKing = new Gson().toJson(king);
            //返回
            response.getWriter().write(strKing);
          } else {
            //如果用户名可以用,返回""
            response.getWriter().write("");
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
    <script type="text/javascript">
        window.onload = function () { //页面加载后执行function
            var checkButton = document.getElementById("checkButton");
            //给checkButton绑定onclick
            checkButton.onclick = function () {
                //1. 创建XMLHttpRequest对象(!!!) [ajax引擎对象]
                var xhr = new XMLHttpRequest();
                //   获取用户填写的用户名
                var uname = document.getElementById("uname").value;
                //2. 准备发送指定数据 open, send
                //解读
                //(1)"GET" 请求方式可以 GET/POST
                //(2)"/ajax/checkUserServlet?username=" + uname 就是 url
                //(3)true , 表示异步发送
                xhr.open("GET", "/ajax/checkUserServlet?uname=" + uname, true);
                //说明,在send函数调用前,给XMLHttpRequest 绑定一个事件onreadystatechange
                //该事件表示,可以去指定一个函数,当数据变化,会触发onreadystatechange
                // 每当 xhr对象readyState 改变时,就会触发 onreadystatechange 事件
                xhr.onreadystatechange = function () {
                    //如果请求已完成,且响应已就绪, 并且状态码是200
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        //把返回的jon数据,显示在div
                        document.getElementById("div1").innerHTML = xhr.responseText;
                        //console.log("xhr=", xhr)
                        var responseText = xhr.responseText;
                        //console.log("返回的信息=" + responseText);
                        if (responseText != "") {
                            document.getElementById("myres").value = "用户名不可用"
                        } else {
                            document.getElementById("myres").value = "用户名可用"
                        }
                    }
                }
                //3. 真正的发送ajax请求[http请求]
                // 说明如果你POST 请求,再send("发送的数据")
                xhr.send();
            }
        }
    </script>
</head>
<body>
<h1>用户注册~</h1>
<form action="/ajax/checkUserServlet" method="post">
    用户名字:<input type="text" name="username" id="uname">
    <input type="button" id="checkButton" value="验证用户名">
    <input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>
    用户密码:<input type="password" name="password"><br/><br/>
    电子邮件:<input type="text" name="email"><br/><br/>
    <input type="submit" value="用户注册">
</form>
<h1>返回的json数据</h1>
<div id="div1"></div>
</body>
</html>

sql

CREATE DATABASE ajaxdb
USE ajaxdb
-- 创建表
CREATE TABLE `user` (
id INT PRIMARY KEY,
username VARCHAR(32) NOT NULL DEFAULT '',
pwd CHAR(32) NOT NULL DEFAULT '',
email VARCHAR(32) NOT NULL DEFAULT '')CHARSET utf8 ENGINE INNODB
-- 测试数据
INSERT INTO `user` VALUES(100, 'king', MD5('123'), 'king@qq.com');
INSERT INTO `user` VALUES(200, 'hspedu', MD5('666'), '123@qq.com');
SELECT * FROM `user`

原生 Ajax 请求问题分析

  1. 编写原生的 Ajax 要写很多的代码,还要考虑浏览器兼容问题,使用不方便。
  2. 在实际工作中,一般使用 JavaScript 的库(比如 Jquery) 发送 Ajax 请求,从而解决这个问题

在线文档jQuery AJAX get() 和 post() 方法

$.ajax 方法

1. $.ajax 常用参数

● url: 请求的地址

● type : 请求的方式 get 或 post

● data : 发送到服务器的数据。将自动转换为请求字符串格式

● success: 成功的回调函数

● error: 失败后的回调函数

● dataType: 返回的数据类型 常用 json 或 text

. g e t 请求和 .get 请求和.get请求和.post 请求

  1. $.get 和 $.post常用参数

url: 请求的 URL 地址

data: 请求发送到服务器的数据

success: 成功时回调函数

type: 返回内容格式,xml, html, script, json, text

  1. 说明:$.get 和 . p o s t 底层还是使用 .post 底层还是使用.post底层还是使用.ajax()方法来实现异步请求

$.getJSON

  1. $.getJSON 常用参数

url: 请求发送的哪个 URL

data: 请求发送到服务器的数据

success: 请求成功时运行的函数

  1. 说明:. g e t J S O N 底层使用 .getJSON 底层使用.getJSON底层使用.ajax()方法来实现异步请求

代码实战

  1. 在输入框输入用户名
  2. 点击验证用户名, 服务端验证该用户名是否已经占用了, 如果该用户已经占用, 以 json格式返回该用户信息
  3. 链接数据库验证表前面有
  4. 对页面进行局部刷新, 显示返回信息

login2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
    <!--    引入jquery-->
    <script type="text/javascript" src="./script/jquery-3.6.0.min.js"></script>
    <script type="text/javascript">
        $(function () {
            //绑定事件
            $("#btn1").click(function () {
                //发出ajax
                /**
                 * 解读
                 * 1. 指定参数时,需要在{}
                 * 2. 给参数时,前面需要指定参数名
                 * 3. dataType: "json" 要求服务器返回的数据格式是json
                 */
                //     $.ajax({
                //         url: "/ajax/checkUserServlet2",
                //         type: "POST",
                //         data: { //这里我们直接给json, 为啥我要传日期, 为了浏览器缓存
                //             username: $("#uname").val(),
                //             date: new Date()
                //         },
                //         error: function () { //失败后的回调函数
                //             console.log("失败~")
                //         },
                //         success: function (data, status, xhr) {
                //             console.log("成功");
                //             console.log("data=", data);
                //             console.log("status=", status);
                //             console.log("xhr=", xhr);
                //             //data是json对象-> 显示转成json的字符串
                //             $("#div1").html(JSON.stringify(data));
                //             //对返回的结果进行处理
                //             if ("" == data.username) {
                //                 $("#myres").val("该用户名可用");
                //             } else {
                //                 $("#myres").val("该用户名不可用");
                //             }
                //         },
                //         dataType: "json"
                //     })
                //说明
                //1.$.get() 默认是get请求,不需要指定 请求方式
                //2.不需要指定参数名
                //3.填写的实参,是顺序 url, data, success回调函数, 返回的数据格式
                //讲解.get() 使用
                // $.get(
                //     "/ajax/checkUserServlet2",
                //     {
                //         username: $("#uname").val(),
                //         date: new Date()
                //     },
                //     function (data, status, xhr) {
                //         console.log("$.get() 成功");
                //         console.log("data=", data);
                //         console.log("status=", status);
                //         console.log("xhr=", xhr);
                //         //data是json对象-> 显示转成json的字符串
                //         $("#div1").html(JSON.stringify(data));
                //         //对返回的结果进行处理
                //         if ("" == data.username) {
                //             $("#myres").val("该用户名可用");
                //         } else {
                //             $("#myres").val("该用户名不可用");
                //         }
                //     },
                //     "json"
                // )
                //说明$.post() 和 $.get() 的方式一样
                //只是这时,是按照post方式发送ajax请求
                // $.post(
                //     "/ajax/checkUserServlet2",
                //     {
                //         username: $("#uname").val(),
                //         date: new Date()
                //     },
                //     function (data, status, xhr) {
                //         console.log("$.post() 成功");
                //         console.log("data=", data);
                //         console.log("status=", status);
                //         console.log("xhr=", xhr);
                //         //data是json对象-> 显示转成json的字符串
                //         $("#div1").html(JSON.stringify(data));
                //         //对返回的结果进行处理
                //         if ("" == data.username) {
                //             $("#myres").val("该用户名可用");
                //         } else {
                //             $("#myres").val("该用户名不可用");
                //         }
                //     },
                //     "json"
                // )
                //说明
                //1. 如果你通过jquery发出的ajax请求是get 并且 返回的数据格式是json
                //2. 可以直接使用getJSON() 函数,就很简洁
                $.getJSON(
                    "/ajax/checkUserServlet2",
                    {
                        username: $("#uname").val(),
                        date: new Date()
                    },
                    function (data, status, xhr) {//成功后的回调函数
                        console.log("$.getJSON 成功");
                        console.log("data=", data);
                        console.log("status=", status);
                        console.log("xhr=", xhr);
                        //data是json对象-> 显示转成json的字符串
                        $("#div1").html(JSON.stringify(data));
                        //对返回的结果进行处理
                        if ("" == data.username) {
                            $("#myres").val("该用户名可用");
                        } else {
                            $("#myres").val("该用户名不可用");
                        }
                    }
                )
            })
        })
    </script>
</head>
<body>
<h1>用户注册-Jquery+Ajax</h1>
<form action="/ajax/checkUserServlet2" method="post">
    用户名字:<input type="text" name="username" id="uname">
    <input type="button" id="btn1" value="验证用户名">
    <input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>
    用户密码:<input type="password" name="password"><br/><br/>
    电子邮件:<input type="text" name="email"><br/><br/>
    <input type="submit" id="submit" value="用户注册">
</form>
<h1>返回的json数据</h1>
<div id="div1"></div>
</body>
</html>

CheckUserServlet2

import com.google.gson.Gson;
import com.hspedu.ajax.entity.User;
import com.hspedu.ajax.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CheckUserServlet2 extends HttpServlet {
    private UserService userService=new UserService();
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收jquery发送的ajax数据
        String username = request.getParameter("username");
        //查询有没有这个人
        User userByName = userService.getUserByName(username);
        response.setContentType("text/json;charset=utf-8");
        Gson gson = new Gson();
        if (null!=userByName) {
            response.getWriter().write(gson.toJson(userByName));
        } else {
            //返回一个不存在的User=>是有设计
            User user = new User(-1, "", "", "");
            response.getWriter().write(gson.toJson(user));
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}


目录
相关文章
|
JSON 前端开发 JavaScript
【JavaScript】Promise(一) —— 理解和使用(是什么、怎么使用、与 Ajax 配合使用、涉及的API)
【JavaScript】Promise(一) —— 理解和使用(是什么、怎么使用、与 Ajax 配合使用、涉及的API)
106 0
|
XML 前端开发 JavaScript
什么是Ajax和jquery
什么是Ajax和jquery
85 0
|
6月前
|
JSON 前端开发 Java
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
149 0
|
6月前
|
敏捷开发 JavaScript 前端开发
❤❤❤【Vue.js最新版】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本❤❤❤
❤❤❤【Vue.js最新版】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本❤❤❤
|
前端开发 JavaScript
jQuery中的Ajax请求----ajax请求篇(二)
在jQuery中的Ajax请求其实是在底层对原生js请求方式的封装,那么jQuery中的Ajax请求是怎样的呢?
64 0
|
6月前
|
前端开发 JavaScript
Jquery ajax捕获错误信息
Jquery ajax捕获错误信息
57 0
|
6月前
|
JSON 缓存 前端开发
Jquery中AJAX的应用
Jquery中AJAX的应用
78 0
|
6月前
|
JSON 前端开发 JavaScript
jQuery中ajax的使用
jQuery中ajax的使用
|
6月前
|
XML JavaScript 前端开发
【Web智能聊天客服】之JavaScript、jQuery、AJAX讲解及实例(超详细必看 附源码)
【Web智能聊天客服】之JavaScript、jQuery、AJAX讲解及实例(超详细必看 附源码)
90 0
|
6月前
|
前端开发 JavaScript API
【uni-app】【基于jQuery Ajax】[sd.js]最新原生完整版for凯哥API版本
【uni-app】【基于jQuery Ajax】[sd.js]最新原生完整版for凯哥API版本