news 2026/10/1 10:07:37

手写Servlet+JSP+MySQL新闻系统实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手写Servlet+JSP+MySQL新闻系统实战指南

简介:这是一套基于Java Web经典技术栈(Servlet+JSP+MySQL)开发的完整新闻发布系统源码,面向计算机专业本科生及Java初学者,适用于课程设计、期末大作业等实践教学场景,帮助学习者掌握MVC分层架构、前后端交互、数据库操作与基础Web项目部署全流程。资源包共1647个文件,涵盖439张界面截图(png)、364个前端交互脚本(js)、260个动态图标(gif)、152个配置文件(xml)、92个页面模板(html)及54个核心业务Java类,辅以SQL建表语句与详细文档说明,压缩后仅24.45MB,轻量易部署。已有145人学习下载,资源经本地编译验证可直接运行,评审得分98分,内容获助教审定,结构清晰、注释规范,包含完整的用户管理、新闻发布、分类检索、后台审核等模块,适合作为Java Web入门到进阶的典型项目范例。

1. 为什么现在还要手写 Servlet + JSP + MySQL 新闻系统?——它不是过时的教科书,而是 Java Web 底层能力的「压力测试仪」

你可能刚在招聘 JD 里看到“熟悉 Spring Boot”“了解微服务”,转头就被导师塞了个「基于 Java+Servlet+JSP+MySQL 的新闻发布系统」毕设任务;也可能在面试被问到“Servlet 生命周期怎么触发?”“JSP 翻译成 Servlet 后 class 文件在哪?”却答得含糊——不是因为知识点太老,而是你没真正在 Tomcat 里亲手部署过一个带登录、分类、分页、富文本编辑(哪怕只是 textarea)的完整 Web 应用。这个标题不是怀旧,而是一套可验证、可调试、可拆解的 Java Web 基石训练场:它强制你直面 HTTP 请求流转(从浏览器 URL 到doGet/doPost)、会话管理(HttpSession如何跨请求存用户状态)、JSP 编译机制(.jsp怎么变成_xxx_jsp.java再编译为.class)、MySQL 连接池配置(为什么Class.forName()在新版驱动里失效)、以及最常被忽略的——Web 容器与数据库之间的边界如何被真实代码缝合。适合三类人:大三学生要交毕设且需答辩演示、Java 初学者想补全 Web 开发链路认知、或 Spring Boot 工程师想回溯底层原理(比如@Controller背后到底封装了什么)。别急着抄 Spring Boot 版本——先让这个“原始版本”跑起来,你才能真正看懂框架在帮你省掉什么。


2. 从零搭起骨架:用最简依赖跑通 Servlet + JSP 的最小闭环

2.1 选型依据:为什么是 Tomcat 9 + JDK 8(而非 Spring Boot 或更高版本)

这不是守旧,而是可控性优先。Tomcat 9 是最后一个原生支持 JSP 2.3 和 Servlet 4.0且仍广泛用于教学环境的稳定版本;JDK 8 是目前所有主流教材、IDEA/VSCode 插件、Maven 插件对web.xml配置兼容性最高的 Java 版本。Spring Boot 2.x+ 默认禁用 JSP(官方明确说明),而 Tomcat 10+ 因 Jakarta EE 命名空间迁移(javax.*→jakarta.*),会导致所有import javax.servlet.*报错——你抄的源码会直接编译失败。所以,环境锁定是第一步硬门槛:

  • JDK:必须 8u291 或 8u301(避免某些 TLS 握手 bug)
  • Tomcat:9.0.85(2023 年末稳定版,支持web.xml3.1 schema)
  • IDE:IntelliJ IDEA 2022.3 或 VS Code + Extension Pack for Java(非必须,但比 Eclipse 更少玄学报错)

提示:不要用java -version看到 17 就以为能跑——检查JAVA_HOME是否指向 JDK 8,且 IDE 的 Project SDK 和 Tomcat Run Configuration 的 JRE 必须一致。我见过太多人因 IDE 里 JDK 选错导致ClassNotFoundException: javax.servlet.http.HttpServlet。

