JavaWeb - 15 异步请求 Ajax axios

news/2024/7/6 0:41:54

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1.同步请求与异步请求
    • 1.1 同步请求
    • 1.2 异步请求
  • 2. Ajax发送异步请求
    • 2.1 Ajax概述
    • 2.2 原生JS实现AJAX详解
    • 2.3 代码码演示
  • 3. axios框架
    • 3.1 axios概述
    • 3.2 安装方式
    • 3.3 快速入门
    • 3.4 请求相关配置config
    • 3.5 响应结果信息
    • 3.6 请求方法的别名
    • 3.7 案例

1.同步请求与异步请求

浏览器发送请求给服务器,其有同步请求和异步请求两种方式。

1.1 同步请求

概述 : 就是在发送一个请求之后,需要等待服务器响应返回,才能够发送下一个请求。之前学的请求是通过浏览器地址栏发送请求,这种方式就是属于同步请求。

在这里插入图片描述

同步请求的执行过程 :

  1. 用户向服务器发送请求;
  2. 服务器处理后实时动态生成Html,以response数据形式发回给客户端;
  3. 客户端强制刷新页面(浏览器重新运行资源);
  4. 在此期间,用户只能等待服务器的执行结。

以登录为例:

  • 第一次向服务器发送请求,tomcat会把login.html发送给servlet,并执行services方法。生成登录页面并返回给浏览器。

    在这里插入图片描述

  • 第二次像服务器发送请求,tomcat把信息提交给servlet,执行登录业务方法。然后根据跳转结果生成新的页面,返回给浏览器。注意的是即使用户名密码错误也要重新渲染页面。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P80HQmNd-1664550998505)(2.png)]

同步请求的缺陷:

①请求必须要等待响应

如果遇到请求阻塞,网络延迟,用户需要等待,这样用户体验效果不好。

②请求时会携带所有的信息

例如一个表单处理,表单中有很多信息,若这时候表单中某个信息是错误的,当请求servlet时,会重新刷新页面。表单中的数据又要从新填写,造成一定的困难。

1.2 异步请求

概述 : 和同步请求相对,异步不需要等待响应,随时可以发送下一次请求。

在这里插入图片描述

异步请求执行过程:

  1. 用户向服务器发送请求;
  2. 服务器处理后发回response数据(一般是JSON格式);
  3. 客户端收到数据,实时生成部分html并渲染显示;
  4. 在此期间,不影响用户使用浏览器(并行)。

还是以上述登录为例:

  • 第一次向服务器发送请求,tomcat会把login.html发送给servlet,并执行services方法。生成登录页面并返回给浏览器。

  • 第二发向服务器发送请求:若输入有误时,步骤⑤将跳转回原页面。此时服务器仅需发回出错提示信息(JSON数据)。客户端浏览器根据这些数据动态渲染界面(局部更新),可提升客户端体验。

    在这里插入图片描述

    这是使用异步请求,就弥补了同步请求的一些缺陷。

2. Ajax发送异步请求

2.1 Ajax概述

  • AJAX(Asynchronous JavaScript And XML):异步的 JavaScript 和 XML。
  • 本身不是一种新技术,而是多个技术综合。用于快速创建动态网页的技术。
  • 一般的网页如果需要更新内容,必需重新加载个页面。 而 AJAX 通过浏览器与服务器进行少量数据交换,就可以使网页实现异步更新。
  • 也就是在不重新加 载整个页 面的情况下,对网页的部分内容进行局部更新。

2.2 原生JS实现AJAX详解

  • 核心对象:XMLHttpRequest
    • 用于在后台与服务器交换数据。可以在不重新加载整个网页的情况下,对网页的某部分进行 更新。
  • 打开链接:open(method,url,async) method:
    • 请求的类型 GET 或 POST。
    • url:请求资源的路径。
    • async:true(异步) 或 false(同步)。
  • 发送请求:send(String params) params: 请求的参数(POST 专用)。
  • 处理响应:onreadystatechange readyState:
    • 0-请求未初始化,1-服务器连接已建立,2-请求已接收,3-请求处理中,4-请求 已完成,且响应已就绪。
    • status:200-响应已全部 OK。
  • 获得响应数据形式 responseText: 获得字符串形式的响应数据。
  • responseXML: 获得 XML 形式的响应数据。

2.3 代码码演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax</title>
</head>
<body>
<button onclick="fn1()">异步请求</button>
</body>
<script>
    function fn1() {
        //1.创建异步请求对象
        var xhr = new XMLHttpRequest();

        //2.设置监听异步请求对象状态改变的函数
        xhr.onreadystatechange = function () {
            if (xhr.status == 200 && xhr.readyState == 4) {
                //异步请求成功 , 获取响应正文
                var data = xhr.responseText;
                console.log(data);
            }
        }
        //3.打开链接(设置参数)

        xhr.open("get", "/day20/demo01", true);

        //4.发送请求
        xhr.send();
    }
