Ajax 揭秘:异步 Web 交互的艺术

news2024/11/16 9:20:32

Ajax 揭秘:异步 Web 交互的艺术

  • 一 . Ajax 的概述
    • 1.1 什么是 Ajax ?
    • 1.2 同步和异步的区别
    • 1.3 Ajax 的应用场景
      • 1.3.1 注册表单的用户名异步校验
      • 1.3.2 内容自动补全
  • 二 . Ajax 的交互模型和传统交互模型的区别
  • 三 . Ajax 异步请求 axios
    • 3.1 axios 介绍
      • 3.1.1 使用步骤
      • 3.1.2 axios 常用方法
      • 3.1.3 get 的使用
        • 后端部分
        • 前端部分
      • 3.1.4 post 的使用
    • 3.2 练习 : 检查用户名是否已经被注册
  • 四 . JSON
    • 4.1 JSON 概述
    • 4.2 JSON 基础语法
    • 4.3 案例 : 获取好友列表

本篇文章会详细解析 Ajax 的异步数据交互机制,并通过 axios 库简化了异步请求的复杂性。
通过实际代码示例,我们会展示如何利用 Ajax 和 axios 实现页面的局部更新和数据处理,提升用户体验。
在这里插入图片描述
如果你觉得此专栏对你有帮助的话 , 还可以订阅一下此专栏
https://blog.csdn.net/m0_53117341/category_12778663.html

一 . Ajax 的概述

1.1 什么是 Ajax ?

正常我们进行登录的时候 , 就会遇到两种情况

同步 : 登录失败网页会立即刷新 , 之前输入过的内容就消失不见了

在这里插入图片描述

异步 : 当用户输入错误的账号密码 , 页面不会刷新 , 只是在某个局部位置提示用户

在这里插入图片描述

那 Ajax 全称 Asynchronous JavaScript and XML , 指的是异步的 JavaScript 和 XML .

例如我们向后台发送请求 , 同步的方式是后台必须返回响应数据才可以在浏览器上进行下一步操作 . 而异步则不需要等待后台服务器返回响应数据 , 各个模块执行各个模块的工作 .

Ajax 是在不重新加载整个页面的情况下 , 与服务器交换数据并且更新部分网页的技术 .

简而言之 , Ajax 就是一项通过 JS 技术发送异步请求的技术 . 异步请求 , 就是让页面局部刷新 , 而不是整个网页更新 .

1.2 同步和异步的区别

同步技术只能在服务器返回数据之后 , 才能进行下一步操作 .

在这里插入图片描述

而 Ajax 使用异步的提交方式 , 浏览器与服务器之间可以并行操作 . 即浏览器后台发送数据给服务器 , 用户依然在前端能够继续工作 .

在这里插入图片描述

小结:

【1】同步请求存在的问题 :

  1. 阻塞 : 请求发出后必须得等到响应结束才能操作页面信息
  2. 全部更新 : 整个页面更新

【2】异步请求好处:

  1. 非阻塞 : 请求发出后不用等到响应结束才能操作页面信息 , 随时可以进行其他操作 .
  2. 局部更新 : 页面的局部位置更新

1.3 Ajax 的应用场景

Ajax 通常用需要发送异步请求的地方 , 如表单的异步校验、搜索框的自动补全、异步加载数据等等 .

1.3.1 注册表单的用户名异步校验

当用户输入的账号已经存在 , 那么在输入框位置会出现提示信息 .

但是该功能整体页面并没有刷新 , 仍然可以异步与服务器端进行数据交换 , 查询用户的输入的用户名是否在数据库中已经存在 .

在这里插入图片描述

1.3.2 内容自动补全

在搜索框输入查询关键字时 , 整个页面没有刷新 , 但会根据关键字显示相关查询字条 , 这个过程是异步的 .

在这里插入图片描述

二 . Ajax 的交互模型和传统交互模型的区别

在这里插入图片描述

传统交互模型 :

浏览器客户端向服务器直接发送请求数据 , 然后后台服务器接收到请求 , 处理请求数据 , 在这期间浏览器客户端只能等待服务器处理并返回响应数据 . 最后服务器将响应数据返回给浏览器客户端 , 浏览器接收到响应之后才可以继续下一步操作 .