2.2 创建标准 Web Application 结构:手动建目录,拒绝向导陷阱

很多新手用 IDEA “New Project → Maven → Web Application” 一键生成,结果发现webapp/WEB-INF/web.xml缺失、src/main/java下没有servlet包、甚至index.jsp放错位置——Tomcat 根本不认。必须手建以下结构(Linux/macOS 路径,Windows 用反斜杠):

news-system/ ├── pom.xml ├── src/ │ └── main/ │ ├── java/ │ │ └── com/example/news/ │ │ ├── servlet/ │ │ │ ├── LoginServlet.java │ │ │ └── NewsListServlet.java │ │ ├── dao/ │ │ │ └── NewsDao.java │ │ └── model/ │ │ └── News.java │ └── webapp/ │ ├── index.jsp │ ├── login.jsp │ ├── news_list.jsp │ └── WEB-INF/ │ ├── web.xml │ └── lib/ ← 手动放 mysql-connector-java-8.0.33.jar └── target/ └── news-system/ ← Tomcat 部署目录(非 war,直接复制整个文件夹)

关键点:

  • web.xml必须放在WEB-INF/下,且内容严格按 Servlet 3.1 规范(见下节)
  • mysql-connector-java-8.0.33.jar不能通过 Maven 依赖自动下载——JSP 页面中<sql:setDataSource>标签需要运行时类路径可见,Maven scope 为compile时 Tomcat 无法加载,必须手动丢进WEB-INF/lib/
  • target/news-system/是最终部署目录,不是 war 包——Tomcat 9 对 war 解压有缓存问题,直接复制文件夹更可靠

2.3web.xml配置:3 行代码决定整个应用能否启动

这是最容易翻车的配置文件。常见错误:复制网上旧版web.xml(schema 为 2.3),或漏写<servlet-mapping>导致 404。以下是 Tomcat 9 + JDK 8 下最小可行配置(保存为src/main/webapp/WEB-INF/web.xml):

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.example.news.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <servlet> <servlet-name>NewsListServlet</servlet-name> <servlet-class>com.example.news.servlet.NewsListServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>NewsListServlet</servlet-name> <url-pattern>/news/list</url-pattern> </servlet-mapping> </web-app>

逻辑说明:

  • xsi:schemaLocation指向web-app_4_0.xsd是关键,它告诉 Tomcat 这是 Servlet 4.0 规范(Tomcat 9 支持)
  • <url-pattern>/login</url-pattern>表示访问http://localhost:8080/news-system/login时触发LoginServlet
  • 每个<servlet>必须配一个<servlet-mapping>,否则请求找不到目标类
  • 不要加<welcome-file-list>—— JSP 页面默认不处理 welcome-file,直接访问/login更可控

2.4 写第一个 Servlet:LoginServlet的 3 个生死线

别急着写业务逻辑,先确保请求能进来、响应能出去。以下是最简LoginServlet.java(放在src/main/java/com/example/news/servlet/):

package com.example.news.servlet; 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 LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 生死线1:设置响应编码,否则中文乱码 resp.setContentType("text/html;charset=UTF-8"); // 生死线2:获取表单参数,name="username" 对应 input 的 name 属性 String username = req.getParameter("username"); String password = req.getParameter("password"); // 生死线3:跳转到 news_list.jsp,而非直接输出 HTML(分离关注点) if ("admin".equals(username) && "123456".equals(password)) { req.getSession().setAttribute("user", username); resp.sendRedirect(req.getContextPath() + "/news/list"); } else { req.setAttribute("error", "用户名或密码错误"); req.getRequestDispatcher("/login.jsp").forward(req, resp); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // GET 请求直接显示登录页 req.getRequestDispatcher("/login.jsp").forward(req, resp); } }

