JavaWeb 速通Ajax

news2024/10/4 13:21:40

目录

一、Ajax快速入门

        1.基本介绍 : 

        2.使用原理 : 

二、Ajax经典入门案例

        1.需求 : 

        2.前端页面实现 : 

        3. 处理HTTP请求的servlet实现

        4.引入jar包及druid配置文件、工具类 : 

        5.Domain层实现 : 

        6.DAO层实现 : 

        7.Service层实现 : 

        8.运行测试 : 

三、JQuery操作Ajax

        1 $.ajax({})函数 : 

        2 $.get()和$.post()函数 : 

        3 $.getJSON()函数 : 


一、Ajax快速入门

        1.基本介绍 : 

        (1) AJAX,全称"Asynchronous JavaScript And XML",指异步JavaScript和XML。Ajax是一种支持浏览器异步发起请求(可以指定发送的数据),以及页面局部更新的技术。

        (2) Ajax的常见应用场景如下——

                1> 搜索引擎根据用于输入的关键字,自动提示检索关键字。

                2> 动态加载数据,按需取得数据。(树形菜单、联动菜单......等,eg : 选择省份后自动加载出对应的市县)

                3> 电子商务应用。(购物车,邮件订阅)

                4> 改善用户体验。(输入内容前提示,带进度条的文件上传)

                5> 访问第三方服务。(访问搜索服务,rss阅读器)

                6> 页面局部刷新。(网站展示数据的实时刷新)

        2.使用原理 : 

                传统的web数据通信方式的弊端——
                表单提交数据时,默认提交将该表单的全部数据都提交给服务端,数据量大且无意义。
                在服务端未给出HTTP响应之前,浏览器前端会一直处于等待状态,或者被挂起。
                无法进行页面的局部刷新,用户体验感较差。

                使用Ajax的web数据通信方式的原理示意图如下——

                Ajax数据通信方式与传统通信方式最大的区别在于,浏览器端并不是直接向服务器端发送HTTP请求,而是要先经过Ajax引擎对象——XMLHttpRequest对象的处理(浏览器内置对象),再发出请求。服务器端仍然是接收数据并做出相应处理,之后再通过HTTP响应将数据返回给浏览器,返回的数据格式可以是XML,JSON,或者是普通文本。浏览器接收到服务端的响应后,Ajax会解析返回的数据,并将解析之后的数据渲染到页面的对应元素中,以实现页面的局部刷新。

                通过Ajax发送HTTP请求的优点——
                可以通过XMLHttpRequest对象,发送指定数据,数据量小且速度快。
                XMLHttpRequest对象是异步发送数据,在服务端没有回送HTTP响应之前,浏览器不需要等待,可以继续操作。
                实现了页面的局部刷新,提高了用户的体验。

                PS : XMLHttpRequest对象有几个重要的属性,如下表所示 : 

属性描述
onload定义接收到(加载)请求时要调用的函数。
onreadystatechange定义当 readyState 属性发生变化时调用的函数。
readyState

保存 XMLHttpRequest 的状态。

  • 0:请求未初始化
  • 1:服务器连接已建立
  • 2:请求已收到
  • 3:正在处理请求
  • 4:请求已完成且响应已就绪
responseText以字符串形式返回响应数据。
responseXML以 XML 数据返回响应数据。
status

返回请求的状态号

  • 200: "OK"
  • 403: "Forbidden"
  • 404: "Not Found"
statusText返回状态文本(比如 "OK" 或 "Not Found")