</script>
</html>

3. axios框架

3.1 axios概述

概述 : Axios,是一个基于promise 的网络请求库,作用于node.js和浏览器中,它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生node.js http模块, 而在客户端 (浏览端) 则使用XMLHttpRequest。

特点:

  • 从浏览器创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防御XSRF

3.2 安装方式

使用 npm:

$ npm install axios

使用 bower:

$ bower install axios

使用 cdn:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

3.3 快速入门

开发步骤:

  1. 导入axios.jsb包
  2. 发送请求

代码演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>axios入门案例</title>
</head>
<body>
<button onclick="fn1()">异步请求</button>
</body>
<!--导入axios包-->
<script src="/day20/js/axios.js"></script>
<script>
    function fn1() {
        // 发送请求
        axios({
            url:"/day20/demo01", // 请求路径
            method:"get", // 请求方式
        }).then(function (res) {
            // 请求成功
            console.log(res);
        }).catch(function (res) {
            // 请求失败
            console.log(res);
        });
    }
</script>
</html>

3.4 请求相关配置config

{
   // url是用于请求的服务器 URL
  url: '/服务器请求路径',

  // method 是创建请求时使用的方法
  method: '请求方式', // get、post、put、delete....

  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  baseURL: 'https://some-domain.com/api/',

  // transformRequest 允许在向服务器发送前,修改请求数据
  // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
  transformRequest: [function (data, headers) {
    // 对 data 进行任意转换处理
    return data;
  }],

  // transformResponse 在传递给 then/catch 前,允许修改响应数据
  transformResponse: [function (data) {
    // 对 data 进行任意转换处理
    return data;
  }],

  // headers 是即将被发送的自定义请求头
  headers: {'请求头名称': '请求头值'},

  // params是即将与请求一起发送的 URL 参数
  // 必须是一个无格式对象(plain object)或 URLSearchParams 对象
  params: {
    参数1:1,
        ...
    参数n: 值n
  },

  // data 是作为请求主体被发送的数据
  // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
  // 在没有设置 `transformRequest` 时,必须是以下类型之一:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - 浏览器专属:FormData, File, Blob
  // - Node 专属: Stream
  data: {
     参数1:1,
        ...
     参数n: 值n
  },

  // timeout 指定请求超时的毫秒数(0 表示无超时时间)
  // 如果请求话费了超过 `timeout` 的时间,请求将被中断
  timeout: 毫秒数,

   // withCredentials 表示跨域请求时是否需要使用凭证
  withCredentials: false, // default

   // responseType 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
  responseType: 'json', // default

  // responseEncoding` indicates encoding to use for decoding responses
  // Note: Ignored for `responseType` of 'stream' or client-side requests
  responseEncoding: 'utf8', // default

   // maxContentLength 定义允许的响应内容的最大尺寸
  maxContentLength: 2000,

  // maxRedirects 定义在 node.js 中 follow 的最大重定向数目
  // 如果设置为0,将不会 follow 任何重定向
  maxRedirects: 5, // default


  // proxy 定义代理服务器的主机名称和端口
  // auth 表示 HTTP 基础验证应当用于连接代理,并提供凭据
  // 这将会设置一个 Proxy-Authorization 头,覆写掉已有的通过使用 header设置的自定义 Proxy-Authorization 头。
  proxy: {
    host: '127.0.0.1',
    port: 9000,
    auth: {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },
}

3.5 响应结果信息

{
  // data 由服务器提供的响应
  data: {},

  // status 来自服务器响应的 HTTP 状态码
  status: 200,

  // statusText 来自服务器响应的 HTTP 状态信息
  statusText: 'OK',

  // headers 服务器响应的头
  headers: {},

   // config 是为请求提供的配置信息
  config: {},
 // 'request'
  // `request` is the request that generated this response
  // It is the last ClientRequest instance in node.js (in redirects)
  // and an XMLHttpRequest instance the browser
  request: {}
}

3.6 请求方法的别名

为了使用方便,将每一种请求方式都设置了请求别名。直接使用该方法,就可可以直接调用相关的请求方式

axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.options(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])

3.7 案例

案例描述 :

输入员工编号,使用异步的方式来请求数据。渲染到页面中

在这里插入图片描述

代码码演示