参数说明:

  • req.getContextPath()返回应用上下文路径(如/news-system),拼接/news/list形成绝对路径,避免相对路径跳转失败
  • req.getSession().setAttribute("user", username)是会话管理核心——后续所有页面可通过session.getAttribute("user")获取登录态
  • forward()和sendRedirect()区别:前者服务器端跳转(URL 不变,request 属性保留),后者客户端重定向(URL 变,request 属性丢失)——登录成功用 redirect,失败用 forward 保留错误信息

3. 数据库落地:MySQL 8.0 驱动适配与连接池实战

3.1 MySQL 8.0 安装与初始化:绕开 SSL 和密码插件两大坑

网络热词里高频出现error 2002 (hy000): can't connect to local mysql server through socket '/tmp/mysql.sock'和mysql ssl connection error,本质是安装时未关 SSL 或密码策略冲突。正确步骤如下(以 macOS/Linux 为例,Windows 用 MySQL Installer GUI 但勾选“Use Legacy Authentication Method”):

# 1. 下载官方 MySQL 8.0.33 DMG/TAR(勿用 Homebrew 安装,其默认启用 SSL) # 2. 初始化时禁用 SSL(关键!) mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data # 3. 启动服务并登录(--skip-grant-tables 绕过密码验证) mysqld_safe --skip-grant-tables & mysql -u root # 4. 执行以下 SQL(解决密码插件不兼容 JSP 的 classic password) mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; mysql> FLUSH PRIVILEGES; # 5. 创建新闻库和用户(避免 root 直连应用) mysql> CREATE DATABASE news_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; mysql> CREATE USER 'news_user'@'localhost' IDENTIFIED BY 'news_pass123'; mysql> GRANT ALL ON news_db.* TO 'news_user'@'localhost'; mysql> FLUSH PRIVILEGES;

现象 → 原因 → 解决:

  • 现象:Communications link failure或Public Key Retrieval is not allowed
  • 原因:MySQL 8.0 默认启用caching_sha2_password插件,而mysql-connector-java-8.0.33.jar需显式指定allowPublicKeyRetrieval=true
  • 解决:在 JDBC URL 后加参数(见 3.2 节),而非降级驱动

3.2 JDBC 连接池:为什么不用Class.forName(),而用DriverManager+DataSource

老教程教Class.forName("com.mysql.cj.jdbc.Driver"),但在 MySQL 8.0+ 中已自动注册,强行调用反而触发警告。真正该做的是用DataSource管理连接——避免每次请求都新建连接(性能灾难)。在src/main/webapp/WEB-INF/web.xml中添加资源引用:

<resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/NewsDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>

然后在conf/context.xml(Tomcat 安装目录下的 conf 文件夹)中配置实际数据源:

<?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/NewsDB" auth="Container" type="javax.sql.DataSource" maxTotal="20" maxIdle="10" minIdle="5" initialSize="5" maxWaitMillis="10000" username="news_user" password="news_pass123" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/news_db?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true"/> </Context>

关键参数说明:

  • maxTotal="20":连接池最大连接数,超过则排队等待(避免 DB 崩溃)
  • useSSL=false:关闭 SSL(解决SSL connection error)
  • serverTimezone=Asia/Shanghai:解决The server time zone value 'UTC' is unrecognized
  • allowPublicKeyRetrieval=true:解决Public Key Retrieval is not allowed(MySQL 8.0+ 必加)
  • &amp;是 XML 实体转义,不是&,否则解析失败

3.3 DAO 层实现:NewsDao的 3 个防翻车设计

NewsDao.java是数据访问核心,常见错误是 SQL 注入、空指针、资源未释放。以下是安全写法(使用PreparedStatement+ try-with-resources):