Ajax 的交互模型 :

就是浏览器内部多了一个 ajax 引擎 , 浏览器客户端向服务器发送请求的数据 , 都是先由浏览器将请求数据交给 ajax 引擎 . 然后接下来都是由 ajax 引擎和服务器进行交互 , 此时用户可以在浏览器上进行其他操作 .

如果再次向服务器发送请求 , 那么依然是交给 ajax 引擎处理 , 并且服务器响应的数据也是交给 ajax 引擎处理 , 由ajax 引擎来分配浏览器的操作 .

ajax 引擎内部具有一个核心对象 - XMLHttpRequest , 所有的请求和响应都是由该对象进行异步请求交互数据的 . 通过 new XMLHttpRequest() 就可以启用 ajax 引擎 . 但是这种方式比较麻烦 , 我们就不介绍了 .

三 . Ajax 异步请求 axios

3.1 axios 介绍

原生 Ajax 请求的代码过于麻烦 , 我们可以使用 axios 简化操作

Vue 发送异步请求 , 使用的就是 axios

3.1.1 使用步骤

第一步 : 引入 axios 核心 js 文件

第二步 : 使用 axios 对象调用方法来发起异步请求

第三步 : 使用 axios 对象调用方法来处理响应的数据

3.1.2 axios 常用方法

方法名作用
get(请求的资源路径与请求的参数)发起 GET 请求
post(请求的路径,请求的参数)发起 POST 请求
then(reponse)请求成功之后的回调函数 , 通过 response 获取响应的数据
catch(error)请求失败之后的回调函数 , 通过 error 获取错误信息

回调函数 : 字面意思就是回过头来调用的函数 , 回调函数都是我们负责书写 , 不负责调用 , 都是底层帮助我们调用 .

使用举例

// /AjaxServlet 表示后台服务器的 URL 地址
// name=zs&age=18 表示向后台提交的数据, get 请求的数据放在 url 后面, 携带数据格式: url?key1=value1&key2=value2
axios.get("/AjaxServlet?name=zs&age=18")
  .then(function (response) {
    // 回调函数的函数体, 负责处理后台服务器的响应
    // 所有的数据都放到 response 对象中了
    // 注意: response 的名称随便定义, 他只是一个对象
  })
  .catch(function (error) {
    // 回调函数的函数体, 如果后台服务器出现了异常, 就在这里处理
    // 所有的错误信息都放到了 error 对象中
  }) 
  .finally (function () {
    // 回调函数的函数体, 必须执行的代码
  });
};

一般情况下 then 方法接收到的返回值如下

# 备注: then 函数的参数 response 是一个 json 对象, 我们重点只需要了解 response.data 即可
{
    // `data` 由服务器提供的响应 (重要!) response.data
    data: {},

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

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

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

    // `config` 是为请求提供的配置信息
    config: {}
}
                        

3.1.3 get 的使用

后端部分

我们将这个 jar 包保存到一个位置

day0302_ajax.jar

然后用命令行窗口打开当前文件夹 , 执行 java -jar day0302_ajax.jar 命令

在这里插入图片描述

然后回车

在这里插入图片描述

前端部分

首先 , 我们创建一个新的模块

在这里插入图片描述

在这里插入图片描述

然后在 ajax 文件夹下创建一个 js 目录 , 用来存放 axios 的 js 文件

在这里插入图片描述

在这里插入图片描述

然后将 axios-0.18.0.js 文件放到该 js 目录中

在这里插入图片描述

此时我们就可以新创建一个 HTML 文件 , 用来编写 ajax 的请求了

在这里插入图片描述

在这里插入图片描述

我们首先需要在当前 HTML 文件中引入 axios

在这里插入图片描述

然后接下来就可以编写 axios 的逻辑了

先编写一个这样的链式调用

在这里插入图片描述

然后我们就分别填写

首先 , get 部分需要填写后台服务器的 URL 地址以及需要携带的参数 .

在这里插入图片描述

然后 then 部分是回调函数的函数体 , 负责处理后台服务器的响应 , 我们可以打印看一下响应数据都是什么 .

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后 catch 部分是负责处理异常情况的 .

在这里插入图片描述

最后 finally 部分无论是响应成功还是响应失败 , 都要执行的代码 .

