
简介本资源是一套完整的基于Java开发的在线考试系统毕业设计项目面向计算机专业本科生、Java初学者及教育类系统开发者解决课程考核数字化、考试流程自动化与后台管理可视化等实际需求。压缩包共14个文件包含5个MP4演示与部署视频含项目演示、数据库设计、部署操作等、3个ZIP源码包适配MySQL 5/8双版本及原始项目、1个SQL数据库脚本、3个文本类连接配置与说明文档以及DOC/DOCX格式的数据库结构设计与部署文档整体大小95.11MB结构清晰、开箱即用。已有174人学习下载所有模块均已通过验收并可稳定运行。读者可直接获取可编译运行的完整源码、双数据库兼容方案、分步骤部署指南、全流程操作录屏及关键表结构设计说明特别适合课程设计参考、毕设快速启动与Java Web全栈实践。1. 别急着跑 demo先搞清你手里的这套 Java 考试系统到底“认”哪个 MySQL 版本你下载的这个「基于Java的在线考试系统设计与实现」压缩包表面看是毕业设计标配——源码数据库部署文档演示视频样样齐全。但实际解压后你会发现里面塞了三套项目代码1-源项目.zip、2-mysql5的项目.zip、3-mysql8的项目.zip两份数据库连接说明mysql5.txt / mysql8.txt还有一份 db.sql 和一份独立的「数据库表结构设计.doc」。这不是冗余是血泪经验堆出来的兼容性分叉——MySQL 5.7 和 MySQL 8.0 在认证插件、时区处理、JDBC URL 参数、甚至默认 SQL 模式上存在不可忽略的断裂点。我见过太多人直接用 MySQL 8.0 启动 mysql5 的项目卡在Access denied for user十分钟查不出原因也有人把 mysql8 的项目硬塞进本地 MySQL 5.7登录页一刷就报Unknown system variable caching_sha2_password。这套资源不是“拿来即用”而是“选对版本才能用”。它适合正在做课程设计、毕设答辩倒计时两周、需要快速验证功能逻辑的 Java 初学者也适合带学生做实训的某高校导师——但前提是你得先看清自己环境里装的是哪一代 MySQL再从三套代码里精准摘出匹配的那一套。别跳过这一步否则后面所有配置都是玄学。2. 环境准备JDK、MySQL、Tomcat 三件套的版本锚点与安装实操2.1 JDK 8u202 是这套系统的“黄金基线”项目未明确声明 JDK 版本但通过反编译 class 文件、检查 pom.xml 中 maven-compiler-plugin 的 source/target 设置均为 1.8以及部署文档中 Tomcat 版本指向 8.5.x可确认其编译目标为 Java 8。JDK 11 会因模块化和移除 JAXB 等 API 导致启动失败JDK 17 更会直接抛UnsupportedClassVersionError。推荐使用 OpenJDK 8u202非最新版因其与 MySQL Connector/J 5.1.x项目所用兼容最稳。安装步骤# Linux/macOS 下推荐使用 SDKMAN!避免手动配 PATH curl -s https://get.sdkman.io | bash source $HOME/.sdkman/bin/sdkman-init.sh sdk install java 8.0.202-open sdk use java 8.0.202-open java -version # 输出应为 openjdk version 1.8.0_202提示Windows 用户请下载OpenJDK8U-jdk_x64_windows_hotspot_8u202b08.zip解压后将bin目录加入系统 PATH并通过set JAVA_HOMEC:\path\to\jdk8显式声明。务必验证javac -version与java -version输出一致。2.2 MySQL 5.7.33 或 8.0.33两个分支必须严格隔离项目提供两套 SQL 脚本与两套代码本质是适配 MySQL 认证机制变更MySQL 5.7 分支使用mysql_native_password插件JDBC URL 形如jdbc:mysql://localhost:3306/exam?useSSLfalseserverTimezoneGMT%2B8MySQL 8.0 分支默认caching_sha2_password需显式指定authenticationPlugins或降级用户插件URL 需追加allowPublicKeyRetrievaltrue安装建议以 Ubuntu 22.04 为例# 安装 MySQL 5.7官方 apt 源已移除需手动添加 wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb # 安装时选择 5.7 sudo apt update sudo apt install mysql-server-5.7 sudo mysql_secure_installation # 设定 root 密码禁用匿名用户# 或安装 MySQL 8.0更推荐长期维护有保障 sudo apt install mysql-server # 启动后立即执行降级命令适配项目 JDBC 驱动 sudo mysql -u root -p -e ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY your_password; FLUSH PRIVILEGES;注意db.sql文件本身不区分版本但其中CREATE USER语句在 MySQL 8.0 中需配合IDENTIFIED WITH子句否则导入会报错。部署文档中数据库连接-mysql5.txt与数据库连接-mysql8.txt的差异正是源于此。2.3 Tomcat 8.5.94Servlet 3.1 兼容性与端口避让项目web.xml声明为version3.1且未使用 Jakarta EE 命名空间仍为javax.servlet故必须使用 Tomcat 8.5.x支持 Servlet 3.1 JSP 2.3。Tomcat 9 已切换至jakarta.servlet会导致ClassNotFoundException: javax.servlet.http.HttpServlet。下载与配置wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.94/bin/apache-tomcat-8.5.94.tar.gz tar -xzf apache-tomcat-8.5.94.tar.gz cd apache-tomcat-8.5.94/conf # 修改 server.xml将默认 8080 改为 8081避免与本地其他服务冲突 sed -i s/port8080/port8081/ server.xml # 修改 context.xml启用 session 持久化防重启丢数据 echo Manager classNameorg.apache.catalina.session.PersistentManager saveOnRestarttrue/ context.xml关键参数说明saveOnRestarttrue确保 Tomcat 重启后考生未交卷的 session 不丢失port8081是为后续 Nginx 反向代理或本地调试留出端口弹性。3. 数据库初始化从 db.sql 到用户权限的完整链路3.1 执行 db.sql 前必须做的三件事db.sql是核心数据脚本但直接source db.sql会失败——它不包含CREATE DATABASE语句且假设用户已存在。必须按顺序执行创建数据库并指定字符集关键否则中文乱码CREATE DATABASE exam CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;创建应用专用用户并授权禁止用 root 连接 Web 应用-- MySQL 5.7 写法 CREATE USER exam_userlocalhost IDENTIFIED BY Exam2024; GRANT ALL PRIVILEGES ON exam.* TO exam_userlocalhost; -- MySQL 8.0 写法需指定插件 CREATE USER exam_userlocalhost IDENTIFIED WITH mysql_native_password BY Exam2024; GRANT ALL PRIVILEGES ON exam.* TO exam_userlocalhost; FLUSH PRIVILEGES;验证用户能否登录并建表mysql -u exam_user -pExam2024 -D exam -e SHOW TABLES; # 应返回空结果集3.2 导入 db.sql 的两种安全方式方式一命令行管道推荐避免编码问题mysql -u exam_user -pExam2024 -D exam --default-character-setutf8mb4 db.sql方式二MySQL 客户端内执行需先USE exam;SET NAMES utf8mb4; SOURCE /path/to/db.sql;注意--default-character-setutf8mb4参数强制客户端与服务端使用统一编码否则INSERT INTO question VALUES (1,单选题,下列...)中的中文可能存为????。若导入后SELECT * FROM user;显示乱码请立即检查my.cnf中[client]和[mysqld]段的default-character-set是否均为utf8mb4。3.3 表结构文档与实际 SQL 的一致性校验数据库表结构设计.doc是 Word 文档而db.sql是可执行脚本。二者必须一致否则前端页面字段会报Unknown column xxx in field list。重点核对三处文档位置SQL 实际字段必须一致项user表 doc 中user_iddb.sql中是否为id INT PRIMARY KEY AUTO_INCREMENTexam_record表 docstart_time DATETIMEdb.sql中是否含DEFAULT CURRENT_TIMESTAMPquestion表 doctype ENUM(single,multi)db.sql中是否用VARCHAR(10)替代了ENUMMySQL 5.7 兼容性考虑若发现不一致优先以db.sql为准修改文档——因为它是真实运行的依据。例如某次部署中文档写answer TEXT NOT NULL而db.sql是answer VARCHAR(1000)导致多选题答案超长被截断考生提交后显示“答案不完整”。4. 项目部署三套代码的选择逻辑与 WAR 包构建细节4.1 为什么必须三选一版本锁死的底层原因1-源项目.zip是原始工程但未适配任何 MySQL 版本2-mysql5的项目.zip和3-mysql8的项目.zip是分别修改后的分支。差异集中在pom.xml中mysql-connector-java依赖版本5.7 分支用5.1.478.0 分支用8.0.28src/main/resources/jdbc.properties中 JDBC URL 参数5.7 分支无allowPublicKeyRetrieval8.0 分支必须有src/main/java/com/xxx/dao/impl/UserDaoImpl.java中密码加密逻辑5.7 分支用MD58.0 分支改用BCrypt因 MySQL 8.0 默认密码哈希强度提升提示不要试图“混搭”——比如用 5.7 的代码连 8.0 的数据库。com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.这类错误就是典型版本错配信号。4.2 构建 WAR 包Maven 打包的四个关键参数项目为 Maven 结构需在对应分支根目录执行# 清理旧包跳过测试毕业设计通常无单元测试 mvn clean package -Dmaven.test.skiptrue # 若提示 “The packaging for this project did not assign a file to the build artifact” # 检查 pom.xml 中 packaging 是否为 war而非 jar # 并确认 buildplugins 下有 maven-war-plugin 配置生成的 WAR 包路径为target/exam-system.war具体名以pom.xml中finalName为准。参数说明-Dmaven.test.skiptrue跳过测试编译避免因缺少测试依赖如 junit 4.12导致打包失败clean强制清除target目录防止旧 class 文件残留引发NoSuchMethodError。4.3 部署到 TomcatWEB-INF/lib 的隐性依赖陷阱将exam-system.war复制到tomcat/webapps/后Tomcat 会自动解压。但需检查WEB-INF/lib/目录必须存在mysql-connector-java-5.1.47.jar5.7 分支或mysql-connector-java-8.0.28.jar8.0 分支不能同时存在两个版本否则类加载器会随机选择一个导致java.lang.NoClassDefFoundError: com/mysql/cj/jdbc/Driver若缺失手动复制对应 JAR 包至此目录再重启 Tomcat验证命令ls -l tomcat/webapps/exam-system/WEB-INF/lib/ | grep mysql # 正确输出应只有一行如mysql-connector-java-5.1.47.jar5. 避坑指南五个高频翻车现场与后悔药5.1 现象首页能打开但登录时提示 “用户名或密码错误”控制台无报错原因数据库user表中password字段存储的是明文或 MD5 加密串但项目代码中UserDaoImpl.login()方法调用了BCryptPasswordEncoder.encode()进行比对。这是 5.7 与 8.0 分支密码策略不一致导致的——5.7 分支用MD5(password)8.0 分支用BCrypt.hashpw(password, BCrypt.gensalt())。解决若用 5.7 分支确保db.sql中INSERT INTO user的密码是MD5(123456)计算结果如e10adc3949ba59abbe56e057f20f883e若用 8.0 分支用在线 BCrypt 工具生成123456的哈希值如$2a$10$KQVZzX...替换db.sql中的密码字段5.2 现象考试页面空白浏览器 F12 查看 Networkexam/list接口返回 404原因web.xml中servlet-mapping的url-pattern与 Controller 类上的RequestMapping注解不匹配。常见于1-源项目.zip其ExamController.java使用RequestMapping(/exam)但web.xml中DispatcherServlet映射为/导致实际访问路径为/exam/exam/list。解决方案一推荐修改web.xml将DispatcherServlet的url-pattern改为*.do并在 Controller 中改为RequestMapping(/exam.do)方案二保持url-pattern为/但 Controller 改为RequestMapping(/exam/list)前端 AJAX 请求地址同步调整5.3 现象MySQL 8.0 下登录成功但进入考试页报java.sql.SQLException: Unknown system variable query_cache_size原因MySQL 8.0 移除了查询缓存Query Cache相关变量但项目jdbc.properties中jdbc.url包含cachePrepStmtstrue等过时参数。解决删除jdbc.properties中所有以cache开头的参数URL 简化为jdbc.urljdbc:mysql://localhost:3306/exam?useSSLfalseserverTimezoneGMT%2B8allowPublicKeyRetrievaltrue5.4 现象Tomcat 启动后访问http://localhost:8081/exam-system重定向到http://localhost:8081/login.jsp但该页面 404原因项目采用Filter实现登录拦截web.xml中LoginFilter的url-pattern配置为/admin/*但实际登录页路径是/login.jsp未被拦截规则覆盖。解决修改web.xmlfilter-mapping filter-nameLoginFilter/filter-name url-pattern*.jsp/url-pattern !-- 改为此行 -- !-- 或更精确url-pattern/login.jsp/url-pattern -- /filter-mapping5.5 现象演示视频中点击“开始考试”弹出试卷但本地部署后点击无反应Console 报Uncaught ReferenceError: startExam is not defined原因exam.jsp中调用的startExam()函数定义在js/exam.js但该 JS 文件路径在2-mysql5的项目.zip中为js/exam.js而在3-mysql8的项目.zip中被移至static/js/exam.jsHTML 中script srcjs/exam.js路径未同步更新。解决检查exam.jsp头部的 script 标签将其改为script src${pageContext.request.contextPath}/static/js/exam.js/script !-- 或根据实际路径调整确保浏览器 Network 面板中该 JS 返回 200 --6. 验证跑通从登录到交卷的全链路自测清单与日志定位法6.1 四步闭环验证每个环节都必须看到预期响应部署完成后不要只点开首页就认为成功。按顺序执行以下四步每步都需观察三个维度浏览器表现、Tomcat 日志、数据库状态。步骤操作预期浏览器表现Tomcat catalina.out 关键日志数据库验证 SQL1. 登录输入 admin/123456跳转至index.jsp右上角显示“欢迎管理员”INFO [http-nio-8081-exec-1] c.x.c.LoginController.login - 用户 admin 登录成功SELECT login_time FROM user WHERE usernameadmin;时间应为当前2. 创建考试管理员后台 → 考试管理 → 新增考试页面提示“添加成功”列表出现新考试DEBUG [http-nio-8081-exec-2] c.x.s.ExamService.addExam - 考试ID: 1001SELECT COUNT(*) FROM exam WHERE name模拟测试;应为 13. 开始考试学生账号登录 → 点击“开始考试”加载试卷页显示题目、倒计时、选项INFO [http-nio-8081-exec-3] c.x.c.ExamController.startExam - 生成试卷ID: 2001SELECT COUNT(*) FROM exam_record WHERE user_id2 AND exam_id1001;应为 1记录考试开始4. 提交试卷点击“交卷”按钮弹出“成绩95分”跳转至成绩页INFO [http-nio-8081-exec-4] c.x.c.ExamController.submitExam - 用户2提交试卷得分95SELECT score FROM exam_record WHERE user_id2 AND exam_id1001;应为 95提示catalina.out日志默认不打印 DEBUG 级别。如需查看 Service 层日志需修改conf/logging.properties将org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level INFO改为DEBUG。6.2 日志定位法三类错误的秒级排查路径当某一步失败时按此顺序查日志90% 问题可 2 分钟内定位第一类HTTP 500 错误服务器内部异常直接搜索catalina.out中Caused by:后的第一行异常类名若为SQLException看前一行SQLState:值08S01是连接超时42S02是表不存在23000是主键冲突若为ClassNotFoundException检查WEB-INF/lib/是否缺失对应 JAR如spring-webmvc-5.2.22.RELEASE.jar第二类HTTP 404 错误资源未找到检查浏览器 Network 面板中请求的Full Path如/exam-system/exam/list对照web.xml中servlet-mapping的url-pattern和 Controller 的RequestMapping确认路径拼接逻辑验证webapps/exam-system/目录下是否存在对应 JSP 或静态资源如exam/list.jsp第三类页面渲染异常空白/乱码/JS 报错浏览器按 F12 → Console 标签复制报错信息如Uncaught TypeError: Cannot read property length of null搜索exam.jsp中调用该属性的 JS 代码检查其依赖的数据是否为空如var questions ${requestScope.questions};需确认后端是否真的 setAttribute 了questions查看 Network → All 标签过滤js、css确认所有静态资源返回 200无 4046.3 终极验证用 curl 模拟全流程脱离浏览器干扰当界面操作不稳定时用命令行绕过前端直击后端接口# 1. 模拟登录获取 JSESSIONID LOGIN_RESP$(curl -s -X POST http://localhost:8081/exam-system/login \ -H Content-Type: application/x-www-form-urlencoded \ -d usernameadmin -d password123456 -i) SESSION_ID$(echo $LOGIN_RESP | grep JSESSIONID | sed -r s/.*JSESSIONID([^;]).*/\1/) # 2. 携带 Cookie 获取考试列表 curl -s -X GET http://localhost:8081/exam-system/exam/list \ -H Cookie: JSESSIONID$SESSION_ID | head -20 # 3. 模拟交卷需构造 JSON curl -s -X POST http://localhost:8081/exam-system/exam/submit \ -H Cookie: JSESSIONID$SESSION_ID \ -H Content-Type: application/json \ -d {examId:1001,answers:[{questionId:1,answer:A},{questionId:2,answer:B}]}如果 curl 返回正常 JSON如{code:200,msg:提交成功,data:{score:95}}证明后端逻辑完全 OK问题一定出在前端资源路径、JS 逻辑或浏览器缓存上。从那以后我每次部署完 Java Web 项目都强制走一遍这四步闭环验证 一次 curl 全流程哪怕只是本地调试——因为线上环境不会给你第二次机会。希望帮到你。本文还有配套的精品资源点击获取