当前位置: 首页 > news >正文

构建 Java Web 应用程序:从 Servlet 到数据库交互(Eclipse使用JDBC连接Mysql数据库)

第 1 部分:环境设置
  1. 安装 Java Development Kit (JDK):下载并安装 JDK。
  2. 设置 IDE:安装并配置 IDE(如 IntelliJ IDEA 或 Eclipse)。
  3. 安装数据库:下载并安装 MySQL 数据库。
  4. 配置数据库:创建数据库和用户,设置权限。
  5. 确保MySQL数据库服务正在运行。
  6. 使用数据库管理工具(如终端命令行或Navicat)测试连接。
第 2 部分:创建 Web 应用程序项目
  1. 创建新项目:在 IDE 中创建新的 Java Web 项目。
  2. 配置项目结构:设置 src/main/java 和 src/main/webapp 目录。
  3. 添加依赖:如果使用 Maven 或 Gradle,添加 MySQL JDBC 驱动程序依赖。

第 3 部分:设计实体类
  1. 创建 Student 实体类:定义学生的属性和方法。
package  ; // 定义了该类所属的包名 根据自己的项目进行补充/*** Student 类用于表示一个学生实体,包含学生的基本信息和相关操作。*/
public class Student {private int id; // 学生的ID,唯一标识一个学生private int age; // 学生的年龄private String name; // 学生的姓名private String gender; // 学生的性别private String password; // 学生的密码,用于系统登录private String email; // 学生的电子邮件地址private String hobbies; // 学生的兴趣爱好,以字符串形式存储private String introduction; // 学生的自我介绍// 无参构造函数,创建一个Student对象时不初始化任何属性public Student() {}// Getter 和 Setter 方法,用于获取和设置Student对象的属性// ID相关的Getter和Setterpublic int getId() {return id; // 返回学生ID}public void setId(int id) {this.id = id; // 设置学生ID}// 年龄相关的Getter和Setterpublic int getAge() {return age; // 返回年龄}public void setAge(int age) {this.age = age; // 设置年龄}// 姓名相关的Getter和Setterpublic String getName() {return name; // 返回姓名}public void setName(String name) {this.name = name; // 设置姓名}// 性别相关的Getter和Setterpublic String getGender() {return gender; // 返回性别}public void setGender(String gender) {this.gender = gender; // 设置性别}// 密码相关的Getter和Setterpublic String getPassword() {return password; // 返回密码}public void setPassword(String password) {this.password = password; // 设置密码}// 电子邮件相关的Getter和Setterpublic String getEmail() {return email; // 返回电子邮件地址}public void setEmail(String email) {this.email = email; // 设置电子邮件地址}// 兴趣爱好相关的Getter和Setterpublic String getHobbies() {return hobbies; // 返回兴趣爱好}public void setHobbies(String hobbies) {this.hobbies = hobbies; // 设置兴趣爱好}// 自我介绍相关的Getter和Setterpublic String getIntroduction() {return introduction; // 返回自我介绍}public void setIntroduction(String introduction) {this.introduction = introduction; // 设置自我介绍}
}
第 4 部分:数据库连接服务
  1. 创建 DBConnection 类:实现获取数据库连接的方法。
package  ; // 指定该类所在的包名  根据自己的项目进行更改import java.sql.Connection; // 导入Java SQL Connection接口
import java.sql.DriverManager; // 导入 DriverManager 类,用于加载数据库驱动
import java.sql.SQLException; // 导入 SQLException,用于捕获获数据库异常/*** DBConnection 类用于建立和管理与MySQL数据库的连接。* 提供一个静态方法 getConnection() 用于获取数据库连接实例。*/
public class DBConnection {// 定义数据库驱动类名,用于Class.forName() 方法加载驱动private static final String DRIVER = "com.mysql.cj.jdbc.Driver";// 定义数据库连接URL,包括数据库地址、端口、数据库名以及连接参数private static final String URL = "jdbc:mysql://localhost:3306/student?useSSL=false&serverTimezone=UTC";// 定义数据库的用户名private static final String USERNAME = "root";// 定义数据库的密码private static final String PASSWORD = "123456";// 私有成员变量 conn 用于存储数据库连接对象private Connection conn;/*** 获取数据库连接的方法。* 首先尝试加载数据库驱动,然后使用 DriverManager 获取数据库连接。* @return 返回一个 Connection 对象,表示与数据库的连接。*/public Connection getConnection() {try {// 加载并注册 MySQL JDBC 驱动Class.forName(DRIVER);// 通过 DriverManager 获取数据库连接conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);// 如果连接成功,打印确认信息System.out.println("MySQL JDBC driver is loaded and connection is established.");} catch (ClassNotFoundException e) {// 如果找不到 JDBC 驱动类,打印错误信息并输出堆栈跟踪System.out.println("MySQL JDBC driver is not found.");e.printStackTrace();} catch (SQLException e) {// 如果数据库连接失败,输出堆栈跟踪e.printStackTrace();}// 返回数据库连接对象return conn;}
}
  1. 创建 DatabaseService 类:封装数据库连接逻辑。