二、Ajax经典入门案例

        1.需求 : 

                界面效果如下:

                编写一个用户登录页面,要求对用户名进行校验 (对用户名校验的HTTP请求要借助Ajax来发送!),若用户名已经存在于MySQL数据库中的user_demo用户表中,提示用户名重复、不可用,并以JSON格式的字符串返回该用户的信息;反之,则提示用户名可用。
                要求按照“Domain层 --> DAO层 --> Service层”的三层结构来实现业务逻辑。
                要求编写一个servlet用于处理客户端的HTTP请求,在servlet中利用已经实现的三层结构来完成业务,并向前端页面返回处理后的数据;前端页面收到HTTP响应后,要根据业务需求实现页面的局部刷新。

        2.前端页面实现 : 

                login.html代码如下 : 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <style type="text/css">
        table, td, th {
            background-color: lightcyan;
            border:2px pink solid;
            border-collapse: collapse;
            padding: 5px
        }
    </style>
    <script type="text/javascript">
        window.onload = function () {
            var checkButton = document.getElementById("checkButton");
            checkButton.onclick = function () {
                //1.创建XMLHttpRequest对象 [AJax引擎对象]
                var xhr = new XMLHttpRequest();

                //2.获取用户提交的数据
                var uname = document.getElementById("uname").value;

                //3.利用open方法,规定请求的类型、URL、以及是否异步处理请求。
                    /*
                        (1) 第一个参数———请求方式。可以是GET/POST等。
                        (2) 第二个参数———URL。此处采用了拼接的形式。
                        (3) 第三个参数———true。true表示异步发送。
                     */
                xhr.open("GET", "/Ajax/checkUser?username=" + uname, true)

                /*  !!!
                    在调用send函数之前,给XMLHttpRequest对象绑定一个事件onreadystatechange
                    该事件表示,当readyState属性的数据发生变化时,
                    会触发onreadystatechange事件,并调用指定的函数
                 */
                xhr.onreadystatechange = function () {
                    //若请求已经完成,响应已经就绪,且响应状态码是200
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        //获取实际返回的数据
                        var responseText = xhr.responseText;
                        //若返回的字符串非null,说明该用户名重复,不可用
                        if (responseText.trim() != "") {
                            checkButton.value = "用户名不可用";
                            var div01 = document.getElementById("div01");
                            //!!!!!!
                            //由于是div元素,所以要更改的是innerText or innerHTML属性值
                            div01.innerHTML = responseText;
                            div01.removeAttribute("hidden");
                        } else {
                            checkButton.value = "用户名可用";
                        }
                    }
                }

                //4.调用send方法,真正发送请求
                    //如果是POST请求,需要调用xhr.send("content");
                xhr.send();
            }
        }
    </script>
</head>
<body>
<form action="/Ajax/checkUser" method="post">
<table width="625px">
    <tr>
        <th colspan="3"><h2>用户注册</h2></th>
    </tr>
    <tr>
        <td>Username:</td>
        <td><input type="text" name="username" id="uname"/></td>
        <td><input type="button" value="验证用户名" id="checkButton"/></td>
    </tr>
    <tr>
        <td>Password:</td>
        <td><input type="password" name="password"/></td>
    </tr>
    <tr>
        <td>e-mail:</td>
        <td><input type="text" name="email"/></td>
    </tr>
    <tr>
        <td><input type="submit" value="Submit"/></td>
        <td><input type="reset" value="Reset"/></td>
    </tr>
    <tr>
        <th colspan="3"><h2>返回的JSON数据如下:</h2></th>
    </tr>
    <tr>
        <td colspan="3"><div id="div01"></div></td>
    </tr>
</table>
</form>
</body>
</html>

        3. 处理HTTP请求的servlet实现

                CheckUserServlet类代码如下 : 

package servlet;

import com.google.gson.Gson;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javabean.User;
import service.UserService;

import java.io.IOException;

@WebServlet(urlPatterns={"/checkUser"})
public class CheckUserServlet extends HttpServlet {
    //定义一个UserService属性
    UserService userService = new UserService();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //联系手写Tomcat底层机制中,HttpServletRequest中封装的用于存储参数的Map对象。
        String username = req.getParameter("username");
        System.out.println("username = " + username);

        //此处利用了已实现的"Domain---DAO---Service"三层结构
        User user = userService.getUserByName(username);
        if (user != null) {
            Gson gson = new Gson();
            String strUser = gson.toJson(user);

            resp.setContentType("text/html; charset=utf-8");
            resp.getWriter().print(strUser);
        } else {
            resp.getWriter().print("");
        }
    }

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

        4.引入jar包及druid配置文件、工具类 : 

                引入jar包如下图所示 : 

                druid.properties配置文件如下 : (src目录下)

# 驱动名称(连接MySQL)
driverClassName=com.mysql.cj.jdbc.Driver
# 参数?rewriteBatchedStatements=true表示支持批处理机制
url=jdbc:mysql://localhost:3306/a_ajax?rewriteBatchedStatements=true
# 用户名,注意这里是按“username”来读取的
username=root
# 用户密码(自己改)
password=RA9_Cyan
# 初始化连接数量
initialSize=10
# 最小连接数量
minIdle = 5
# 最大连接数量
maxActive=50
# 超时时间5000ms(在等待队列中的最长等待时间,若超过,放弃此次请求)
maxWait=5000

                注意druid.properties配置文件中要修改连接的数据库,以及登录用户的用户名和密码!

                负责德鲁伊连接池的工具类JDBCUtilsDruid,代码如下 : (尤其注意导入配置文件时和Java SE的使用区别)

package utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
    基于Druid连接池的工具类
 */
public class JDBCUtilsDruid {
    private static DataSource dataSource;

    static {
        Properties properties = new Properties();
        try {
            //properties.load(new FileInputStream("src/druid.properties"));

            //由于JavaWeb和JavaSE的实际工作路径不一样,web的实际工作路径是在out目录下,
            //因此要使用类加载器来获取文件的真实路径!!!
            properties.load(JDBCUtilsDruid.class.getClassLoader().getResourceAsStream("druid.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public static void close(ResultSet resultSet, Statement statement, Connection connection) {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

        5.Domain层实现 : 

                现在MySQL中创建一张表user_demo,代码如下 : 

CREATE TABLE IF NOT EXISTS `user_demo` (
	`id` MEDIUMINT UNSIGNED PRIMARY KEY,
	`username` VARCHAR(255) NOT NULL DEFAULT '',
	`password` CHAR(64) NOT NULL,
	`email` VARCHAR(255) NOT NULL DEFAULT ''
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

INSERT INTO user_demo
		VALUES
		(1, 'Cyan', MD5(233), 'WangwuEX@outlook.com'),
		(2, 'Rain', MD5(111), 'Rain@rain.com'),
		(3, 'Five', MD5(141), 'Five@five.com'),
		(4, 'Ice', MD5(555), 'Ice@ice.com'),
		(5, 'Kyrie', MD5(666), 'Kyrie@irving.com');

SELECT * FROM `user_demo`;

                user_demo表的效果如下 : 

                创建对应的User类(注意字段的顺序要和表中的保持一致),User类代码如下 : 

package javabean;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 * @function : user_demo表对应的JavaBean类
 */
public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;

    public User() { //供反射使用
    }

    public User(Integer id, String username, String password, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

        6.DAO层实现 : 

                BasicDAO代码如下 : 

package dao;

import utils.JDBCUtilsDruid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
    BasicDAO类,完成所有DAO通用的crud操作。
 */
public class BasicDAO<T> {
    private QueryRunner queryRunner = new QueryRunner();

    public int update(String sql, Object... params) {
        int affectedRows = 0;
        Connection connection = null;

        try {
            connection = JDBCUtilsDruid.getConnection();
            affectedRows = queryRunner.update(connection,sql,params);
            return affectedRows;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsDruid.close(null, null, connection);
        }
    }

    public List<T> queryMultiply(String sql, Class<T> clazz, Object... params) {
        Connection connection = null;

        try {
            connection = JDBCUtilsDruid.getConnection();

            List<T> query = queryRunner.query(connection,sql,new BeanListHandler<T>(clazz),params);
            return query;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsDruid.close(null, null, connection);
        }
    }

    public T querySingle(String sql, Class<T> clazz, Object... params) {
        Connection connection = null;

        try {
            connection = JDBCUtilsDruid.getConnection();
            return queryRunner.query(connection, sql, new BeanHandler<T>(clazz), params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsDruid.close(null, null, connection);
        }
    }

    public Object queryScalar(String sql, Object... params) {
        Connection connection = null;

        try {
            connection = JDBCUtilsDruid.getConnection();
            return queryRunner.query(connection, sql, new ScalarHandler<>(), params);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsDruid.close(null,null,connection);
        }
    }
}

                UserDAO类代码如下 :

package dao;

import javabean.User;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class UserDAO extends BasicDAO<User>{
}

        7.Service层实现 : 

                UserService类, 代码如下 : 

package service;

import dao.UserDAO;
import javabean.User;

public class UserService {
    private UserDAO userDAO = new UserDAO();

    public User getUserByName(String username) {
        String sql = "SELECT * FROM user_demo WHERE username = ?";

        User user = userDAO.querySingle(sql, User.class, username);

        return user;
    }
}

        8.运行测试 : 

                启动Tomcat,进行测试,测试结果如下GIF图所示 : 


三、JQuery操作Ajax

        1 $.ajax({})函数 : 

        $.ajax函数的常用参数如下——

        (1) url : 请求的地址

        (2) type : 请求的方式GET or POST

        (3) data : 发送到服务器端的数据,将自动转换为请求字符串格式

        (4) success : 成功的回调函数

        (5) dataType : 返回的数据类型,常用Json或text。

        PS : 注意$.ajax({}) 的使用格式,不可以直接写参数,需要属性名 : 来约束。

        2 $.get()和$.post()函数 : 

        $.get函数 和 $.post函数的常用参数如下——

        (1) url : 请求的地址       

        (2) data : 发送到服务器端的数据,将自动转换为请求字符串格式

        (3) success : 成功的回调函数

        (4) dataType : 返回的数据类型,常用Json或text。

        PS1 : $.get() 和 $.post() 底层还是使用$.ajax({})函数来实现异步请求。
        PS2 : $.get() 和 $.post() 可以直接传入参数,但要注意顺序问题!

        3 $.getJSON()函数 : 

        $.getJSON函数的常用参数如下——

        (1) url : 请求的地址       

        (2) data : 发送到服务器端的数据,将自动转换为请求字符串格式

        (3) success : 成功的回调函数

        PS : $.getJSON() 底层还是使用$.ajax()函数来实现异步请求。

        System.out.println("END------------------------------------------------");

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

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

相关文章

Java:Stream流的使用步骤,中间方法,终结方法,收集Stream流

Stream流的相关知识 Stream流的使用步骤 1.获取Stream流 Stream流常见的中间方法 如果两个Stream流类型不一样&#xff0c;那么合并的时候就要变成Object类型 Stream流的常见的终结方法 转到数组中去

Angular安全专辑之四 —— 避免服务端可能的资源耗尽(NodeJS)

express-rate-limit是一个简单实用的npm包,用于在Express应用程序中实现速率限制。它可以帮助防止DDoS攻击和暴力破解,同时还允许对API端点进行流控。 express-rate-limit及其主要功能 express-rate-limit是Express框架的一个流行中间件,它允许根据IP地址或其他标准轻松地对请求…

中国智慧燃气行业市场需求

文章来源&#xff1a;中研普华产业研究院 关键词&#xff1a;智慧燃气、智慧燃气场站、智慧燃气平台、设备设施数字化、数字孪生、工业互联网 智慧燃气&#xff0c;是以城市输气管网为基础&#xff0c;各终端用户协调发展&#xff0c;以信息通信平台为支撑&#xff0c;具有信…

java spring cloud 企业工程管理系统源码+二次开发+定制化服务

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

解决 .csv 文件上传到 pgsql 的字符报错问题

目录 背景问题解决办法 背景 上传 .csv 文件进行数据导入到 pg 时&#xff0c;报错显示如下&#xff1a; ods.tbl_inp_fee_detail.csv数据上传失败 报错信息:org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 Where: C…

NPDP认证|加班越多,产品经理的能力提升越快吗?

产品经理是现代企业中非常重要的职位&#xff0c;他们负责规划、设计、开发和推广公司的产品。为了使产品能够更好地满足市场需求&#xff0c;产品经理需要不断地提升自己的能力&#xff0c;以应对日益变化的竞争环境。有时&#xff0c;人们会认为加班是提高产品经理能力的途径…

链式栈StackT

C关键词&#xff1a;内部类/模板类/头插 C自学精简教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; 栈的内存结构 空栈&#xff1a; 有一个元素的栈&#xff1a; 多个元素的栈&#xff1a; 成员函数说明 0 clear 清空栈 clear 函数负责将栈的对内存释放…

[js逆向补环境专栏]过xhs的x2 x-s环境检测 -- part1

[补环境]过xhs的x2环境检测 – part1 Xhs的jsvmp用算法逆向确实容易头秃&#xff0c;扣代码对vmp而言也用处不大&#xff0c;此时补环境的重要性就出来了&#xff0c;通过把运行js的环境伪造得像浏览器一样&#xff0c;就能模拟出好像请求都是通过浏览器发起的一样。 这里要区…

光模块温度报警的原因及解决措施

光模块是数据中心网络中的关键组件&#xff0c;它们在高温环境下可能会受到影响。如果光模块的温度超过正常范围&#xff0c;可能会导致网络故障和光模块损坏。因此&#xff0c;了解光模块的温度报警并采取相应的解决措施非常重要。 一、光模块温度报警的原因 光模块温度报警通…

Linux之虚拟主机功能

目录 虚拟主机功能 概述 基于 IP 地址的虚拟主机 原理 案例 --- 增加多个IP地址&#xff0c;实现基于不同IP地址的虚拟主机功能 基于端口号的虚拟主机 原理 案例 --- 基于不同端口号的虚拟主机 基于域名的虚拟主机 原理 域名解析 案例 --- 使用2个域名建立虚拟主机网…

2023年6月GESP C++ 二级试卷解析

2023年6月GESP C 二级试卷解析 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 1.高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在计算机上运行的可执行代码。 A.编辑 B.保存 C.调试 D.编译 【答案】D 【考纲知识点…

问ChatGPT如何优雅地分手/离婚,然后由心理学专家验证它说对了什么

ChatGPT是一种由AI驱动的写作生成器&#xff0c;它利用互联网上的各种信息回复人类问题与要求。它可以回答问题、讲笑话、创意写作和整理研究。 ChatGPT可以取代艺术家吗&#xff1f;ChatGPT可以创作交响曲吗&#xff1f;ChatGPT的内容是否都合乎伦理&#xff1f;面对AI的完全…

iTOP-2K1000开发板挂载U盘和固态到开发板

1.挂载固态硬盘分区 输入命令 mount /dev/sdb1 /mnt/将固态硬盘的分区挂载到/mnt 目录下&#xff0c;/dev/sdb1 为开发板实际识 别的固态硬盘节点 &#xff0c;大家一定要根据自己开发板的实际情况决定&#xff0c;如下图所示&#xff1a; 2.挂载 U 盘分区 输入命令 fdisk -…

无涯教程-Android - RadioGroup函数

RadioGroup类用于单选按钮集。 如果我们选中属于某个单选按钮组的一个单选按钮,它将自动取消选中同一组中以前选中的任何单选按钮。 RadioGroup属性 以下是与RadioGroup控制相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关…

【数据库技术】NineData数据复制,加速实时数仓构建

8 月 30 日&#xff0c;由 NineData 和 SelectDB 共同举办的主题为“实时数据驱动&#xff0c;引领企业智能化数据管理”的线上联合发布会&#xff0c;圆满成功举办&#xff01;双方聚焦于实时数据仓库技术和数据开发能力&#xff0c;展示如何通过强大的生态开发兼容性&#xf…

项目:智慧教室(cubemx+webserver)

一。项目需求 二。实现外设控制 1.cubemx创建工程 &#xff08;1&#xff09;RCC配置为外部时钟&#xff0c;修改时钟参数 &#xff08;2&#xff09;SWD配置&#xff1a;为了不引脚冲突&#xff0c;使用 &#xff08;3&#xff09;串口的使用&#xff08;USART1&#xff0c;…

打破时空限制:海外网红营销中的直播与虚拟互动

随着全球互联网的普及和技术的迅速发展&#xff0c;传统的商业模式也在不断演变。其中&#xff0c;海外网红直播带货成为了一种引人注目的全新营销方式。近年来&#xff0c;虚拟技术的蓬勃发展为海外网红直播带货提供了新的可能性&#xff0c;不仅丰富了消费者的购物体验&#…

2023UTONMOS斯珂塔全球电竞大赛在粤举办

8月28日&#xff0c;2023 UTONMOS斯珂塔全球电竞大赛于中国广东举办。 此次大赛是由上海和数信息科技集团有限公司与广东关氏集团共同主办的全球性电子竞技盛会&#xff0c;其汇聚国内外头部行业嘉宾、全球的电竞爱好者参与&#xff0c;以和数集团旗下的3D国风玄幻MMORPG链游《…

【遮天】李小曼回归,新形象无差云曦,短板竟是身材?

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析遮天 最新一集《遮天》已经更新&#xff0c;在成功卖掉段德之后&#xff0c;叶凡便离开妖帝坟冢&#xff0c;毕竟他身上拥有庞博从妖帝坟冢带出来的道经和被誉为中州至宝的绿铜 虽然这两样物品都在叶凡的苦海中&#xff0…

轴向磁通电驱动解析

轴向磁通电机的技术创新和量产应用&#xff0c;或将有效解决电动汽车领域目前所面临的一些突出难题&#xff0c;比如轻量化、扭矩密度和人们最为关心的续航里程等。在奔驰汽车刚刚发布的Vision One Eleven概念车&#xff0c;以及此前已经面世的法拉利SF90 Stradale、296GTB和迈…