package com.example.news.dao; import com.example.news.model.News; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import java.sql.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; public class NewsDao { private DataSource dataSource; public NewsDao() { try { Context ctx = new InitialContext(); dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/NewsDB"); } catch (Exception e) { throw new RuntimeException("JNDI lookup failed", e); } } public List<News> getAllNews() { String sql = "SELECT id, title, content, author, create_time FROM news ORDER BY create_time DESC LIMIT 10"; List<News> list = new ArrayList<>(); try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { while (rs.next()) { News news = new News(); news.setId(rs.getLong("id")); news.setTitle(rs.getString("title")); news.setContent(rs.getString("content")); news.setAuthor(rs.getString("author")); news.setCreateTime(rs.getTimestamp("create_time").toLocalDateTime()); list.add(news); } } catch (SQLException e) { throw new RuntimeException("Query news failed", e); } return list; } }

逻辑说明:

  • InitialContext().lookup("java:comp/env/jdbc/NewsDB")是 JNDI 查找标准路径,必须与web.xml中res-ref-name和context.xml中name严格一致
  • try-with-resources自动关闭Connection/PreparedStatement/ResultSet,避免连接泄漏(Tomcat 连接池耗尽后所有请求卡死)
  • rs.getTimestamp("create_time").toLocalDateTime()将 MySQLDATETIME转为 Java 8LocalDateTime,避免java.util.Date过时 API

4. JSP 页面工程化:从脚本混写到 MVC 分离的实战演进

4.1login.jsp:用 JSTL 替代 Scriptlet,告别<% %>玄学

老式 JSP 常见<% String error = (String) request.getAttribute("error"); if(error!=null){ %>...<% } %>,极易出错且不可维护。必须用 JSTL(JavaServer Pages Standard Tag Library)。首先在WEB-INF/lib/中添加jstl-1.2.jar(Tomcat 9 不自带),然后在login.jsp顶部声明:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head><title>新闻系统登录</title></head> <body> <form action="${pageContext.request.contextPath}/login" method="post"> <input type="text" name="username" placeholder="用户名" required> <input type="password" name="password" placeholder="密码" required> <button type="submit">登录</button> </form> <c:if test="${not empty error}"> <div style="color:red;">${error}</div> </c:if> </body> </html>

关键点:

  • ${pageContext.request.contextPath}动态获取应用路径(如/news-system),避免硬编码/login导致部署到子路径时 404
  • <c:if>标签替代if脚本,test="${not empty error}"判断 request 属性是否存在且非空
  • required属性由浏览器校验,减轻服务端负担(但后端仍需校验,防绕过)

4.2news_list.jsp:用 JSTL + EL 实现动态列表渲染

这是展示层核心。避免在 JSP 中写 Java 代码,全部交给 Servlet 处理,JSP 只负责展示:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!DOCTYPE html> <html> <head><title>新闻列表</title></head> <body> <h1>新闻列表</h1> <c:forEach var="news" items="${newsList}"> <div> <h3>${news.title}</h3> <p>作者:${news.author} | 时间:<fmt:formatDate value="${news.createTime}" pattern="yyyy-MM-dd HH:mm"/></p> <p>${news.content}</p> <hr> </div> </c:forEach> <a href="${pageContext.request.contextPath}/logout">退出登录</a> </body> </html>

参数说明:

  • items="${newsList}"中的newsList是NewsListServlet中req.setAttribute("newsList", newsList)设置的 request 属性
  • <fmt:formatDate>格式化LocalDateTime,pattern="yyyy-MM-dd HH:mm"输出如2023-10-05 14:30
  • ${news.title}是 EL 表达式,自动调用News.getTitle()getter 方法(JavaBean 规范)

4.3web.xml中的欢迎页陷阱:为什么index.jsp不能直接当入口

很多新手把index.jsp设为 welcome-file,结果访问http://localhost:8080/news-system/时提示 404。原因:index.jsp是静态资源,而登录需经过LoginServlet控制。正确做法是重定向:在src/main/webapp/index.jsp中只写一行:

<% response.sendRedirect(request.getContextPath() + "/login"); %>

这样访问根路径自动跳转到/login,符合 MVC 流程(所有请求经由 Servlet 控制)。


5. 避坑指南:12 个血泪经验总结的高频翻车现场

5.1 现象:JSP 页面中文乱码,浏览器显示方框或问号

原因:JSP 文件本身编码、HTTP 响应编码、HTML meta 编码三者不一致。常见是文件存为 GBK,但response.setContentType("text/html;charset=UTF-8")强制 UTF-8。
解决:

  • 确保所有.jsp文件用 UTF-8 编码保存(IDEA:File → File Encoding → UTF-8)
  • web.xml中添加<jsp-config><jsp-property-group><url-pattern>*.jsp</url-pattern><page-encoding>UTF-8</page-encoding></jsp-property-group></jsp-config>
  • JSP 页面顶部加<%@ page contentType="text/html;charset=UTF-8" %>

5.2 现象:java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet

原因:Tomcat 的lib/servlet-api.jar未被 IDE 正确识别,或 Maven 依赖 scope 错误(provided未生效)。
解决:

  • IDEA:File → Project Structure → Modules → Dependencies → 点击+→ JARs and directories → 选择 Tomcat 安装目录下的lib/servlet-api.jar
  • Maven 中<scope>provided</scope>必须存在,且pom.xml的packaging为war

5.3 现象:HTTP Status 404 – /news-system/login,但web.xml明明配置了/login

原因:Servlet 类名或包路径写错,或web.xml未放在WEB-INF/下,或 Tomcat 未重启。
解决:

  • 检查LoginServlet.class是否生成在target/news-system/WEB-INF/classes/com/example/news/servlet/
  • 查看 Tomcatlogs/catalina.out,搜索SEVERE关键字,定位类加载失败日志
  • 删除work/Catalina/localhost/news-system/目录(Tomcat 编译缓存),再重启

5.4 现象:MySQL 连接成功,但查询返回空结果集,无报错

原因:ResultSet游标初始位置在第 0 行,rs.next()未调用就直接取值。
解决:

  • 必须用while(rs.next()) { ... }或if(rs.next()) { ... }移动游标,禁止rs.getString(1)直接调用

5.5 现象:登录后跳转到/news/list,但页面显示HTTP Status 404

原因:NewsListServlet的doGet()方法未实现,或web.xml中<url-pattern>与浏览器地址栏 URL 不匹配(如多写了斜杠/news/list/)。
解决:

  • 检查浏览器地址栏是否为http://localhost:8080/news-system/news/list(无多余斜杠)
  • NewsListServlet必须重写doGet(),且内部调用NewsDao.getAllNews()并req.setAttribute("newsList", list)

6. 进阶验证与生产化技巧:让这个“老系统”真正扛住压力

6.1 用 Postman 验证接口契约:脱离浏览器,看清 HTTP 本质

别只靠浏览器点点点。用 Postman 发送真实请求,验证每个环节:

  • POST /news-system/login,Body 选x-www-form-urlencoded,填username=admin&password=123456,观察响应 Header 中是否有Set-Cookie: JSESSIONID=xxx
  • GET /news-system/news/list,Headers 加Cookie: JSESSIONID=xxx(从上一步复制),验证是否返回 200 及 HTML 内容
  • 关键验证点:JSESSIONID是否在两次请求间保持一致?Set-Cookie的Path是否为/news-system?这决定了会话是否跨请求有效

6.2 日志埋点:在NewsListServlet中加入性能监控

在doGet()开头加时间戳,在结尾打印耗时,这是排查慢查询的第一步:

long start = System.currentTimeMillis(); List<News> newsList = newsDao.getAllNews(); long end = System.currentTimeMillis(); System.out.println("NewsListServlet query took " + (end - start) + "ms");

注意:System.out.println在生产环境应替换为 Log4j2,但开发阶段足够定位瓶颈。如果耗时 > 500ms,立刻检查 MySQL 是否有索引(CREATE INDEX idx_create_time ON news(create_time);)。

6.3 安全加固:3 行代码堵住常见 Web 漏洞

这个“老系统”常被当成靶机,但只需基础加固:

  • SQL 注入:DAO 层已用PreparedStatement,无需额外操作
  • XSS 攻击:在news_list.jsp中,将${news.content}改为<c:out value="${news.content}" />,自动转义<script>等标签
  • CSRF 攻击:在login.jsp表单中加隐藏域<input type="hidden" name="token" value="<%= java.util.UUID.randomUUID().toString() %>">,并在LoginServlet中校验 token(简单版防重复提交)

6.4 部署 checklist:5 个必检项,避免上线即崩

检查项正确值错误后果
JAVA_HOME指向 JDK 8echo $JAVA_HOME输出/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/HomeUnsupportedClassVersionError
WEB-INF/web.xmlschema 版本version="4.0"且xsi:schemaLocation指向web-app_4_0.xsdTomcat 启动失败,日志报 schema 错误
mysql-connector-java-8.0.33.jar位置WEB-INF/lib/下,非src/main/resources/ClassNotFoundException: com.mysql.cj.jdbc.Driver
context.xml中name与web.xml中res-ref-name全部为jdbc/NewsDBJNDI lookup failed,DAO 报空指针
target/news-system/目录结构包含WEB-INF/、login.jsp、news_list.jsp,无src/或pom.xmlTomcat 认为不是 Web 应用,404

最后说句实在的:我带过 17 届学生做这个项目,每年都有人卡在web.xml的 schema 上一整天。后来我养成习惯——新建项目第一件事,就是打开 Tomcat 官网文档,复制粘贴最新版web.xml模板。不是信不过自己,而是信不过搜索引擎里那些年份模糊的博客。这个系统真正的价值,从来不是“做出个新闻站”,而是让你亲手拧紧每一颗螺丝,看清 Java Web 的毛细血管。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 10:04:31

Fugue算法的各种密码分析方法全面盘点

Fugue算法的各种密码分析方法全面盘点针对Fugue算法的密码分析&#xff0c;学术界的研究主要集中在区分器&#xff08;Distinguisher&#xff09; 和自由起始&#xff08;Free-start&#xff09;攻击上&#xff0c;并未发现能实际威胁其完整版本安全性的严重漏洞。其核心设计也…

作者头像 李华
网站建设 2026/10/1 10:04:28

基于SpringBoot的农资仓储直销系统微信小程序(源码+lw+部署文档+讲解等)

联系博主 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 …

作者头像 李华
网站建设 2026/10/1 10:04:14

9.3【A】

3876不一样的在于规则二上只能选择当前位置之前的数来构造依旧假设&#xff0c;如果要构造奇数&#xff0c;如果当前位置是奇数&#xff0c;则没事&#xff0c;如果为偶数&#xff0c;则前面位置必须出现过奇数&#xff0c;否则当前位置上的偶数无法消除掉然后如果要构造偶数&a…

作者头像 李华
网站建设 2026/10/1 10:02:43

VMware虚拟机拖拽复制卡死与共享文件夹无法访问的排障实战

从标题就能看出来&#xff0c;这又是一个“日常操作把人逼疯”的VMware故事。上周我往VMware Workstation 17 Pro里的Windows 11客户机拖一个2.8GB的项目文件夹&#xff0c;拖进去不到三秒&#xff0c;虚拟机画面直接定格&#xff0c;鼠标、键盘、远程桌面全部无响应。等我把虚…

作者头像 李华
网站建设 2026/10/1 10:00:36

达梦数据库实时同步:Flink CDC日志接入与五大避坑实践

简介&#xff1a;FlinkCDC与达梦数据库结合的实时同步方案资料&#xff0c;面向需要构建实时数仓、数据同步及事件驱动应用的Java开发者或数据工程师。该压缩包共315个文件&#xff0c;约341.71MB&#xff0c;以263个jar依赖库为核心&#xff0c;辅以xml配置、class编译产物、j…

作者头像 李华