在这里插入图片描述

我们可以测试一下

在这里插入图片描述

那控制台已经执行了 then 和 finally 的逻辑

我们可以观察一下 then 接收到的内容

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其他部分我们都不必关心 , 我们只需要关心返回值中的 data 字段 , 这个字段就是后端传递给前端的数据 .

在这里插入图片描述

在这里插入图片描述

整体代码如下 :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 引入 axios -->
    <script src='./js/axios-0.18.0.js'></script>
</head>
<body>

</body>
<script>
    // 固定要求
    // 1. http://localhost:8080/axiosDemo01Servlet 表示后台的服务器地址
    // 2. username=zhangsan&password=123456 表示向后台携带的参数, 和后台服务器地址之间使用 ? 分隔
    axios.get('http://localhost:8080/axiosDemo01Servlet?username=zhangsan&password=123456')
            .then(function (response) {
                // 处理响应数据的回调函数体代码
                // response 表示接收服务器响应数据的对象
                console.log(response);
                // 我们着重关注 response 的 data 对象
                console.log(response.data);
            })
            .catch(function (error) {
                // 处理响应错误信息数据的, 在该函数的参数位置编写回调函数
                // 如果后台出现异常, 就不会执行 then 函数, 直接执行 catch 函数
                console.log(error);
            })
            .finally(function () {
                // 无论是响应成功还是响应失败, 都要执行的代码
                console.log('finally 一定会被执行');
            });
</script>
</html>

我们还可以模拟一下 catch 捕捉异常的情况

在这里插入图片描述

在这里插入图片描述

通过打印的结果 , 我们可以知道发生异常的时候 , 会执行 catch 部分和 finally 部分

3.1.4 post 的使用

// url 表示请求地址 (不能包含请求参数)
// param 表示请求参数
// post 请求可以不携带参数, 写法就变成这样: axios.post(url).then().catch().finally()
axios.post(url,param)
  // 箭头函数写法: (参数名1,参数名2,...) => {函数体}, 如果只有一个参数名, 那么可以省略小括号
  .then(resopnse => {
    // 回调函数的函数体, 后台响应成功执行 then 函数
  })
  .catch(error => {
    
  })
  .finally(() => {
    
  }); 

举个例子 :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 引入 axios -->
    <script src='./js/axios-0.18.0.js'></script>
</head>
<body>

</body>
<script>
    // 固定要求
    // 1. http://localhost:8080/axiosDemo03Servlet 表示后台的服务器地址
    // 2. username=zhangsan&password=123456 表示向后台携带的参数, 和后台服务器地址之间使用 ? 分隔
    axios.post('http://localhost:8080/axiosDemo01Servlet','username=zhangsan&password=123456')
            .then(response => {
                // 处理响应数据的回调函数体代码
                // 输出后台返回给前端的响应数据
                console.log(response.data);
            })
            .catch(error => {
                // 处理响应错误信息数据的, 在该函数的参数位置编写回调函数
                // 如果后台出现异常, 就不会执行 then 函数, 直接执行 catch 函数
                console.log(error);
            })
            .finally(() => {
                // 无论是响应成功还是响应失败, 都要执行的代码
                console.log('finally 一定会被执行');
            });
</script>
</html>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2 练习 : 检查用户名是否已经被注册

我们先给大家提供一个基础页面

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 引入 axios -->
    <script src='./js/axios-0.18.0.js'></script>
</head>

<body>
    <form action="#">
        <input type="text" name="username" placeholder="请输入用户名" id="username">
        <!-- 显示错误和正确信息 -->
        <span id="usernameSpan"></span>
        <br>
        <input type="password" name="password" placeholder="请输入密码"> <br>
        <button>提交</button>
    </form>
</body>
<script>
    /*
        说明:
        1. 后台地址 url: "http://localhost:8080/registerServlet"
        2. 后台需要根据 key 即参数名是 username 来获取前端提交的用户名数据
        3. 后台已经存在的用户名是:"岩岩"
     */
     
</script>
</html>

那接下来我们就可以通过异步的方式检查用户名是否已经被注册了

第一步 : 绑定离焦事件

在这里插入图片描述

我们可以先看一下离焦事件是否绑定成功

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二步 : 获取输入框输入的 value 值