第 5 部分:数据访问对象 (DAO)
  1. 创建 StudentDAO 类:实现插入学生信息到数据库的方法。
package  ; // 指定该类所在的包名 根据自己的项目进行更改import java.sql.Connection; // 导入Java的数据库连接接口
import java.sql.PreparedStatement; // 导入PreparedStatement,用于预编译SQL语句
import java.sql.SQLException; // 导入SQLException,用于捕获数据库异常
import java.util.logging.Level; // 导入日志记录级别
import java.util.logging.Logger; // 导入Java的日志记录器/*** StudentDAO类用于处理与学生相关的数据库操作。*/
public class StudentDAO {// 获取Logger实例,用于记录日志private static final Logger logger = Logger.getLogger(StudentDAO.class.getName());// 数据库连接服务,用于获取数据库连接private DBConnection dbService = new DBConnection(); /*** 将学生信息插入数据库的方法。* @param student 要插入的学生对象* @return 操作结果,包含是否成功和消息*/public Result insertStudent(Student student) {// 定义SQL插入语句String sql = "INSERT INTO info (name, email, age, gender, password, hobbies, introduction) VALUES (?, ?, ?, ?, ?, ?, ?)";try (Connection conn = dbService.getConnection(); // 获取数据库连接PreparedStatement pstmt = conn.prepareStatement(sql)) { // 创建PreparedStatement对象// 设置PreparedStatement参数pstmt.setString(1, student.getName());pstmt.setString(2, student.getEmail());pstmt.setInt(3, student.getAge());pstmt.setString(4, student.getGender());pstmt.setString(5, student.getPassword());pstmt.setString(6, student.getHobbies());pstmt.setString(7, student.getIntroduction());// 打印接收到的学生数据logger.log(Level.INFO, "接收到的学生数据: 名字={0}, 邮箱={1}, 年龄={2}, 性别={3}, 爱好={4}, 简介={5}",new Object[]{student.getName(), student.getEmail(), student.getAge(), student.getGender(),student.getHobbies(), student.getIntroduction()});int affectedRows = pstmt.executeUpdate(); // 执行SQL语句if (affectedRows > 0) {logger.log(Level.INFO, "数据插入成功,影响行数:{0}", affectedRows);return new Result(true, "注册成功");} else {logger.log(Level.WARNING, "数据插入失败,没有行受到影响");return new Result(false, "注册失败");}} catch (SQLException e) {logger.log(Level.SEVERE, "数据库错误: " + e.getMessage(), e); // 记录数据库异常return new Result(false, "数据库错误: " + e.getMessage());}}
}
  1. 异常处理:在 DAO 类中添加异常处理逻辑。
第 6 部分:Servlet 处理 HTTP 请求
  1. 创建 RegServlet 类:处理用户注册请求。
