简介这是一套面向高校课程设计、毕业设计与Java Web入门进阶的完整学生成绩管理系统源码包基于JSP、Servlet、JDBC与MySQL实现并引入MD5加密算法覆盖学生、教师、管理员三类角色。学生端支持考勤管理、请假、选课、成绩查询与个人信息修改教师端在此基础上增加请假审核、选课与班级课程信息管理、成绩录入及导入导出、可视化成绩统计管理员端额外提供教师管理功能。资源共93个文件包含24个java源文件、24个class、21个jsp页面、6个jar依赖以及sql脚本、properties配置、xml描述和一份doc说明文档压缩包约1.7MB代码完整且注释详细。项目对操作系统、JDK、Tomcat与MySQL版本均较宽容推荐JDK1.8、Tomcat8.0与MySQL8.0以下Eclipse或IDEA均可导入运行。目前已有1488人学习下载适合需要一套可直接运行、便于二次开发与答辩演示的JavaEE综合案例的读者参考。1. 从一份 10072 号 JavaEE 课设包说起它到底能跑出什么如果你正在带 JavaWeb 课程设计或者自己需要交一份能演示、能答辩、能改的学生成绩管理系统那这份 10072 号资源包大概率能省掉你从零搭架子的一周时间。它不是那种只有几个 JSP 页面的半成品而是基于 JSP Servlet JDBC MySQL 的完整三层结构项目带 MD5 加密、学生/教师/管理员三种角色、成绩导入导出和可视化统计。解压后能看到.project、.settings、src、build、WebContent、.classpath和ssms.sql外加一份代码说明.doc说明作者是按 Eclipse 动态 Web 项目组织的导入 IDEA 或 Eclipse 都能接着改。适合谁课程设计赶工期的人、想拿一个真实 CRUD 项目练手 Servlet 流程的人、以及需要一份带数据库脚本的 JavaWeb 参考实现的人。下面我按“先跑起来、再拆结构、最后避坑”的顺序把这份包拆开讲透。2. 把 ssms.sql 灌进 MySQL建库、导表与 JDBC 连接参数怎么对齐2.1 先看数据库脚本里有什么再决定字符集和版本拿到ssms.sql之后别急着source先花两分钟看头部。常见做法是用文本编辑器打开确认CREATE DATABASE语句里的库名这份包一般叫ssms或student_score再看ENGINEInnoDB和DEFAULT CHARSET。如果脚本里写的是utf8而不是utf8mb4在 MySQL 8.0 下导入通常没问题但如果你后面要存中文姓名和课程名建议手动把建库语句改成utf8mb4否则某些生僻字会变成问号。摘要里写“推荐 mysql8.0 以下”实际原因是老脚本里的utf8在 8.0 默认排序规则下偶尔会报Unknown collation遇到就改utf8_general_ci为utf8mb4_general_ci。导入命令我一般这样走# 先登录 MySQL确认版本和默认字符集 mysql -u root -p -e SELECT VERSION(); SHOW VARIABLES LIKE character_set_server; # 创建库并指定字符集避免脚本里没写全 mysql -u root -p -e CREATE DATABASE ssms DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 导入表结构和初始数据 mysql -u root -p ssms ssms.sql # 验证三张核心表是否到位 mysql -u root -p ssms -e SHOW TABLES; SELECT COUNT(*) FROM student;逻辑说明第一条命令确认服务端字符集防止导入后中文乱码第二条手动建库比依赖脚本更稳第三条把ssms.sql灌进去第四条检查student、teacher、course、score这些表是否存在。参数上-u root -p换成你自己的账号库名以脚本里实际写的为准。如果导入时报ERROR 1067 Invalid default value多半是脚本里用了0000-00-00这种旧日期默认值在 MySQL 5.7 以上需要开NO_ZERO_DATE兼容模式或者直接把那几列的默认值改成NULL。2.2 改 JDBC 配置别让连接串成为第一个翻车点数据库进去之后下一步是找到项目里的 JDBC 配置文件。这份包通常把连接信息放在src下的db.properties或某个DBUtil.java里。用 IDEA 打开后按CtrlShiftF全局搜jdbc:mysql能直接定位。常见配置长这样# src/db.properties 常见写法 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/ssms?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password你的密码逻辑说明com.mysql.cj.jdbc.Driver是 MySQL 8.0 连接器的新驱动类名如果你用的是 5.x 的mysql-connector-java要改成com.mysql.jdbc.Driver否则启动就报ClassNotFoundException。serverTimezoneAsia/Shanghai是 8.0 连接器必须带的参数不带会抛The server time zone value is unrecognized。useSSLfalse只是本地调试省事生产别这么干。改完配置后把mysql-connector-java的 jar 放进WebContent/WEB-INF/lib并在 Eclipse 的 Build Path 或 IDEA 的 Project Structure 里确认它被加进 Artifacts否则 Tomcat 启动时照样找不到驱动。2.3 部署到 Tomcatcontext path 和端口要对上部署这一步Eclipse 用户直接右键项目 Run on ServerIDEA 用户走 Run → Edit Configurations → Tomcat Server → Local在 Deployment 里加 Artifact。关键参数是 Application context默认可能是/ssms或/StudentScoreManagerSystem。启动后访问http://localhost:8080/ssms/login.jsp如果 404先看 Tomcat 日志里项目有没有真正 deploy 成功再看 context path 是不是被 IDE 改成了别的。摘要说“tomcat 版本不限推荐 Tomcat8.0”实际 Tomcat 9 和 10 也能跑但 Tomcat 10 把javax.servlet换成了jakarta.servlet这份老包大概率编译不过所以别用 Tomcat 10选 8.5 或 9.0 最稳。3. 拆开 src 看三层结构Servlet、DAO、JSP 各自管什么3.1 包结构决定你改代码时会不会迷路导入项目后先看src下的包名。这类课设常见分层是com.ssms.servlet、com.ssms.dao、com.ssms.entity、com.ssms.util。entity里是Student、Teacher、Course、Score这些 POJO字段和数据库表一一对应dao里是StudentDao、ScoreDao这类类每个方法对应一条 SQLservlet里是LoginServlet、ScoreServlet、AttendanceServlet负责收参数、调 DAO、转发 JSP。理解这个分层之后你要加功能就知道该动哪一层加字段先改 entity 和表加查询先写 DAO 方法加页面交互再写 Servlet 和 JSP。3.2 登录与 MD5密码不是明文存的摘要里明确写了“加入了 MD5 的加密算法”。在LoginServlet或UserDao里搜MD5或DigestUtils能看到密码校验逻辑。常见实现是用户注册或初始化时把明文密码用 MD5 转成 32 位十六进制串存进user表登录时把输入的密码同样 MD5 一次再和库里的比对。下面是一段典型的工具类写法// com.ssms.util.MD5Util public static String md5(String plainText) { try { MessageDigest md MessageDigest.getInstance(MD5); byte[] digest md.digest(plainText.getBytes(StandardCharsets.UTF_8)); StringBuilder sb new StringBuilder(); for (byte b : digest) { // 转成两位十六进制不足补零 sb.append(String.format(%02x, b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(MD5 算法不可用, e); } }逻辑说明MessageDigest.getInstance(MD5)拿到摘要实例digest得到 16 字节循环里%02x保证每个字节输出两位十六进制。参数上StandardCharsets.UTF_8要和数据库字符集一致否则同一密码在不同环境算出的串不同。注意 MD5 现在只适合课设演示真实项目要换 BCrypt 或加盐但这份包作为学习用途理解“不存明文”这个意识就够了。3.3 成绩导入导出与统计POI 和 ECharts 在哪教师角色里有“成绩导入导出”和“成绩统计可视化展示”。导入导出一般用 Apache POIScoreServlet里会有importExcel和exportExcel两个方法前者用WorkbookFactory.create(file.getInputStream())读上传的 xlsx逐行解析后批量insert后者用XSSFWorkbook建表头、填数据、写进response.getOutputStream()。统计可视化常见做法是 Servlet 查出各分数段人数转成 JSON 后交给 JSP 里的 ECharts 渲染。你如果要改统计维度先改 DAO 里的group by语句再改前端option里的series.data两边字段名要对上否则图表空白。4. 角色权限与考勤请假三个身份的数据边界在哪4.1 学生、教师、管理员的功能差异摘要写得很清楚学生有考勤管理、请假、选课、查询成绩、修改个人信息教师有考勤管理、请假审核、选课信息管理、学生信息管理、班级信息管理、课程信息管理、成绩管理、导入导出、统计管理员比教师多一个教师管理。落到代码里权限控制通常靠 session 里存的role字段。登录成功后session.setAttribute(role, student)每个 Servlet 开头判断if (!teacher.equals(role))就跳回登录页。你如果要加“辅导员”角色就在user表加一个 role 值然后在每个 Servlet 的权限判断里补分支别忘了 JSP 里的菜单也要同步隐藏。4.2 请假审核的状态流转请假功能是一个典型的状态机学生提交 → 状态pending教师审核 → 通过变approved驳回变rejected。数据库里leave表一般有status、apply_time、approve_time、approver_id几个字段。审核 Servlet 里常见写法是先update leave set status?, approve_timenow(), approver_id? where id?再重定向回列表。坑在于如果学生重复提交同一时间段的请假代码里没做唯一性校验就会插多条。你可以在 DAO 的insert前加一条select count(*) from leave where student_id? and statuspending有就拒绝。4.3 选课与成绩的关联选课表course_selection通常存student_id、course_id、select_time。成绩表score存student_id、course_id、score。教师录入成绩时要先确认该学生已选这门课否则会出现“没选课却有成绩”的脏数据。常见做法是在ScoreDao.insert前查一次选课表或者在数据库层加外键约束。这份包如果没加外键你手动补一条ALTER TABLE score ADD CONSTRAINT fk_score_selection FOREIGN KEY (student_id, course_id) REFERENCES course_selection(student_id, course_id);能省掉后面很多对账麻烦。5. 避坑与排查导入这份包最容易翻车的五个地方5.1 现象Tomcat 启动报 ClassNotFoundException: com.mysql.jdbc.Driver原因项目里用的是旧驱动类名但你放的 jar 是 MySQL 8.0 的连接器类名已经变成com.mysql.cj.jdbc.Driver。解决要么把db.properties里的 driver 改成com.mysql.cj.jdbc.Driver要么换回 5.1.x 的mysql-connector-java。改完记得 clean 一下项目让 class 重新编译。5.2 现象页面中文全是乱码原因JSP 页面的pageEncoding、数据库字符集、JDBC 连接串三处不一致。解决JSP 头部统一写% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %数据库建库用utf8mb4JDBC url 带useUnicodetruecharacterEncodingutf8。三处对齐后重启 Tomcat乱码基本消失。5.3 现象登录后点任何菜单都跳回登录页原因session 超时或者权限判断写反了。先看web.xml里的session-config默认 30 分钟课设演示够用。再看 Servlet 里的判断常见错误是if (role teacher)用了比较字符串应该用teacher.equals(role)。改完重新登录即可。5.4 现象成绩导入 Excel 后数据库里多出空行原因POI 解析时没跳过空行或者row.getCell(0)为 null 时没判断。解决在循环里加if (row null || row.getCell(0) null) continue;并且对每个 cell 用DataFormatter转字符串避免数字格式读成1.0这种。5.5 现象ECharts 统计图空白控制台无报错原因Servlet 返回的 JSON 字段名和前端option里的name/value对不上或者没设置response.setContentType(application/json;charsetUTF-8)。解决先在浏览器直接访问统计接口 URL看返回的 JSON 结构再对照 JSP 里series.data的取值路径。加上 contentType 后中文也不会乱。6. 二次开发与验证把课设改成能写进简历的项目6.1 先跑通再改验证清单走一遍拿到包之后我习惯按这个顺序验证导入数据库 → 改 JDBC → 部署 Tomcat → 用管理员登录 → 建一个教师 → 用教师登录 → 建课程、录成绩 → 用学生登录 → 选课、查成绩 → 导出 Excel → 看统计图。这一圈走完说明核心链路是通的。任何一步卡住回到第 5 章对号入座。验证通过后再动代码否则你分不清是原包的问题还是自己改出来的问题。6.2 加一个“成绩预警”功能练手想让它更像真实项目可以加一个成绩预警在ScoreDao里加方法查某学生不及格课程数超过 2 门就在学生首页弹提示。代码大致这样// ScoreDao 里新增 public int countFailedCourses(int studentId) { String sql SELECT COUNT(*) FROM score WHERE student_id ? AND score 60; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, studentId); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { return rs.getInt(1); } } } catch (SQLException e) { e.printStackTrace(); } return 0; }逻辑说明用PreparedStatement防注入try-with-resources自动关连接。参数studentId从 session 里取。然后在学生首页 Servlet 里调这个方法把结果塞进 requestJSP 里判断大于 2 就显示红色提示。这个改动小、见效快答辩时也能讲出“数据驱动预警”的思路。6.3 用 Git 管起来别再用“最终版2”命名最后说个习惯解压后第一件事是git init把原始包提交一次之后每改一个功能提交一次。这样改崩了能回滚也方便对比自己改了哪些文件。我见过太多人把课设改成ssms_final_v3_真正最终.zip最后自己都不知道哪份能跑。从那以后我每次拿到这种资源包都强制先建仓库再动手。希望帮到你。本文还有配套的精品资源点击获取