在这里插入图片描述

在这里插入图片描述

第三步 : 向后台发送异步请求

在这里插入图片描述

此时我们可以测试一下

在这里插入图片描述

我们通过返回值就可以看到 , 用户名合法就返回 true , 用户名不合法就返回 false

然后我们就可以通过返回值来设置相应的提示语句了

在这里插入图片描述

在这里插入图片描述

整体代码如下 :

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 引入 axios -->
    <script src='./js/axios-0.18.0.js'></script>
</head>

<body>
    <form action="#">
        <!-- 绑定离焦事件 -->
        <!-- 方式一 -->
        <!-- <input type="text" name="username" placeholder="请输入用户名" id="username" οnblur='queryUsernName()'> -->
        <input type="text" name="username" placeholder="请输入用户名" id="username">
        <!-- 显示错误和正确信息 -->
        <span id="usernameSpan"></span>
        <br>
        <input type="password" name="password" placeholder="请输入密码"> <br>
        <button>提交</button>
    </form>
</body>
<script>
    /*
        说明:
        1. 后台地址 url: "http://localhost:8080/registerServlet"
        2. 后台需要根据 key 即参数名是 username 来获取前端提交的用户名数据
        3. 后台已经存在的用户名是:"岩岩"
     */
     // 1. 绑定离焦事件 (方式二)
     document.getElementById('username').onblur = function () {
         // 2. 获取输入框输入的 value 的值
         let usernameValue = this.value;
         
         // 3. 向后台发送异步请求
         // 'username=' + usernameValue: username 是固定的, 后台服务器根据 username 来获取输入框输入的 value 值
         axios.post('http://localhost:8080/registerServlet','username=' + usernameValue)
            .then(response => {
                if(response.data) {
                    // 说明用户名不存在, 可以注册
                    document.getElementById('usernameSpan').innerHTML = '当前用户名可以注册 !';
                    document.getElementById('usernameSpan').style.color = 'green';
                } else {
                    // 说明用户名存在, 不可以注册
                    document.getElementById('usernameSpan').innerHTML = '当前用户名已存在 !';
                    document.getElementById('usernameSpan').style.color = 'red';
                }
            });
     }
</script>
</html>

四 . JSON

4.1 JSON 概述

JSON 全称为 JavaScript Object Notation , 他是 JS 对象的简写 .

目前 JSON 是前后端数据交互最主要的格式之一

// JS 对象表示格式
let user = {"username": "后羿" , "age": 23 , "sex": "男"}
let product = {"name": "小米10" , "desc": "1亿像素的手机小王子"}

在这里插入图片描述

JSON 的格式 :

{
  key1: value1,
  key2: value2,
  ......
}

4.2 JSON 基础语法

JSON 的语法主要分为三种 :

第一种 : 对象类型

{
  "key1": value1,
  "key2": value2,
  ......
}

第二种 : 数组类型

[
  {"key1": value1,"key2": value2},
  {"key1": value1,"key2": value2},
  {"key1": value1,"key2": value2},
]

第三种 : 复杂对象

{
  "key1": value1,
  "key2": [
    {"key1": value1,"key2": value2},
    {"key1": value1,"key2": value2},
    {"key1": value1,"key2": value2},
  ],
  "key3": {"key4": value4}
}

注意 :

  1. key 必须是 string 类型 . 在 JS 中 , key 的双引号可以省略 , 但是不推荐
  2. value 必须是以下数据类型之一 : 字符串、数字、对象 (JSON 对象)、数组、布尔、NULL
  3. JSON 中的字符串必须用 “”

4.3 案例 : 获取好友列表

我们为大家准备了最基础的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 引入 axios -->
    <script src='./js/axios-0.18.0.js'></script>
</head>
<body>
    <!-- 获取好友列表 -->
    <input type="button" value="获取好友列表" onclick="method01()"><br>
    <hr>
    <h3>好友列表</h3>
    <!-- 存放查询好友的结果信息 -->
    <div id="messageDiv"></div>
    <table width="500px" cellspacing="0px" cellpadding="5px" border="1px" id="myTable">
        <!-- 表头: 自动加粗、居中 -->
        <tr>
            <th>id</th>
            <th>name</th>
            <th>age</th>
        </tr>
        <!--<tr>
            <td></td>
            <td></td>
            <td></td>
        </tr>-->
    </table>