package   ; // 定义了该Servlet类所属的包名 根据自己的项目进行补充import jakarta.servlet.ServletException; // 导入Servlet异常处理类
import jakarta.servlet.annotation.WebServlet; // 用于定义Servlet的注解
import jakarta.servlet.http.HttpServlet; // 扩展HttpServlet以创建Servlet
import jakarta.servlet.http.HttpServletRequest; // 用于获取客户端请求
import jakarta.servlet.http.HttpServletResponse; // 用于发送响应客户端
import java.io.IOException; // 导入IOException类// 使用@WebServlet注解将此Servlet映射到"/RegServlet"路径
@WebServlet("/RegServlet")
public class RegServlet extends HttpServlet {private static final long serialVersionUID = 1L; // 用于序列化// 处理POST请求的方法protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 从请求中获取表单数据String name = request.getParameter("name");String email = request.getParameter("email");String password = request.getParameter("password");String gender = request.getParameter("gender");String ageStr = request.getParameter("age");String[] hobbiesArray = request.getParameterValues("hobby"); // 获取兴趣爱好数组String introduction = request.getParameter("introduction");// 将兴趣爱好数组转换为逗号分隔的字符串String hobbies = (hobbiesArray != null) ? String.join(", ", hobbiesArray) : "";// 创建Student对象并设置属性Student student = new Student();student.setName(name);student.setEmail(email);student.setGender(gender);student.setPassword(password);student.setAge(Integer.parseInt(ageStr)); // 将年龄字符串转换为整数student.setHobbies(hobbies);student.setIntroduction(introduction);// 创建StudentDAO对象处理数据库操作StudentDAO studentDAO = new StudentDAO();// 调用insertStudent方法尝试将学生信息插入数据库Result result = studentDAO.insertStudent(student);// 根据数据库操作结果重定向到相应页面if (result.isSuccess()) { response.sendRedirect("success.jsp"); // 成功则跳转到成功页面} else {response.sendRedirect("error.jsp"); // 失败则跳转到错误页面}}// 处理GET请求的方法,可以选择显示注册表单或重定向到注册页面protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.sendRedirect("index.jsp"); // 默认重定向到注册页面}
}
  1. 获取请求参数:从 HTTP 请求中获取用户输入。
  2. 调用 DAO 方法:使用获取的数据调用 DAO 类的方法。
  3. 重定向:根据操作结果重定向到成功或错误页面。
