
简介基于JavaWeb的作业管理网站源码来自个人毕业设计项目答辩得分95分代码已完成调试与测试下载后即可运行。资源面向计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者尤其适合期末课程设计、课程大作业和毕业设计参考也便于JavaWeb初学者学习项目搭建与代码结构并可根据实际需求二次改动扩展。压缩包共54个文件大小7.73MB包含9个Java源文件、9个JSP页面、7个CSS样式、5个JavaScript脚本以及9个JAR依赖库和数据库配置并附有README介绍文档。前端采用Bootstrap和jQuery界面围绕登录、作业发布、提交、汇总、信息展示等页面展开后端包含作业管理核心逻辑目录划分清晰可快速定位到不同功能模块。目前已有237人学习下载。通过该源码可理解JavaWeb项目分层设计、JSP/Servlet交互、前端资源整合等核心思路整体学习借鉴价值较高。1. 这个作业管理网站源码能帮你省下什么先想清楚再解压学期末的课程设计又到验收节点你手里这个“基于JavaWeb的作业管理网站源码(课程设计).zip”在下载列表里属于最不容易踩雷的那一类功能边界清楚——老师发布作业、学生在线提交、老师批改给分技术栈也是教科书级的 JavaWeb——JSP Servlet MySQL Tomcat。它要解决的是两件事一是让课程设计验收有个能演示的完整站点二是让你在短时间里把 Servlet、JDBC、会话管理这些课内概念落成代码而不是只背概念。但这类源码的坑也藏在“能下载”三个字后面环境版本不匹配、数据库连不上、端口被占、中文乱码任何一个都能让演示现场翻车。适合同等水平人群基础尚可但没独立做过完整项目的在校生以及想快速起步做课程设计的人。本文把一个 JavaWeb 作业管理网站从解压到跑通、再改成自己的东西这条路径完整走一遍该抄的配置直接抄该躲的坑提前躲。2. 跑通 JavaWeb 作业管理系统的环境底座JDK、Tomcat、MySQL 的版本搭配与 IDEA 配置2.1 版本选型为什么 JDK8、Tomcat8.5、MySQL5.7 是最稳妥的组合JavaWeb 课程设计源码最大的特点是对新版本不友好。写这份代码的人当年用的大概率是 JDK8 Tomcat8.5 MySQL5.7 这个组合你手里这台机器如果装了 JDK17 Tomcat10 MySQL8代码大概率没法直接跑。先说 Tomcat10.x 把 javax.servlet 包改成了 jakarta.servlet只差一个字母源码里所有import javax.servlet.http.HttpServlet全部失效IDEA 里满屏飘红。判断方法很简单打开 Tomcat 的 lib 目录看到 servlet-api.jar 说明版本在 9 以下看到 jakarta.servlet-api.jar 说明是 10直接换回 8.5.x 再谈别的。MySQL 版本同样重要。课程设计源码的 lib 下面如果只有老版本的 mysql-connector-java而你的 MySQL 是 8.x 的默认认证插件 caching_sha2_password连接时会报Unable to load authentication plugin换 8.0.x 的驱动再改驱动类名也能用但老代码把驱动类名写死在配置里等于又要多改一处。所以我的建议顺序是驱动 jar 是老的就优先 MySQL 5.7只有 MySQL 8 可用时才考虑换新驱动这条麻烦路。这套组合不是最时髦的却是兼容率最高的一套。你在搜索引擎里搜“idea运行javaweb项目配置”翻出来的教程截图里几乎清一色是 JDK8 Tomcat8.5 的长相黑马javaweb笔记里默认的组合也基本是这个方向。不是大家不更新是这个组合能把你手里的源码以最低成本跑起来。下面这张表是我常用的选型依据组件首选版本理由换了要注意什么JDK8兼容javax.*老代码和各家课程设计 jarJDK9 部分反射接口报错乱报错概率高Tomcat8.5Servlet 3.1 JSP 2.3覆盖绝大部分课程设计Tomcat10 换 jakarta 包名代码要改 importMySQL5.7认证插件兼容老驱动MySQL8 要换驱动并处理时区、SSL 参数mysql-connector-java随源码 lib 自带版本匹配最省事连不上时优先怀疑它而不是怀疑代码动手前先在命令行把现状查清楚再决定要不要补环境java -version mysql --version echo $CATALINA_HOME逻辑说明前两条看 JDK 和 MySQL 的已装版本第三条看系统有没有配置过 Tomcat 的环境变量没有也不影响IDEA 里可以单独指定 Tomcat 目录。如果你的java -version显示的是 17 或 21不一定要重装系统 JDK在 IDEA 里只给这个项目指定 JDK8 即可下载 JDK8 解压到纯英文路径然后在 Project Structure 里新增一个 SDK 指向它别动系统全局配置。2.2 装好 MySQL 并导入数据库建库脚本与字符集设置作业管理网站的库一般不大常见 3~5 张表足够命名一般是 t_user、t_homework、t_submission 这类「t_ 前缀 业务名」。zip 里通常带一个 .sql 文件可能是 init.sql 或 db.sql不要双击运行命令行 source 导入更可控报错也看得清。先建库再导入两步拆开CREATE DATABASE IF NOT EXISTS homework_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE homework_db; SOURCE /path/to/init.sql;参数说明第三行的路径要换成你实际解压出来的 SQL 文件路径注意路径里不要带中文Windows 下容易触发编码问题。utf8mb4是 utf8 的超集中文和 emoji 都能存MySQL 5.7 及以上都支持比直接建库用 utf8 省心。导入成功验证也简单SHOW TABLES; DESC t_user;逻辑说明SHOW TABLES确认表进来了DESC t_user看用户表字段结构能出来列信息说明文件本身没问题。如果报ERROR 1064或ERROR 1366问题多半出在 SQL 文件的字符集或行尾第五章专门讲这个这里先确保表建出来。数据库准备好之后把连接信息在代码里对应上。这类源码的连接配置通常集中在一个 properties 文件里也可能直接写在 JDBCUtils.java搜索关键字jdbc:mysql://或getConnection(就能定位。这个动作做完第三章的配置才有意义。2.3 配置 IDEA 运行环境比黑匣子少一点玄学IDEA 打开工程有两种路径取决于工程里有没有 pom.xml。有 pom.xml 是 Maven 工程右键 pom.xml → Maven → Reload Project等依赖下载完再继续没有 pom.xml 是普通 JavaWeb 工程需要手动把 WEB-INF/lib 下的 jar 全部识别成依赖。具体做法项目结构快捷键 CtrlShiftAltS→ Libraries → 加 lib 目录。这一步漏了后面满屏红字不是代码坏了是依赖没进编译环境。另一个容易忽略的是路径。把 zip 解压到纯英文路径再打开比如D:\javaweb\homework中文路径不是说一定跑不了但课程设计源码问题排查成本本来就高不值得拿玄学赌。如果你在用 macOS 或 Linux记得给 Tomcat 的 bin/catalina.sh 加执行权限不然启动脚本直接 Permission deniedWindows 上则注意把工程从受保护的系统目录拷出来放到非系统盘再操作。到这里环境底座就绪了JDK8 指定给项目、Tomcat 8.5 解压待用、MySQL 建好库并导入了 SQL。这三件事任何一件没做扎实后面跑源码都会以各种奇怪姿势失败。接下来进入真正把 zip 变成站点的一步。3. 把 zip 变成能跑起来的站点导入工程、改数据库配置、在 IDEA 里启动 Tomcat3.1 解压后先认目录src、webapp、WEB-INF 和 sql 文件的约定这类基于 JavaWeb 的课程设计源码多数走经典分层com.xxx.servlet或 controller、service、dao、entity、util 五层。页面放在 webapp 或 WebRoot 下JSP 按角色分文件夹是常见做法比如 student、teacher 目录各放各的页面一眼能看出哪部分是学生端、哪部分是教师端。先别急着点开某个 Servlet把 WEB-INF/web.xml 打开看一眼——这是整个项目的总开关里面注册了哪些 Servlet、默认首页是哪个、有没有编码过滤器一眼可见。Maven 工程和非 Maven 工程的长相完全不同Maven 工程最上层是 pom.xml主代码在 src/main/java页面在 src/main/webapp传统工程最上层是 src、webapp、README 这一类没有 pom.xml 依赖就是 WEB-INF/lib 下的 jar。我一般会先确认这一点因为它决定了后面依赖怎么加载——直接决定 IDEA 会不会满屏红字。还有一个小习惯值得养成zip 下载下来先解压再 File → Open 选目录不要拿着 zip 文件直接让 IDEA 认。如果解压后 IDEA 识别不出来检查是不是多了一层嵌套目录比如解压出的是xxx/xxx/src把内层目录作为工程根打开即可。3.2 改 db.properties连接 MySQL 的四个必改项数据库连接配置通常集中在一个 properties 文件里名字常见的有 db.properties、jdbc.properties 或 database.properties也可能直接在 JDBCUtils.java 里写死。不管放在哪改的无非是下面四个值# db.properties 常见内容库名和密码按你的实际情况改 jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/homework_db?useSSLfalseuseUnicodetruecharacterEncodingUTF-8 jdbc.usernameroot jdbc.password你的密码参数说明homework_db要换成你自己建的库名username和password换成你本机 MySQL 的账号driver这一行在 MySQL 5.7 老驱动时保持com.mysql.jdbc.Driver不变。如果你只有 MySQL 8需要改成下面这样jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/homework_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingUTF-8allowPublicKeyRetrievaltrue逻辑说明MySQL 8 的驱动类名变了新增了时区和公钥检索参数allowPublicKeyRetrievaltrue是连接 MySQL 8 时常见的报错解决方案。另外注意properties 文件里别写中文注释Java 读取 properties 默认用的是 ISO-8859-1中文注释会乱码有些人顺手在密码后面加了中文备注密码本身反而被 IDAE 或工具改坏了这类“明明改对了却连不上”的玄学现场多半就是这么来的。改完先做一次自验写一个几行的测试类调用 JDBCUtils.getConnection()能打印出连接对象就算配置成功。新手最容易在这个地方卡住——IDEA 编译过了运行时报 ClassNotFoundException说明驱动 jar 没进 WEB-INF/lib 或 Maven 依赖没加载完优先补依赖而不是怀疑配置。3.3 在 IDEA 里启动 Tomcat两种工程的配置方式配置 Tomcat 运行目标IDEA 顶部 Run → Edit Configurations → 左上角加号 → Tomcat Server → Local。如果这个选项灰的说明 Application Server 里还没指定 Tomcat 主目录先指向解压后的 apache-tomcat-8.5.x 目录。在 Deployment 标签页把项目加入Application context 填/这样启动后的访问路径就是http://localhost:8080/不会出现带_war_exploded后缀的长路径。启动时关注日志里的这一行看到才算成功INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [1,234] milliseconds逻辑说明没看到 startup 成功信息说明启动中断Tomcat 的 logs 目录下有 catalina.日期.log 和 localhost.日期.log异常堆栈在那里不要盯着 IDEA 控制台前几行就下结论。页面 404 时按两个顺序排查一是 Application context 是否真的设成了/二是 form 表单或链接里的访问路径是否带项目名前缀。老代码习惯写/projectName/servletName如果你把 context 设成/这个路径就会 404统一去掉项目名或者让 context 保持和代码一致二选一。到这里站点已经能打开了能登录、能看页面下一步才是理解它内部的业务组织方式。源码价值不在能跑在你能跟完一条完整请求链路然后改得动它。4. 作业发布、提交、评分是怎么串起来的从 JSP 到 Servlet 再到 DAO 的代码链路4.1 用户与角色学生、教师、管理员怎么共用一张用户表作业管理系统最核心的设计决策是用户表一张表加 role 字段0 管理员、1 教师、2 学生而不是拆成三张表。对课程设计这个体量拆表是过度设计一张表加权限拦截器完全够用。常见的建表语句长这样CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, real_name VARCHAR(50), role TINYINT NOT NULL DEFAULT 2 COMMENT 0管理员 1教师 2学生 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;逻辑说明role 字段决定了登录后跳转到哪个页面、能访问哪些接口password按明文还是 MD5 存取决于源码实现课程设计一般不会做强密码学但你在答辩时能说出来这个设计将来可以换 BCrypt就是一个加分点。登录逻辑是所有 Servlet 里最值得先读的一个WebServlet(/login) public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); String username req.getParameter(username); String password req.getParameter(password); User user new UserDao().findByUsernameAndPassword(username, password); if (user null) { resp.sendRedirect(req.getContextPath() /login.jsp?error1); return; } req.getSession().setAttribute(user, user); if (user.getRole() 1) { resp.sendRedirect(req.getContextPath() /teacher/homeworkList.jsp); } else { resp.sendRedirect(req.getContextPath() /student/homeworkList.jsp); } } }逻辑说明前三行分别是编码、取参数、查数据库查到用户就把 user 对象塞进 session之后所有页面都能从 session 拿当前登录人查不到就回登录页并带一个 error 参数。req.getContextPath()是拿部署路径的规范写法前面说的 404 问题在这样写时不会出现。角色分流是这段代码的灵魂教师端和学生端直接分开跳转。只有登录校验还不够目录级的权限拦截靠过滤器。WebFilter(/teacher/*)拦截所有教师端页面核心逻辑就四行User user (User) request.getSession().getAttribute(user); if (user null || user.getRole() ! 1) { ((HttpServletResponse) resp).sendRedirect(request.getContextPath() /login.jsp); return; } chain.doFilter(req, resp);逻辑说明第一个条件拦截未登录的人第二个条件拦住“学生用 URL 直接访问教师页面”的操作这是验收时经常被老师试探的点。如果这个 filter 只写了登录判断、漏了角色判断那你作为学生登录后直接改 URL 就能进教师后台属于安全漏洞能答出来怎么补就说明你读懂了。4.2 一次作业提交的完整请求链路JSP → Servlet → DAO学生提交作业整条链路是这类项目最核心的部分也是演示时最容易翻车的环节。前端是一个带 enctype 的 form后端是一个处理文件上传的 Servlet再往下是 DAO 和一条 INSERT。前端页面的关键代码form action${pageContext.request.contextPath}/submitHomework methodpost enctypemultipart/form-data input typehidden namehomeworkId value${hw.id} input typefile namefile button typesubmit提交作业/button /form逻辑说明enctypemultipart/form-data是文件上传必需的三处之一另外两处是 method 必须是 post、要有 file 输入框。它带来的副作用是一旦设置了 multipartrequest.getParameter(homeworkId)就永远拿不到值了。这是 JavaWeb 文件上传最常见的坑很多人折腾半天报空指针原因就是没走 multipart 解析器。后端 Servlet 的常见写法如下// 基于 commons-fileupload 的通用写法 DiskFileItemFactory factory new DiskFileItemFactory(); ServletFileUpload upload new ServletFileUpload(factory); upload.setFileSizeMax(10 * 1024 * 1024); // 单个文件最大 10MB ListFileItem items upload.parseRequest(request); String homeworkId null; FileItem uploadFile null; for (FileItem item : items) { if (item.isFormField()) { if (homeworkId.equals(item.getFieldName())) { homeworkId item.getString(UTF-8); } } else { uploadFile item; } } // 后续调用 SubmissionDao.insert(homeworkId, studentId, storedName, originalName)参数说明所有普通表单字段都藏在FileItem列表里isFormField()区分是文本字段还是文件getString(UTF-8)是拿文本字段值的规范写法不传编码容易乱码。setFileSizeMax限制单文件大小防止有人传个大视频把服务器拖垮。写完这段后保存成功要使用sendRedirect而不是forwardforward 是服务器内部转页用户刷新浏览器会重新提交表单造成作业重复入库redirect 之后刷新的是新地址天然避险。这个细节在课程设计答辩中经常被老师追问。4.3 作业文件上传与重命名防止同名覆盖和时间戳方案上传文件最怕两件事同名覆盖和文件名中文乱码。两个学生都传作业.doc如果不重命名后传的人会直接覆盖前一个数据库里那条记录指向的文件就没了。处理方式一句话保存时用系统生成的唯一名原文件名单独存库。核心代码String originalName uploadFile.getName(); // 去掉浏览器可能自动带上的路径 originalName originalName.substring(originalName.lastIndexOf(\\) 1); // 落盘用唯一名展示用原文件名 String ext originalName.substring(originalName.lastIndexOf(.)); String storedName System.currentTimeMillis() _ UUID.randomUUID().toString().replace(-, ) ext; String savePath getServletContext().getRealPath(/upload) File.separator storedName; uploadFile.write(new File(savePath)); // 入库字段homeworkId, studentId, storedName, originalName参数说明时间戳保证同一毫秒内不撞UUID 去掉横线后补一道随机性多线程并发也不会重保留ext后缀是为了下载时能打开很多课程设计栽在“存了文件忘了后缀”。getRealPath(/upload)是传统 JavaWeb 惯用存储位置把文件放到 webapp/upload 下但你要知道它的软肋——Tomcat 清理 work 目录或重新部署时 upload 目录有清空风险答辩时能说出“生产环境应该把 upload.dir 配在 Tomcat 外部”这句话就已经站在源码作者的认知之上了。如果要对提交类型做限制加一个扩展名白名单只允许 doc、docx、pdf、zip、rar其它格式直接拒绝。这个校验放前端做会被绕过放 Servlet 做才是后端该有的态度课程设计阶段做到后端校验已经超过大部分同组作品了。5. 常见翻车点排查版本、编码、端口、时区与数据库的六个血泪经验5.1 Tomcat 启动崩溃先查 web.xml 头与 Servlet 版本匹配现象IDEA 点启动后控制台报LifecycleException: Failed to start component [StandardEngine...]或者提示某个类的 NoSuchMethodError。原因基本在两个方向web.xml 头声明的版本和 Tomcat 版本不匹配或者项目 lib 里混进了 Tomcat 自带 servlet-api 的老版本 jar。解决办法是打开 WEB-INF/web.xml把头改成和 Tomcat 8.5 对应的 3.1?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version3.1逻辑说明这个头配 Tomcat 8.5 最稳如果项目用的是 WebServlet 注解且没有 web.xml通常不存在这个问题。另外排查一遍 lib 目录里有没有 servlet-api.jar 和 jsp-api.jar这两个 jar 必须删掉因为 Tomcat 自己带把它们放进工程就会出现两个实现打架。这是 JavaWeb 项目里出现频率最高的“莫名其妙启动失败”来源没有之一。5.2 中文全是问号请求、响应、数据库连接三处编码要一致现象学生在提交框里输入的中文作业名存进数据库变成??页面上显示也是乱码。原因不是数据库坏了是三处编码不一致请求没按 UTF-8 解码、响应没按 UTF-8 输出、JDBC 连接 URL 没声明 characterEncoding。解决这道题最省事的方式是建一个编码过滤器让所有请求先过一遍WebFilter(/*) public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(UTF-8); resp.setCharacterEncoding(UTF-8); chain.doFilter(req, resp); } }逻辑说明req.setCharacterEncoding(UTF-8)必须在第一次调用getParameter()之前执行否则已经按 ISO-8859-1 解析过中文了后面再设也白搭用 Filter 就是为了保证这个时序。与此同时JSP 页头保持pageEncodingUTF-8数据库连接 URL 带上characterEncodingUTF-8三处对齐中文问题基本绝迹。还有一个细节数据库表本身字段的 charset 也检查一下表建成了 utf8mb4 就没问题建表时用了 latin1 就只能重建表。5.3 导入 init.sql 失败字符集、分隔符和行尾的坑现象用SOURCE导入 SQL 文件时建表到一半报ERROR 1064或者报ERROR 1366 (HY000): Incorrect string value。原因通常有三个SQL 文件是 GBK 编码但建库用了 utf8mb4SQL 文件里有中文注释造成的解析错乱或者表定义里没有显式指定字符集。解决路径用文本编辑器打开这个 .sql另存为 UTF-8 无 BOM 编码把文件里中文注释删掉或改成英文建表语句的表尾加一行默认字符集CREATE TABLE t_homework ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, content TEXT, teacher_id INT, deadline DATETIME ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;逻辑说明最后一行DEFAULT CHARSETutf8mb4是兜底MySQL 5.7 的默认字符集可能是 latin1不声明就按默认建表中文存不进去。Windows 上还有一个隐藏坑SQL 文件如果是 UTF-8 带 BOM部分 MySQL 版本会把 BOM 当作第一个字段的一部分报错信息根本看不出来直接无 BOM 保存能消掉。这个排查路径经历过一次后面导入任何 SQL 都有后悔药可吃。5.4 驱动类找不到或拒绝连接mysql-connector-java 版本与驱动类名不匹配现象运行时报ClassNotFoundException: com.mysql.jdbc.Driver或Unable to load authentication plugin caching_sha2_password。前者是驱动 jar 没进 WEB-INF/lib 或 Maven 依赖缺失后者是驱动版本太老碰上 MySQL 8。解决时先区分环境MySQL 5.7 用com.mysql.jdbc.DriverMySQL 8 必须换com.mysql.cj.jdbc.Driver且驱动 jar 升级到 8.0.x。这个报错信息里的两个类名只差一个.cj.但它们的兼容边界完全不同改配置时最容易改错位置——改错成com.mysql.cj.jdbc.Driver配老 jar照样报 ClassNotFoundException。如果确认驱动 jar 没问题还报Access denied for user rootlocalhost那八成是密码和账号的问题别怀疑代码。到这一步时要养成一个习惯先在命令行用同样的账号密码连一次 MySQL能连上再回来看代码把环境问题和代码问题在第一步就分开能节约大量排查时间。5.5 端口被占用与热部署失效8080 不一定是你的现象IDEA 启动 Tomcat 报Port 8080 was already in use或者改了 Java 代码重新部署后页面还是旧效果。前者很好理解某个早就跑着的进程占了 8080后者是因为 Tomcat 进程根本没杀掉IDEA 里的旧实例还活着你改的代码没被真正加载。解决办法Windows 命令行敲netstat -ano | findstr 8080 taskkill /PID 你的进程号 /F逻辑说明第一行查出占用 8080 的进程号第二行强制结束。macOS/Linux 用lsof -i :8080看占用然后kill。如果 8080 是别的系统服务占用的不想杀它就在 IDEA 的 Run Configuration 里把 HTTP port 改成 8081Tomcat 配置文件 conf/server.xml 里也能改。至于热部署失效我一般会养成一个习惯改完 Java 代码后手动点一下重启按钮而不是依赖 Tomcat 自动 reload——IDEA 对 JSP 的热部署相对可靠Java 代码的热部署在传统 Web 工程里经常翻车多花五秒重启一次比等到演示现场再发现问题划算得多。5.6 时区与 SSL 报错MySQL 8 的 URL 里必须带的两个参数现象连接 MySQL 8 时控制台报The server time zone value Öйú±ê׼ʱ¼ä is unrecognized or represents more than one time zone。这段乱码其实是“中国标准时间”被错误解码之后的显示核心信息是MySQL 8 的驱动要求连接时显式指定时区不指定就报错。解决方式是在连接 URL 里追加参数jdbc.urljdbc:mysql://localhost:3306/homework_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingUTF-8allowPublicKeyRetrievaltrue参数说明serverTimezoneAsia/Shanghai解决时区报错useSSLfalse关闭 SSL 警告allowPublicKeyRetrievaltrue配合 MySQL 8 的 caching_sha2_password 认证否则可能报 Public Key Retrieval is not allowed。这三个参数是 MySQL 8 连接的默认三件套缺哪个就报哪个错。顺带说一句遇到这类报错先复制完整日志再搜不要只看第一行——第一次见时我以为是中文乱码问题折腾了半小时才发现是时区参数血泪经验。6. 把课程设计改成能交差的作业三个扩展方向加验收自测6.1 能让演示效果明显提升的三个扩展方向代码能跑只是及格想要在答辩时让老师觉得你确实“做过”建议在原有功能上挑一个方向加深。我总结过三个性价比最高的扩展方向。第一个是给作业列表加分页原功能八成是SELECT * FROM t_homework一次性全部查出你把它改成LIMIT offset, pageSize前端加页码按钮这个改动涉及 DAO 和 JSP 两处量小但能讲清楚 SQL 的 limit 语义。第二个是防重复提交前端在提交后把按钮置灰禁用后端在 t_submission 表给 homework_id 和 student_id 加唯一索引双保险能应对“连点两次提交出两条记录”这类现场翻车。第三个是成绩分布可视化老师端新增一个统计页按分数段分组SELECT score, COUNT(*) FROM t_submission GROUP BY score前端拼一个简单的条形图或对接 ECharts演示效果比干巴巴的列表强一个量级。6.2 验收前照着跑的清单与数据验证扩展做再多最终呈现靠的还是主流程稳。我每次演示前会按这张表过一遍走过一条就算数不过就提前修场景操作步骤预期结果教师登录教师账号登录 → 发布一条新作业学生端能看到这条作业页面上有标题和截止时间学生提交学生账号登录 → 上传一个 doc 文件提交成功刷新后不重复插入文件在 upload 目录教师评分教师账号登录 → 打开提交列表 → 打分分数持久化学生端能看到自己的分数和评语权限拦截学生账号直接访问 /teacher/homeworkList.jsp被过滤器拦回登录页而不是看到教师内容流程走完后再用一条 SQL 验证数据确实落库这个习惯能帮你提前发现“页面显示成功但数据库没写”这类隐蔽问题SELECT h.title, s.student_id, s.score, s.submit_time FROM t_submission s JOIN t_homework h ON s.homework_id h.id;逻辑说明这条关联查询把作业、提交记录、成绩和提交时间一次带出来如果查询结果里出现重复记录说明防重复提交没做全如果 score 是 NULL说明评分链路有断层。这个动作一分钟就能完成却能把前面改代码留下的隐患暴露清楚。我自己的教训是每次演示都提前十分钟重启一遍 Tomcat、连一次数据库把主流程从头到尾走完再上台因为出问题的永远是环境而不是逻辑。环境问题永远比逻辑问题先来希望帮到你。本文还有配套的精品资源点击获取