</body>

<script>
    /*
      需求: 向后台发送请求, 获取好友列表并显示到页面中
      说明: 后台的 URL 地址 - "http://localhost:8080/axiosJsonDemo01Servlet"
     */
    function method01() {
        // 向后台发送请求
        
    }
</script>
</html>

我们的需求就是向后台发送请求 , 获取 JSON 格式的好友列表并显示到页面中

首先 , 当用户点击获取好友列表的按钮的时候 , 就会执行 method01 函数

在这里插入图片描述

那我们就通过 method01 方法来去向服务器中获取数据

在这里插入图片描述

我们来看一下返回的数据是什么样子的

在这里插入图片描述

那测试完毕之后 , 我们就可以获取好友列表了

第一步 : 判断是否响应成功

在这里插入图片描述

第二步 : 将成功信息展示到页面上

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里插入图片描述

第三步 : 将后台相应的好友列表添加到 table 标签中

首先 , 我们需要遍历后端传过来的 valueData 数组 , 然后一个一个添加到 table 标签中

在这里插入图片描述

那接下来 , 我们可以在上面创建一个 content 变量 , 用这个 content 变量来接收我们收到的数据

我们之前也学习过 ES6 的新语法 - 模板字符串 , 那我们就可以新创建一个 tr 标签 , 然后往里面填充数据即可

在这里插入图片描述

我们可以先看一下 content 目前的值

在这里插入图片描述

那接下来我们就可以将 content 的内容接到 table 标签中了

在这里插入图片描述

此时我们好友列表就获取成功了

在这里插入图片描述

那我们再考虑一下获取失败的情况 , 如果失败了 , 将后台返回的错误原因展示给用户 , 并且取消表格的显示 .

在这里插入图片描述

整体代码如下 :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 引入 axios -->
    <script src='./js/axios-0.18.0.js'></script>
</head>
<body>
    <!-- 获取好友列表 -->
    <input type="button" value="获取好友列表" onclick="method01()"><br>
    <hr>
    <h3>好友列表</h3>
    <!-- 存放查询好友的结果信息 -->
    <div id="messageDiv"></div>
    <table width="500px" cellspacing="0px" cellpadding="5px" border="1px" id="myTable">
        <!-- 表头: 自动加粗、居中 -->
        <tr>
            <th>id</th>
            <th>name</th>
            <th>age</th>
        </tr>
        <!--<tr>
            <td></td>
            <td></td>
            <td></td>
        </tr>-->
    </table>
</body>

<script>
    /*
      需求: 向后台发送请求, 获取好友列表并显示到页面中
      说明: 后台的 URL 地址 - "http://localhost:8080/axiosJsonDemo01Servlet"
     */
    function method01() {
        // 向后台发送请求
        axios.get('http://localhost:8080/axiosJsonDemo02Servlet')
                .then(response => {
                    // 1. 判断响应是否成功获取到后台数据
                    let obj = response.data;
                    // 判断返回的数据存不存在
                    if (obj) {
                        // 返回成功
                        // 2. 将后台响应的提示成功信息放到 <div id="messageDiv"></div> 中
                        document.getElementById('messageDiv').innerHTML = obj.message;
                        
                        // 3. 将后台相应的好友列表数据放到 table 标签中
                        // 3.1 遍历后台相应数据的数组 valueData
                        // 注意: 要想获取到 valueData, 就需要 response.data.valueData 才能获取到, 也就是 obj.valueData
                        let content = "";
                        for (let friend of obj.valueData) {
                            // 3.2 取出对象数据并且拼接到 content 中
                            // 使用模板字符串拼接数据
                            content += `
                                        <tr>
                                            <td>${friend.id}</td>
                                            <td>${friend.name}</td>
                                            <td>${friend.age}</td>
                                        </tr>
                            `;
                        }
                        // 3.3 将 content 的内容追加到 table 标签中
                        document.getElementById('myTable').innerHTML += content;
                    } else {
                        // 返回失败
                        // 将后台响应的提示失败信息放到 <div id="messageDiv"></div> 中
                        document.getElementById('messageDiv').innerHTML = obj.message;
                        // 并且取消表头的显示
                        // 让表头元素设置为空字符串, 就达到了不显示的效果
                        // document.getElementById('myTable').innerHTML = '';
                        
                        // 最严谨的做法: 将样式设置为 none
                        document.getElementById('myTable').style.display = 'none';
                    }
                });
    }
