资讯动态

在线答题平台JavaWeb完整实战:环境部署、自动判分与二次开发

发布时间:2026/10/8 16:24:17 来源:尧图企业网站定制
简介面向JavaWeb学习者的在线答题平台完整项目包适用于课程设计、毕业设计或教学实训也可作为初学者的综合参考案例。平台按用户角色分为学生端和教师端学生可在首页答题且仅能操作一次还可修改个人资料与密码并按答题分数查看被分配的班级教师可管理学院、专业、班级、试题及学生信息并在数据统计模块查看总体、地区和班级的成绩统计图。压缩包共388个文件大小约6.1MB主要包含Java源码、JSP页面、JavaScript/CSS前端资源、JAR/XML配置另有125个GIF动图与多张PNG/JPG截图辅助演示界面便于导入IDE后快速理解项目结构与部署调试。已有62人学习下载对想完成JavaWeb项目实践或了解在线教育业务逻辑的开发者有直接参考价值部署后即可体验完整的在线答题流程。1. 在线答题平台这个 JavaWeb 项目到底能用来做什么手头这份「基于javaweb的在线答题平台.zip」拆开来看不是什么黑科技登录注册、题库管理、在线考试、自动判分一套经典的 JavaWeb 完整案例。真正让它有落地价值的是业务闭环——学生端能考试教师端能出题管理员能看数据而不只是教科书里那种只能增删改查的 Demo。它的适用场景很具体培训班结业测验、中小公司内部技能考核、高校老师的随堂考试数据在自己服务器上题型和判分规则也能自己改。适合两类人刚学完 Servlet/JSP/SSM想找一个能跑通全流程的完整项目练手的学生以及业务上确实需要一个内部答题系统、不打算从零写的开发者。读懂它的代价很低二次开发的收益却很高。2. 解压 .zip 之后先摸底框架识别、运行环境与项目结构拿到 zip 的第一步不是急着双击导入 IDEA而是搞清楚这包里到底是什么形态的 JavaWeb 项目。这一步决定了你后面是用 Maven 构建还是直接把 lib 打进 Artifact也决定了你能不能在十分钟内把它跑起来。我最常看到的情况是项目跑不起来的原因一大半不在代码而在环境选型错了。2.1 JDK 8、Tomcat 8.5、MySQL 5.7为什么老 JavaWeb 项目的黄金三角还是这套标题既然叫 javaweb而不是 springboot说明项目大概率是 Servlet JSP JDBC 或者 SSM 的组合。这类项目的运行环境基本被钉死在三件套上JDK 8、Tomcat 8.5、MySQL 5.7。不要一上来就装 JDK 21 和 MySQL 8.4然后发现 Tomcat 版本跟 Servlet 规范对不上或者驱动报错那不是项目的问题是你把新环境套在了旧项目上。JDK 8 是这类老项目的默认底座。Spring、MyBatis、以及大量老版本的 JSP 标签库在 JDK 8 上编译和运行都是最稳的换了 JDK 11 之后很多用反射、用堆内存参数的老代码会出现奇奇怪怪的警告甚至直接起不来。Tomcat 8.5 对应 Servlet 3.1 规范能覆盖绝大多数 javaweb 项目的 web.xml 配置也比老 Tomcat 7 多了更好的连接池性能。MySQL 5.7 在字符集、SQL 模式、驱动兼容这三个维度上都更宽容后面会提到时区坑MySQL 5.7 能少踩一大半。组件推荐版本选择理由JDK1.8老项目编译级别固定SSM 和标签库反射兼容最好Tomcat8.5Servlet 3.1 规范兼容 javax.servletJSP 支持稳定MySQL5.7字符集和 SQL 模式宽容驱动选择空间大IDEA2021.x 之后随意新版 IDEA 对 Maven 和 Tomcat 集成都比较成熟如果手里已经装了新版环境也不是完全不能用但要做好改代码的准备老项目里依赖 javax.servlet 的 jar 包Tomcat 10 已经换成 jakarta.servlet包名不同直接类找不到这个改动量通常比改业务代码还大。所以能退版本就退版本别在环境问题上跟老项目较劲。2.2 从 zip 的结构判断项目形态Maven 还是纯 lib 项目解压之后第一件事是用命令行看一眼目录结构。我一般用 unzip -l 列出压缩包内容比在图形界面里一个一个翻快得多而且能直接看到哪些关键文件存在。unzip -l 基于javaweb的在线答题平台.zip | head -40这个命令把 zip 里的前 40 条文件路径列出来。重点看三个东西第一根目录有没有 pom.xml有就是 Maven 管理没有就是手工导 jar 的普通 Web 项目第二有没有 sql、database、db 这类目录数据库脚本通常在那里没有的话就要去源码里搜 create table第三有没有 WebRoot、webapp 这类 Web 根目录后面的部署路径全靠它。判断逻辑很简单根目录存在 pom.xml依赖由 Maven 下载导入时走 Maven 通道没有 pom.xml只有 src 和 WebRoot依赖全躺在 WebRoot/WEB-INF/lib 下导入后要手动把 lib 目录加进 Module 的 Libraries。再看 lib 下有哪些 jar能看到 spring-webmvc、mybatis说明是 SSM 架构只有 servlet-api、jsp-api 的是纯 Servlet/JSP 项目这类项目学习价值更高因为每一行请求处理逻辑都摆在明面上。这一步别看代码先看包的构成。框架指纹比代码更诚实见过太多把 SSM 和 JSP 混着写、搞得 web.xml 和注解双轨并行的项目了从包结构一眼就能看出它到底想走哪条路。这种项目风格也常见于培训机构配套的 JavaWeb 笔记数据项目Controller 直接写在 Servlet 里工具类统一放 util 包DAO 用原生 JDBC 拼 SQL页面全靠 JSP 渲染。认出这个风格后面调试会省很多力气。2.3 IDEA 运行 JavaWeb 项目的三块默认配置SDK、编码与语言级别摸清结构之后在 IDEA 里做三件最小配置能省掉后面一半的翻车。首先是 Project SDK统一选 JDK 8语言级别也对应 8别选 11 或 17否则老代码里像泛型、语法糖这类写法都可能给你报错。其次是全项目编码设为 UTF-8。IDEA 默认可能用系统的 GBKJSP 页面又是 UTF-8 声明两个一撞页面上全是乱码。设置路径在 Settings → Editor → File Encodings把 Global Encoding、Project Encoding、Default encoding for properties files 三个都改成 UTF-8。如果是 Maven 项目还要顺手做一件事在 Maven 的 settings.xml 里配一个阿里云镜像然后让 IDEA 导入时用这个 settings.xml。javaweb 项目用到的 Spring、MyBatis、连接池这些 jar第一次下载时如果走中央仓库在国内经常卡住项目导入到一半就红一片。配好镜像路径后依赖导入基本几分钟内就能静默完成这一步是 IDEA 运行 JavaWeb 项目配置里的高频操作。这些配置做完项目才能进 IDEA。但别急着点那个绿色三角还有数据库没初始化。3. 从 IDEA 到 Tomcat用最小步骤把一个 JavaWeb 答题系统跑起来导入项目和跑起来是两回事。很多人在导入阶段一路 Next然后点运行浏览器里白屏或者 404就开始怀疑项目有问题。其实 JavaWeb 项目的启动链是固定的先保证编译通过再把打包好的 Artifact 塞进 Tomcat最后让 Tomcat 的连接器监听端口接住浏览器的请求。每一步都有明确可见的反馈别靠猜。3.1 导入 IDEA 的两种姿势Maven 项目与普通 Web 项目Maven 项目走 Import Project选中根目录的 pom.xmlIDEA 会自动识别为 Maven 结构。导入完成后右侧的 Maven 面板会列出依赖树先执行 compile 验证一下。如果依赖全部解析成功target 目录里会出现 classes说明编译通道是通的。普通 Web 项目走 New → Project from Existing Sources选中解压后的根目录一路 NextIDEA 用模块方式加载。这时候需要自己检查 Module 里有没有把 WebRoot/WEB-INF/lib 目录加到依赖里。步骤File → Project Structure → Libraries → 加号 → Java选中 lib 目录。不加的话运行时会报 ClassNotFoundException而且具体报哪个类都不一定因为所有 jar 都没进 classloader。导入后的第一道关卡是编译器检查。右下角构建进度条走完Build 消息窗口里如果有红色错误优先看是不是缺少 jar 包而不是急着改业务代码。javaweb 老项目里最常见的编译报错是 import javax.servlet 找不到原因是 Project Structure 里没引入 Tomcat 的库把 Tomcat 8.5 的 lib/servlet-api.jar 加进 Module 依赖就能解决。这一步是纯环境问题跟项目代码没有半毛钱关系。3.2 初始化数据库先看 SQL 脚本再改连接配置在线答题平台的核心数据是用户、题库、考试记录和成绩表SQL 脚本一般在 sql 目录、database 目录或者项目根目录文件名常见的有 exam.sql、online_exam.sql。找到后用命令行执行最简单的方式mysql -uroot -p --default-character-setutf8 exam.sql加上 --default-character-setutf8 很关键否则 SQL 脚本里的中文题目和选项在导入时会被 MySQL 客户端按乱码写入后面页面上看到的就是问号。执行完后用 mysql -uroot -p 进去查一下表结构SHOW TABLES;正常会看到 user、question、exam、record 这类表。如果一张表都没有检查 SQL 文件头部有没有建库语句。很多脚本开头直接 USE exam_db; 或者 CREATE DATABASE这种情况下你连接的库不对表自然查不到。我的习惯是先在 MySQL 里手动建一个空库指定 utf8mb4 字符集然后执行脚本时指定这个库。CREATE DATABASE exam_system DEFAULT CHARACTER SET utf8mb4; USE exam_system; SOURCE /path/to/exam.sql;接下来是最容易被忽略的一步改数据库连接配置。JavaWeb 项目的连接配置文件名通常是 db.properties、jdbc.properties、application.properties 或 spring-datasource.xml。打开后找到 url、username、password 三件套jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/exam_system?characterEncodingutf8useSSLfalse jdbc.usernameroot jdbc.password123456参数说明url 里的 exam_system 必须和步骤里建库时的名字一致characterEncodingutf8 保证连接字符集正确useSSLfalse 是排除掉老驱动和 MySQL 5.7 之间 SSL 握手的报错。如果项目用的 MySQL 8.x 驱动driver 那行要改成 com.mysql.cj.jdbc.Driverurl 还要带 serverTimezoneAsia/Shanghai否则会报时区错误。这个文件改完后记得确认 IDEA 编译时把它复制到了 classes 目录否则运行时加载的还是旧文件。整套 javaweb 项目完整案例的 MySQL 部分关键动作就这里别在数据库软件上花太多时间做不必要的调优。3.3 配置 Tomcat 并启动Artifact、Context Path 与访问地址这一步是 javaweb 项目从编译到运行的临门一脚。在 IDEA 里打开 Run → Edit Configurations找到 Tomcat Server → Local添加一个本地 Tomcat 实例指向你解压的 Tomcat 8.5 目录。然后在 Deployment 选项卡里点加号选择 Web Application: Exploded把项目模块加进去。Application context 这栏的值决定了访问前缀填 /exam 就通过 http://localhost:8080/exam 访问填 / 就直接访问根路径一般建议填 /exam避免和其他项目冲突。启动时盯住 IDEA 底部的 Tomcat 日志窗口。看到类似 Server startup in [xxxx] milliseconds 的输出说明容器起来了。如果日志停在 Deploying web application archive 然后没有下文多半是项目启动时数据库连接失败等连接超时才会继续报错。此时切回 Tomcat Localhost Log 标签页里面会有具体异常堆栈。如果只是想看服务是否正常也可以在命令行敲一下curl -I http://localhost:8080/exam/返回 200 说明应用已经接住请求返回 404 说明部署路径不对返回 500 说明代码或数据库有问题。启动成功后在浏览器访问 http://localhost:8080/exam 正常情况下会跳到登录页。默认账号密码在 SQL 脚本的 INSERT 语句里通常是 admin/admin123 或 admin/123456用数据库工具查一下 user 表就能确认。第一次登录进去先别急着做考试点开题库管理随便录一道题再删掉走一遍 CRUD确认数据库读写是通的。到这里项目就算真正端到端跑通了。4. 答题系统的核心是怎么实现的抽题、交卷与自动判分跑起来只是第一步。如果你打算二次开发或者面试时被问到这个项目真正需要吃透的是答题业务的三段核心随机抽题、答案提交、自动判分。它们各自独立又通过一场考试的会话串联在一起。我把一条完整的链路拆开讲看完你就能明白这个系统为什么是这么设计的。4.1 从登录到成绩单一场在线考试的完整会话流转一次考试的会话通常这样走用户登录后系统从用户表查出角色如果是学生加载允许参加的考试列表点击开始考试后服务端根据考试规则从题库随机抽取题目生成一张试卷记录返回给前端学生逐题作答前端先把答案暂存在内存里交卷时一次性提交服务端拿到答案列表后逐题判分把得分写入成绩表然后展示成绩单。这里隐藏着一个关键设计什么时候抽题。常见做法是点击「开始考试」时一次性抽完生成试卷快照而不是每刷新一次都重新抽题。否则学生刷新页面就换题目考试就没法做了。对应到表结构一般会有一张试卷表保存本次考试的题目 ID 列表成绩表只存学生的最终答案字符串。两张表通过考试记录 ID 关联这个 ID 是这次会话的主键。表结构里值得注意的三张核心表CREATE TABLE question ( id INT PRIMARY KEY AUTO_INCREMENT, type TINYINT COMMENT 1单选 2多选 3判断, content VARCHAR(500) COMMENT 题干, option_a VARCHAR(255), option_b VARCHAR(255), option_c VARCHAR(255), option_d VARCHAR(255), answer VARCHAR(10) COMMENT 正确答案多选题逗号分隔, score INT DEFAULT 5 ); CREATE TABLE exam_record ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, exam_id INT, paper_snapshot TEXT COMMENT 本次考试的题目ID序列, submit_flag TINYINT DEFAULT 0, create_time DATETIME ); CREATE TABLE exam_result ( id INT PRIMARY KEY AUTO_INCREMENT, record_id INT, user_id INT, question_id INT, user_answer VARCHAR(10), is_correct TINYINT, score DECIMAL(5,2) );设计说明question 表用 option_a 到 option_d 四个固定字段适合选项不超过四个的常规题型answer 字段用字符串存正确答案多选用逗号分隔比如“A,C”这份简洁让判分逻辑好写很多。exam_record.paper_snapshot 存题目 ID 序列是保证刷新不换题的兜底也能避免成绩单追溯不到原始试卷。如果你把这份 SQL 脚本导入后准备改表结构建议保留这三张表的原字段因为后面所有业务逻辑都围绕它们展开。4.2 随机抽题从 order by rand() 到按比例分层抽题最简单的抽题方式是 ORDER BY RAND()一条 SQL 就能搞定。在题库量小、并发低的老项目里这种做法完全够用SELECT id, content, option_a, option_b, option_c, option_d, answer, score FROM question WHERE type 1 ORDER BY RAND() LIMIT 20;参数说明type 1 表示只抽单选题LIMIT 20 表示抽 20 道一组。整条 SQL 的作用是随机取 20 道单选题组成试卷的单选部分。ORDER BY RAND() 在数据量超过一万行时会有性能问题因为它会对全表每行生成随机数再排序但答题平台的题库通常几千道完全扛得住没必要在这里提前优化。如果考试规则要求按难度或章节比例抽题就得拆成多条 SQL每条限定一个分组再在代码里合并。比如要求「基础题 40%、中等题 40%、难题 20%」先给 question 表加一个 level 字段然后分别按 level 抽题String sql SELECT id FROM question WHERE type? AND level? ORDER BY RAND() LIMIT ?; // 依次调用 level1 limit8level2 limit8level3 limit4 // 合并成本次试卷的 paper_snapshot这段 Java 代码演示的是分层抽题的调用模式实际项目里通常会写一个 ExamService把抽题结果整理成题目 ID 列表然后序列化成字符串存入 exam_record.paper_snapshot。参数上type、level 是筛选条件LIMIT 的数量由考试规则决定单选多选判断题各自一组保证试卷题型配比稳定。这样做的好处是后期想调整题型比例只用改参数前端配置表不需要改 JAVA 代码。4.3 自动判分三种题型的边界条件最容易翻车判分逻辑是整个系统里最容易写出隐蔽 bug 的地方。单选题就是比对用户答案和正确答案判断题同理一个等号搞定。多选题麻烦一些因为用户的作答顺序可能和标准答案不一致。标准答案是“A,C”用户选了“C,A”字符串比较直接不相等但这明明应该算对。所以判分前必须做规范化和排序处理。我一般把用户答案先按字母排序再和排序后的标准答案比对public double judge(Question q, String userAnswer) { if (userAnswer null || userAnswer.trim().isEmpty()) { return 0; // 未作答直接记 0 分 } String standard q.getAnswer().trim(); if (q.getType() 2) { // 多选题 standard sortAnswer(standard); userAnswer sortAnswer(userAnswer); if (standard.equals(userAnswer)) { return q.getScore(); // 全对给满分 } // 按业务规则漏选给一半错选给 0 if (userAnswer.length() standard.length() standard.contains(userAnswer)) { return q.getScore() / 2.0; } return 0; } return standard.equalsIgnoreCase(userAnswer.trim()) ? q.getScore() : 0; } private String sortAnswer(String answer) { String[] arr answer.split(,); Arrays.sort(arr); return String.join(,, arr); }逻辑说明judge 方法先处理未作答的情况直接给 0避免空指针单选题和判断题用 equalsIgnoreCase 忽略大小写比对多选题先排序再分三种结果——完全匹配给满分、漏选用户答案被标准答案包含但长度更短给一半、错选给 0。sortAnswer 把答案字符串切分、排序、重组保证 “C,A” 和 “A,C” 归一化成同一串字符。参数说明里容易被忽视的是 score 字段的类型。数据库里用 DECIMAL(5,2)Java 里判分返回值用 double多选漏选除以 2 的场景会出现 2.5 分这样的半分支前端展示时用 BigDecimal 做四舍五入别用 double 直接拼接字符串。另一个边界是答案里含有非法字符比如用户提交了“A,B,D,E”而选项只有四个排序后仍然比对不上这个判零就行不用额外做输入清洗。5. JavaWeb 项目落地避坑部署失败、乱码与数据库连接排障跑通和跑顺之间隔着一段排错路。JavaWeb 项目的报错大部分有固定套路下面五条是我在类似项目上踩过或帮别人查过的常见问题每一条都按现象、原因、解决三步写遇到直接照单抓药。5.1 404 无休止Artifact 未部署与 Context Path 没对上现象Tomcat 启动正常日志也没有异常但访问 http://localhost:8080/exam 返回 404。原因Deployment 选项卡里没加 Artifact或者加了但 Application context 填的是 / 而你访问的是 /exam还有一种隐蔽情况项目里写死了 web.xml 的欢迎页路径但页面文件放到了 WebRoot 之外。解决先在 Edit Configurations → Deployment 里确认有 Web Application: Exploded 条目没有就手动加然后核对 Application context 填的是 /exam 还是 /访问地址跟它保持一致。最后看 project structure 里 Web 资源目录有没有设置正确普通项目要确保 WebRoot 被标记为 Web Resource Directory否则 IDEA 打包时不会把 JSP 页面带进 Artifact。直接说结论这种 case 里九成是 Application context 填错一成是 Web 资源目录没设对。改完重新 Build Artifact 再启动别只点 restartIDEA 有时候不会重新打包。5.2 500 页面反复出现ClassNotFoundException 与 jar 包缺失现象首页能进但登录或加载题库时报 500异常堆栈里出现 java.lang.ClassNotFoundException 或 NoClassDefFoundError。原因非 Maven 项目的 jar 包虽然躺在 WebRoot/WEB-INF/lib 下但 IDEA 的 Artifact 构建配置里没有把 lib 目录纳入输出。IDEA 默认只打包编译后的 classes 和 Web 资源不会自动把 lib 打进 WEB-INF/lib。解决打开 File → Project Structure → Artifacts选中项目 Artifact在 Available Elements 里找到 lib 目录右键 Put into /WEB-INF/lib然后重新 Build Artifact。build 完成后去目标目录里看一眼确认 WEB-INF/lib 下有那些 jar 文件。这里有个小技巧改完 Artifact 配置后把 Tomcat 停掉手动删除 target 或 out 目录下的旧 Artifact再重新构建。旧包残留会导致你明明改了配置但跑起来还是旧状态这是 IDEA 里最容易迷惑人的一类问题。5.3 中文乱码页面问号、数据库问号、请求参数问号现象页面上中文正常但提交的中文题目存进数据库变成 ??或者 JSP 页面本身显示乱码或者请求参数里的中文在服务端拿到乱码。原因三个环节只要有一个不一致就会乱JSP 文件编码、Tomcat 的 URI 编码、数据库连接串的编码。常见组合是老项目 JSP 页面是 GBK而 IDEA 里默认写了 UTF-8编译出来两层皮或者连接串没带 characterEncodingutf8。解决统一到 UTF-8。JSP 头部 pageEncodingUTF-8 保持不动Tomcat 的 server.xml 里给 Connector 加 URIEncodingUTF-8数据库连接串加 characterEncodingutf8。改完三个地方清缓存重进。这里有个小技巧在 IDEA 里把 File Encoding 全部改成 UTF-8 后要把已经打开的 JSP 文件关闭再重开否则编辑器里显示的还是旧解码结果。如果你改完连接串后乱码还在执行下面这条 SQL 确认数据库表本身的字符集SHOW CREATE TABLE question;如果表定义里出现 DEFAULT CHARSETgbk那就得把表也转成 utf8mb4只改连接串治标不治本。这一条最容易忽略因为很多 SQL 脚本在建表语句里没显式写字符集直接继承了数据库级别的默认设置。5.4 数据库连接失败驱动 5 和 8 的差异与时区、SSL 三连坑现象启动时控制台刷出 Cannot create PoolableConnectionFactory 或者 Communications link failure连接串没问题但怎么都连不上。原因驱动版本和 MySQL 版本不配套。com.mysql.jdbc.Driver 是 MySQL 5.x 时代的驱动配 MySQL 8.x 会报 SSL 或时区错误反过来用 com.mysql.cj.jdbc.Driver 连 MySQL 5.7虽然能跑但也会偶尔因为默认参数打印一堆警告。还有小概率是连接串里把 localhost:3306 写成了 127.0.0.1:3306本机 IP 解析出现 IPv6 优先导致连接慢。解决先确认 MySQL 版本如果是 MySQL 5.7保持 com.mysql.jdbc.Driver 并加 useSSLfalse如果是 MySQL 8.x把驱动类换成 com.mysql.cj.jdbc.Driverurl 加 serverTimezoneAsia/Shanghai。改完连接串要重新编译特别注意 properties 文件有时候没被复制到 classes这是很多人改了没生效的原因。每次遇到启动报数据库错误我先在命令行手动执行一遍 mysql -uroot -p -e SELECT 1 确认数据库和密码本身没问题再接项目。这一下能排除掉一半的数据库问题剩下的再交给驱动和时区参数处理。5.5 启动卡住或端口占满连接池初始化和 8080 被抢现象Tomcat 启动日志停在某个 datasource 初始化行几分钟后才报错或者点启动直接提示 Port 8080 is already in use。原因8080 端口被其他 Java 进程占用常见是之前启动过没关干净的 Tomcat 还在后台跑连接池初始化失败会阻塞部署因为 Spring 容器在启动时就要拿到 DataSource。解决端口被占用时在命令行执行 netstat -ano | findstr 8080macOS 用 lsof -i :8080找到 PID 后结束进程或者把 Tomcat 的 HTTP 端口在配置里改成 8081。连接池卡住的情况先去 MySQL 里执行 SELECT 1 确认数据库服务本身活着再回看上一节的驱动和时区配置基本都是那边的问题。查完这两处启动一般就顺畅了。如果还卡把 Tomcat 的日志级别调成 DEBUG看它卡在哪个类上。JavaWeb 老项目的启动时长超过十秒通常不是性能问题而是某个资源等待超时日志里的最后一行就是罪魁祸首。6. 二次开发加分项多角色登录、限时考试与冒烟验证项目跑通只是开始把通用答题平台改造成自己能用的考试系统才算把这份 zip 的价值吃到嘴里。我建议优先做三个改动投入小、见效快。6.1 用户体系改造从一张用户表到三角色权限如果项目里只有一个 user 表登录后所有功能都开放第一步就是加角色字段。最简单的方式是在 user 表加 role TINYINT1 学生、2 教师、3 管理员登录成功后在 session 里存角色然后写一个简单的拦截器过滤受保护的路径。这一步改动不大但能让系统从「能答题」变成「能考也能管」。6.2 限时考试与自动交卷的兜底逻辑前端倒计时到零自动提交是保障体验服务端还要有兜底。后端在考试记录表加 start_time 和 duration 字段判分时先校验时长超过限制就强制只统计已提交的答案。关键代码如下long expireTime startTime.toEpochMilli() duration * 60 * 1000L; if (System.currentTimeMillis() expireTime) { record.setSubmitFlag(1); // 标记超时交卷 request.setAttribute(timeout, true); }这段代码的意思是把考试开始时间加上时长转成过期时间戳当前时间晚于它就强制交卷。参数 duration 单位是分钟乘 60 再乘 1000 变成毫秒。6.3 冒烟验证改完跑一遍用例就够了改造完按下面的用例快速验证一遍别等上线了才发现老师端功能没放开。用例操作预期结果登录权限学生登录后访问教师页面返回无权限提示限时考试把 duration 设为 1 分钟等待 1 分钟自动交卷成绩正常记录乱码回归题库录入中文标题页面和数据库都正常显示随机抽题同一考试连续进入两次paper_snapshot 不一致最后我自己的习惯是改完这种老项目之后先把 lib 和 Artifact 清理一遍再跑一次冒烟。当年接手这类 javaweb 项目时吃过的亏大多是环境依赖飘忽不定而不是业务逻辑。建议你保留好原始 zip 备份每一次大改动前留下恢复点改坏了不至于没有后悔药。这个方向值得投入一套跑在自己服务器上的答题系统在培训机构和学校里的复用频率远高于你最初想象。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