前端代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>axios入门案例</title>
    </head>
    <body>
        <div id="app">
            <input id="inp" v-model="userId">
            <button id="btn" @click="sendData()">查询</button>
            <br>
            查询结构:<br>
            <div v-if="flag">
                编号<span v-text="data.userId"></span><br>
                姓名<span v-text="data.name"></span><br>
                年龄<span v-text="data.age"></span><br>
            </div>
            <div v-else>
                查无此人
            </div>
        </div>
    </body>
    <!--导入axios包-->
    <script src="/day20/js/axios.js"></script>
    <script src="/day20/js/vue.js"></script>
    <script>
        var vue = new Vue({
            el:"#app",
            data:{
                userId:"",
                flag:true,
                data:{}
            },
            methods:{
                sendData(){
                    // 发送请求
                    _this=this;
                    axios.get("/day20/demo01?userId=" + this.userId).then(function (res) {
                        _this.userId = res.data.userId;
                        _this.flag = res.data.flag;
                        _this.data = res.data.data;
                    })
                }
            }
        });
    </script>
</html>

后台代码

@WebServlet("/demo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        String userId = req.getParameter("userId");
        User user = null;
        if ("1".equals(userId)){
            user = new User(1,"张三",11);
        }else if ("2".equals(userId)){
            user = new User(2,"李四",12);
        }else if ("3".equals(userId)){
            user = new User(3,"王五",16);
        }else {
            user = null;
        }

        HashMap<String, Object> map = new HashMap<>();
        if (user != null){
            map.put("msg","数据查询成功");
            map.put("flag",true);
            map.put("data",user);
        }else {
            map.put("msg","数据查询失败");
            map.put("flag",false);
        }

        String mapStr = new ObjectMapper().writeValueAsString(map);

        resp.getWriter().write(mapStr);
    }

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

http://lihuaxi.xjx100.cn/news/49762.html

相关文章

【Linux从0到1】第十七篇:高级IO

文章目录一、五种IO模型二、高级IO重要概念2.1 同步通信 vs 异步通信(synchronous communication/ asynchronouscommunication)2.2 阻塞 vs 非阻塞2.3 其他高级IO2.4 非阻塞IO2.5 I/O多路转接之select2.6 I/O多路转接之poll [选学]2.7 I/O多路转接之epoll一、五种IO模型 阻塞IO…

SpringMVC处理Ajax请求及处理和响应json格式的数据

在SpringMVC中处理Ajax的请求可以用到RequestBody与ResponseBody注解实现 1.RequestBody:将请求体中的内容和控制器方法的形参进行绑定 2.使用RequestBody注解将json格式的请求参数转换程Java对象&#xff08;三个步骤&#xff09; a>导入Jackson的依赖 b>在SpringMVC的…

Redis从入门到精通(一)

Redis 一、Redis安装和概述 1.1、概述 Redis是什么&#xff1f; Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c; Redis是一个开源的key-value存储系统&#xff0c;当下最热门的NoSQL 技术之一。 1.2、安装 1.把redis-6.2.6.tar.gz上…

HTML+CSS+JS520告白表白模板在线制作(七夕情人节表白网页代码)

❤ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套) 】 &#x1…

TiDB Dashboard 常见问题

本文汇总了使用 TiDB Dashboard 过程中的常见问题与解决办法。若无法找到对应问题&#xff0c;或者根据指引操作后问题仍然存在&#xff0c;请联系 PingCAP 技术支持获取帮助。 访问 已配置防火墙或反向代理&#xff0c;但访问后被跳转到一个内部地址无法访问 TiDB Dashboard…

Spring Boot 集成 Redis 配置 MyBatis 二级缓存

目录写在前面源码获取一、MyBatis缓存机制1.1、一级缓存1.2、二级缓存二、集成Redis2.1、安装Redis2.2、项目引入Redis2.2.1、Maven依赖2.2.2、配置application.yml2.2.3、配置序列化规则三、配置二级缓存2.1、开启二级缓存2.2、自定义缓存类2.3、增加注解2.4、测试验证写在前面…

http协议初探

目的 了解http协议 简介 http协议规定了浏览器和服务器在进行传输数据的时候的数据的格式。 对比tcp http基于tcp tcp&#xff1a;传输层&#xff0c;可靠传输&#xff0c;二进制位 http&#xff1a;应用层&#xff0c;信息使用&#xff0c;文本格式 Web调试工具fillder …

Delphi中资源文件使用详解

1&#xff0e;编写 RC 脚本文本 用记事本或其它文本编辑器编写一个扩展名为“.rc”的文件。格式如下&#xff1a; 资源标识符 资源类型关键字 资源文件名 其中“资源类型关键字”用于标识资源文件的类型&#xff1a; AVI 无声动画 BITMAP 位图文件 RCDATA JPEG文件 CURS…