</script>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车辆重识别(关于卷积神经网络一些资料)2024/9/11

关于卷积神经网络的介绍 一&#xff0c;全连接神经网络 1&#xff0c;全连接神经网络的整体结构 X代表左边输入的数据&#xff08;向量或者矩阵等等&#xff09;&#xff0c;Y代表模型对数据处理之后的结果&#xff0c;中间的节点都可以算作为隐藏层。 2&#xff0c;全连接神经…

【C++二分查找 容斥原理】1201. 丑数 III

本文涉及的基础知识点 C二分查找 容斥原理&#xff1a;组合数学汇总 LeetCode1201. 丑数 III 丑数是可以被 a 或 b 或 c 整除的 正整数 。 给你四个整数&#xff1a;n 、a 、b 、c &#xff0c;请你设计一个算法来找出第 n 个丑数。 示例 1&#xff1a; 输入&#xff1a;n …

读构建可扩展分布式系统:方法与实践03分布式系统要点

1. 通信基础 1.1. 每个分布式系统都包含通过网络进行通信的软件组件 1.2. 硬件 1.2.1. 全球互联网就是一台异构机器&#xff0c;由不同类型的网络通信通道和设备组成&#xff0c;它们每秒将数百万条消息通过网络传送到预定目的地 1.2.2. 对于单个光纤链路&#xff0c;可以提…

使用gzexe保护Kylin Linux Shell脚本安全

使用gzexe保护Kylin Linux Shell脚本安全 1、加密脚本2、解密脚本3、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Kylin Linux中&#xff0c;若需保护shell脚本内容不被直接查看&#xff0c;可以使用gzexe工具进行加密。 1、…

R语言机器学习算法实战系列(一):XGBoost算法(eXtreme Gradient Boosting)

介绍 XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升决策树(GBDT)的优化算法,它在处理大规模数据集和复杂模型时表现出色,同时在防止过拟合和提高泛化能力方面也有很好的表现。以下是XGBoost算法的原理和应用方向的详细介绍: 算法原理 目标函数:XGBoost的目标…

Android 测试机

要测手机应用&#xff0c;直接挂电脑上跑虚拟机的话&#xff0c;怀疑电脑都要起火了。 eBay 上买了个新的机器&#xff0c;也才 100 美元多点&#xff0c;机器都没有拆过&#xff0c;电池是完全无电的状态。 操作系统是 Android 12 的版本&#xff0c;升级到 Android 14 后&am…

从用户数据到区块链:Facebook如何利用去中心化技术

在数字化时代&#xff0c;用户数据的管理和保护已成为科技公司面临的重大挑战。作为全球最大的社交网络平台之一&#xff0c;Facebook不仅在用户数据的处理上积累了丰富的经验&#xff0c;也在探索如何利用去中心化技术&#xff0c;如区块链&#xff0c;来改进其数据管理和用户…

怎么使用ai 免费生成ppt?这4个工具可以帮忙

随之AI工具的流行&#xff0c;网络上也涌现了一批 AIPPT 工具&#xff0c;可以在办公上帮助我们节省很多制作PPT的时间。通常它们的操作也比较简单&#xff0c;所以适合很多人使用。为了可以帮助大家提高办公效率&#xff0c;我在这里跟大家分享4款可以免费使用的AIPPT制作工具…

STM32——看门狗通俗解析

笔者在学习看门狗的视频后&#xff0c;对看门狗仍然是一知半解&#xff0c;后面在实际应用中发现它是一个很好用的检测或者调试工具。所以总结一下笔者作为初学小白对看门狗的理解。 主函数初始化阶段、循环阶段和复位 众所周知&#xff0c;程序的运行一般是这样的&#xff1…

解决项目启动时报“找不到符号”问题

前言 在Java开发过程中&#xff0c;遇到“找不到符号”的错误是非常常见的现象。这种错误往往意味着编译器无法识别你所引用的某个类、方法或变量。本文旨在提供一套详细的排查和解决思路&#xff0c;帮助开发者快速定位并解决此类问题。 问题描述 “找不到符号”错误通常出…