第 7 部分:创建 JSP 页面
  1. 创建 index.jsp:用户注册表单页面。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>用户注册页面</title><style>body {/* 设置页面主体样式,使用Arial字体,居中显示,背景白色 */font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;margin:  return 0;background-color: #fff;}.background-image {/* 设置背景图片样式,固定在底部,覆盖背景 */position: fixed;bottom: 0;left: 0;width: 500px;height: 320px;background-image: url('bg.png');background-size: cover;z-index: -1;}.container {/* 设置表单容器样式,半透明背景,圆角,阴影效果 */width: 600px;padding: 20px;background-color: rgba(255, 255, 255, 0.9);border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);backdrop-filter: blur(10px);display: flex;flex-direction: column;}/* 其他样式类定义,如.form-group, .hobbies, .register-btn 等,用于设置表单元素的布局和外观 */</style>
</head>
<body><div class="background-image"></div><div class="container"><h2>用户注册</h2><form action="RegServlet" method="post"><!-- 昵称输入框 --><div class="form-group"><label for="name">昵称:</label><input type="text" id="name" name="name" required></div><!-- 邮箱输入框 --><div class="form-group"><label for="email">注册邮箱:</label><input type="email" id="email" name="email" required></div><!-- 密码输入框 --><div class="form-group"><label for="password">密码:</label><input type="password" id="password" name="password" required></div><!-- 性别单选按钮 --><div class="form-group"><label>性别:</label><input type="radio" id="male" name="gender" value="male"><label for="male">男</label><input type="radio" id="female" name="gender" value="female"><label for="female">女</label></div><!-- 年龄输入框 --><div class="form-group"><label for="age">年龄:</label><input type="number" id="age" name="age" required></div><!-- 兴趣爱好多选框 --><div class="form-group"><label>兴趣爱好:</label><div class="hobbies"><!-- 爱好1 --><input type="checkbox" id="hobby1" name="hobby" value="hobby1"><label for="hobby1">爱好1</label><!-- 爱好2 --><input type="checkbox" id="hobby2" name="hobby" value="hobby2"><label for="hobby2">爱好2</label><!-- 爱好3 --><input type="checkbox" id="hobby3" name="hobby" value="hobby3"><label for="hobby3">爱好3</label></div><div class="hobbies"><!-- 爱好4 --><input type="checkbox" id="hobby4" name="hobby" value="hobby4"><label for="hobby4">爱好4</label><!-- 爱好5 --><input type="checkbox" id="hobby5" name="hobby" value="hobby5"><label for="hobby5">爱好5</label><!-- 爱好6 --><input type="checkbox" id="hobby6" name="hobby" value="hobby6"><label for="hobby6">爱好6</label></div></div><!-- 自我介绍文本域 --><div class="form-group"><label for="introduction">自我介绍:</label><textarea id="introduction" name="introduction" maxlength="100" required></textarea></div><!-- 注册按钮 --><button type="submit" class="register-btn">立即注册</button></form></div>
</body>
</html>
  1. 创建 success.jsp:注册成功页面。
  2. 创建 error.jsp:注册失败页面。
第 8 部分:测试应用程序
  1. 部署应用程序:将应用程序部署到服务器(如 Tomcat)。
  2. 测试注册功能:填写表单并提交,检查是否正确重定向。
  3. 检查数据库:确认数据已正确插入数据库。
第 9 部分:调试和错误处理
  1. 查看日志:了解如何查看和解读日志文件。
  2. 常见问题解决:提供一些常见问题的解决方案。
第 10 部分:项目优化和扩展
  1. 使用连接池:介绍如何使用连接池来优化数据库连接。
  2. 添加更多功能:提供思路如何添加更多功能到应用程序。

结语

一个迷茫的大学生

相关文章:

构建 Java Web 应用程序:从 Servlet 到数据库交互(Eclipse使用JDBC连接Mysql数据库)

第 1 部分&#xff1a;环境设置 安装 Java Development Kit (JDK)&#xff1a;下载并安装 JDK。设置 IDE&#xff1a;安装并配置 IDE&#xff08;如 IntelliJ IDEA 或 Eclipse&#xff09;。安装数据库&#xff1a;下载并安装 MySQL 数据库。配置数据库&#xff1a;创建数据库…...

mfc100u.dll是什么?分享几种mfc100u.dll丢失的解决方法

mfc100u.dll 是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;属于 Microsoft Foundation Classes (MFC) 库的一部分。MFC 是微软公司开发的一套用于快速开发 Windows 应用程序的 C 类库。mfc100u.dll 文件包含了 MFC 库中一些常用的函数和类的定义&#xff0c;这…...

Java面试之多线程并发篇

前言 本来想着给自己放松一下&#xff0c;刷刷博客&#xff0c;突然被几道面试题难倒&#xff01;说一说自己对于 synchronized 关键字的了解&#xff1f;说说自己是怎么使用 synchronized 关键字&#xff1f;什么是线程安全&#xff1f;Vector是一个线程安全类吗&#xff1f;…...

视频推拉流EasyDSS互联网直播点播平台技术特点及应用场景剖析

在数字科技日新月异的今天&#xff0c;视频直播和点播已经成为互联网内容传播的重要方式之一。而互联网直播点播平台EasyDSS作为功能强大的流媒体直播点播视频能力平台&#xff0c;提供了一站式的视频推拉流、转码、直播、点播、时移回放、存储等视频服务&#xff0c;广泛应用于…...

安全加固方案

交换机安全加固 查看是否关闭未使用的接口 25GE1/0/1、25GE1/0/47、25GE1/0/48需要使用&#xff0c;暂不关闭 system-view # interface Eth-Trunk99 shutdown quit interface Eth-Trunk100 shutdown quit interface Eth-Trunk110 shutdown quit interface 25GE1/…...

Linux firewall防火墙规则

官网 https://firewalld.org/ 查看所有防火墙规则&#xff1a; firewall-cmd --list-all-zones查看当前区域防火墙规则&#xff1a; firewall-cmd --list-all添加一个开放服务规则&#xff1a; firewall-cmd --add-servicessh删除一个开放服务规则&#xff1a; firewall-cmd…...

速盾:CDN缓存的工作原理是什么?

CDN&#xff08;内容分发网络&#xff09;是一种将内容分发到全球不同地理位置的网络架构&#xff0c;以提供更快速、可靠的内容传输。其核心原理是利用缓存技术&#xff0c;将数据内容分布到离用户最近的边缘节点上。当用户请求内容时&#xff0c;CDN将根据用户的IP地址&#…...

日常开发记录-正确的prop传参,reduce搭配promise的使用

日常开发记录-正确的prop传参&#xff0c;reduce搭配promise的使用 1.正确的prop传参2.reduce搭配promise的使用 1.正确的prop传参 一般会的父组件传参子组件 //父组件 <A :demodata.sync"testData" :listData.sync"testData2"></A> data ()…...

Hyper-V配置-cnblog

启用Hyper-V以在 Windows 10上创建虚拟机 &#xff08;1&#xff09;控制面板检查系统要求&#xff1a; 确保您的计算机符合 Hyper-V 的系统要求。通常情况下&#xff0c;您的计算机需要运行 Windows 10 专业版、企业版或教育版&#xff0c;并且具有启用了虚拟化技术的处理器。…...

运维Tips:Docker或K8s集群拉取Harbor私有容器镜像仓库配置指南

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Docker与Kubernetes集群拉取Harbor私有容器镜像仓库配置 描述:在现在微服务、云原生的环境下,通常我们会在企业中部署Docker和Kubernetes集群,并且会在企业内部搭建Harbor私有镜像仓库以保证开发源码安全,以及加快…...

openssl颁发包含主题替代名的证书–SAN

原文地址&#xff1a;openssl颁发包含主题替代名的证书–SAN – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 在 X.509 证书中&#xff0c;commonName&#xff08;CN&#xff09;字段只能有一个值。如果让证书支持多个域名和IP地址&#xff0c;…...

Stable Diffusion入门教程

要入门Stable Diffusion&#xff0c;你可以按照以下步骤进行&#xff1a; 1. 安装Stable Diffusion 获取安装包&#xff1a;你可以从GitHub上的 Stable Diffusion Web UI开源地址获取安装包。 一键启动程序包&#xff1a;如果你是小白不会装&#xff0c;可以使用国内秋葉aaaki开…...

H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件

EasyPlayer.js无插件H5播放器作为一款功能全面的H5流媒体播放器&#xff0c;凭借其多种协议支持、多种解码方式、丰富的渲染元素和强大的应用功能&#xff0c;以及出色的跨平台兼容性&#xff0c;为用户提供了高度定制化的选项和优化的播放体验。无论是视频直播还是点播&#x…...

conan2 c/c++包管理入门之--------------------------conanfile.py

书接上回,用过使用cmake去手动指定CMAKE_TOOLCHAINE_FILE和CMAKE_BUILD_TYPE太麻烦,有没有更简单的办法了,经过我的大量探索下终于发现,使用conan build和conanfile.py。大致原理是conan在构建时会自动调用conanfile.py里面定义数据和函数。举个例子: from conan import …...

DICOM图像深入解析:为何部分DR/CR图像默认显示为反色?

概述 在数字医学影像处理中,CR(Computed Radiography,计算机放射摄影)和DR(Digital Radiography,数字放射摄影)技术广泛应用于医疗影像获取与分析。然而,临床实践中常常遇到这样一个问题:部分CR/DR图像在默认打开时呈现为反色(即负片效果),需手动反色后才能正常阅片…...

重新定义社媒引流:AI社媒引流王如何为品牌赋能?

在社交媒体高度竞争的时代&#xff0c;引流已经不再是单纯追求流量的数字游戏&#xff0c;而是要找到“对的用户”&#xff0c;并与他们建立真实的连接。AI社媒引流王通过技术创新和智能策略&#xff0c;重新定义了社媒引流的方式&#xff0c;帮助品牌在精准触达和高效互动中脱…...

【FPGA】Verilog:利用 4 个串行输入- 串行输出的 D 触发器实现 Shift_register

0x00 什么是寄存器 寄存器(Register)是顺序逻辑电路中使用的基本组成部分之一。寄存器用于在数字系统中存储和处理数据。寄存器通常由位(bit)构成,每个位可以存储一个0或1的值。通过寄存器,可以设计出计数器、加法器等各种数据处理电路。 0x01 寄存器的种类 基于 D 触发…...

《硬件架构的艺术》笔记(五):低功耗设计

介绍 能量以热量形式消耗&#xff0c;温度升高芯片失效率也会增加&#xff0c;增加散热片或风扇会增加整体重量和成本&#xff0c;在SoC级别对功耗进行控制就可以减少甚至可能消除掉这些开支&#xff0c;产品也更小更便宜更可靠。本章描述了减少动态功耗和静态功耗的各种技术。…...

Hive离线数仓结构分析

Hive离线数仓结构 首先&#xff0c;在数据源部分&#xff0c;包括源业务库、用户日志、爬虫数据和系统日志&#xff0c;这些都是数据的源头。这些数据通过Sqoop、DataX或 Flume 工具进行提取和导入操作。这些工具负责将不同来源的数据传输到基于 Hive 的离线数据仓库中。 在离线…...

鱼眼相机模型-MEI

参考文献&#xff1a; Single View Point Omnidirectional Camera Calibration from Planar Grids 1. 相机模型如下&#xff1a; // 相机坐标系下的点投影到畸变图像// 输入&#xff1a;相机坐标系点坐标cam 输出&#xff1a; 畸变图像素点坐标disPtvoid FisheyeCamAdapter::…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...