K8S - Volume - NFS 卷的简介和使用

在之前的文章里已经介绍了 K8S 中两个简单卷类型 hostpath 和 emptydir k8s - Volume 简介和HostPath的使用 K8S - Emptydir - 取代ELK 使用fluentd 构建logging saidcar 但是这两种卷都有同1个限制&#xff0c; 就是依赖于 k8s nodes的空间 如果某个service pod中需要的vol…

2024年职场人士都在用的PDF转换工具大赏

PDF文件已经变得越来越常见了&#xff0c;是不是不知不觉你收到的或者发出去的文件都是这个格式。它可以巩固格式&#xff0c;但是编辑起来还是有一定难度的。这篇文章我来分享一些可以从pdf转换器免费版官网下载的工具。 1.Foxit PDF转换大师 链接一下>>https://www.p…

sqlgun靶场漏洞挖掘

进入首页首先看到一个搜索框&#xff0c;那么我们试一下xss 用script弹了个一 接下来我们尝试一下sql注入 这里我们使用联合查询查到了他的数据库名&#xff0c;那么这里也就存在SQL注入了 这里存在SQL注入那么我们就尝试一下是否可以注入木马来getshell 首先我们扫描目录&…

YOLO介绍—datawhale

速度快&#xff1a;YOLO的设计目标是实现快速的对象检测&#xff0c;它在保持相对高准确度的同时&#xff0c;能够实现高帧率的实时检测。 易于实现&#xff1a;YOLO的架构相对简单&#xff0c;易于理解和实现&#xff0c;这使得它在学术和工业界都得到了广泛的应用。 版本迭…

机器学习(西瓜书)第 14 章 概率图模型

14.1 隐马尔可夫模型 机器学习最重要的任务&#xff0c;是根据一些已观察到的证据&#xff08;例如训练样本&#xff09;来对感兴趣的未知变量&#xff08;例如类别标记&#xff09;进行估计和推测。概率模型&#xff08;probabilistic model&#xff09;提供了一种描述框架&a…

快讯丨深蓝L07将于9月20日正式上市

9月13日获悉&#xff0c;继第二十七届成都车展首发亮相后&#xff0c;深蓝汽车全新“科技智享中型轿车”——深蓝L07&#xff0c;将于9月20日迎来正式上市&#xff01; 作为深蓝汽车旗下第二款轿车力作&#xff0c;深蓝L07携#左手深蓝超级增程&#xff0c;右手华为乾崑智能#两…

自动驾驶:LQR、ILQR和DDP原理、公式推导以及代码演示(六、ILQR正则化和line search)

&#xff08;六&#xff09;ILQR正则化和line search 1. ILQR正则化 在iLQR中&#xff0c;我们通常线性化系统动力学并对目标函数进行二阶近似。在反向传播步骤中&#xff0c;我们需要计算逆矩阵&#xff08;控制变量对目标函数的二阶导数矩阵&#xff09;&#xff0c;用以更…

通信工程学习:什么是FDMA频分多址

FDMA&#xff1a;频分多址 FDMA&#xff08;Frequency Division Multiple Access&#xff0c;频分多址&#xff09;是一种在无线通信领域广泛应用的多址技术。该技术通过将可用的频谱资源按频率划分&#xff0c;把传输频带划分为若干较窄且互不重叠的子频带&#xff08;或称信道…

IP-Adapter学习

参考&#xff1a;https://baijiahao.baidu.com/s?id1803373544569190578&wfrspider&forpc IP-Adapter 是 SD中比较重要的controlnet&#xff0c;由腾讯公司出品。主要原理&#xff1a;提取图像特征&#xff0c;并嵌入预训练文本&#xff0c;最终加入到扩散图像中。简…

阿里云社区领积分自动打卡Selenium IDE脚本

脚本 感觉打卡比较麻烦&#xff0c;要点开点按钮这种机械化的操作。 所以就自己整了个脚本&#xff1a; { “id”: “f9999777-9ad6-40e0-9435-4f105919c982”, “version”: “2.0”, “name”: “aliyun”, “url”: “https://developer.aliyun.com”, “tests”: [{ “id”…