
简介这份资源是面向高校计算机相关专业学生与Java初学者的一套学生成绩管理系统毕业设计完整方案围绕成绩录入、查询、统计与分析等教务核心场景展开帮助读者解决从选题到落地部署的全流程问题。压缩包共9个文件约122.79MB包含4个mp4演示与部署录屏、1个sql数据库脚本、1个doc设计文档、1个zip源代码包及若干说明文本覆盖代码、数据库、文档与视频四类材料。目前已有663人学习下载。读者可借助源码理解MVC分层、JDBC数据库操作、Servlet与JSP请求处理等Java Web关键知识点参照SQL脚本快速还原表结构与数据关系并通过部署视频直观掌握环境配置、服务启动与乱码排查等实操环节适合作为课程设计参考或工程实践练手项目。1. 从一份 Java 毕业设计压缩包说起成绩管理系统到底能跑通什么如果你正在找一份能直接跑起来的 Java Web 毕业设计又不想从零搭环境、写 SQL、调乱码那这个基于 Java 的学生成绩管理系统压缩包值得先看一眼。它把源代码、数据库脚本、部署文档和部署视频一起打包核心功能围绕成绩录入、查询、统计和分析展开技术栈是典型的 Servlet JSP JDBC MySQL 组合IDE 侧适配 Eclipse 或 IntelliJ IDEA服务器用 Tomcat 或 Jetty。适合谁适合需要快速交付毕设、想对照完整项目理解 MVC 分层、或者被“程序访问数据库乱码”卡住的人。下面我按实际拆包顺序把能复现的步骤和容易翻车的地方一次讲清。2. 拆包先看结构代码、SQL、文档、视频各管什么拿到压缩包别急着双击运行先按目录把资源归位。这个包的结构很直白2-代码下是StudentScore.zip3-文档里是学生成绩管理系统文档4-SQL放score.sql5-视频有四个 mp4分别对应系统演示、代码结构、部署运行和乱码处理。很多人一上来就导入项目结果数据库没建、表名对不上控制台直接抛Table xxx doesnt exist这就是没先读 SQL 的代价。2.1 代码包与数据库脚本的对应关系StudentScore.zip解压后通常是一个 Eclipse 动态 Web 项目结构包含src、WebContent或webapp、lib等目录。score.sql是配套的建库建表脚本里面一般会先CREATE DATABASE再建学生表、课程表、成绩表最后插入几条测试数据。关键点在于代码里的 JDBC 连接串、库名、用户名、密码必须和score.sql以及你本地 MySQL 的实际配置一致。常见做法是先把score.sql在 MySQL 客户端里执行一遍确认库和表都出来了再去改代码里的连接参数。-- 先看 score.sql 里有没有指定库名比如 student_score CREATE DATABASE IF NOT EXISTS student_score DEFAULT CHARACTER SET utf8mb4; USE student_score; -- 典型的学生表结构字段名要和 Java 实体类对应 CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, sno VARCHAR(20) NOT NULL UNIQUE, sname VARCHAR(50) NOT NULL, gender VARCHAR(10), class_name VARCHAR(50) ); -- 成绩表通常用外键关联学生和课程 CREATE TABLE score ( id INT PRIMARY KEY AUTO_INCREMENT, sno VARCHAR(20), course_name VARCHAR(50), score DECIMAL(5,2), exam_time DATE );上面这段 SQL 是常见写法实际以score.sql为准。执行时注意字符集如果脚本里写的是utf8而你的 MySQL 8 默认utf8mb4一般不影响建表但插入中文时可能出问题。我一般会先把脚本里的utf8统一改成utf8mb4再执行省得后面查数据发现姓名是问号。2.2 部署文档和视频的正确打开顺序3-文档里的.doc文件通常写明了环境要求、数据库配置、Tomcat 部署步骤。但文档有时和代码版本有细微出入所以更稳的做法是先看5-视频里的01-学生考试成绩系统的演示.mp4确认功能长什么样再看03-项目代码结构以及功能.mp4把包名、类名和数据库表对应起来然后看02-项目的部署运行.mp4跟着走一遍部署最后如果遇到乱码直接看04-程序访问数据库乱码问题.mp4。这个顺序能避免“文档说用 Tomcat 8你装了 Tomcat 10 导致 Servlet 包名从javax.servlet变成jakarta.servlet而报 404”这类版本坑。提示视频文件建议用本地播放器打开不要在线转码播放否则关键配置界面可能糊到看不清。3. 环境搭建与数据库初始化把 JDBC 连接串调通环境这一步决定后面能不能跑重点就三件事JDK 版本、Tomcat 版本、MySQL 连接。这个项目基于 Servlet JSP属于传统 Java Web 技术栈JDK 8 或 11 都能跑Tomcat 用 8.5 或 9 最稳。MySQL 用 5.7 或 8.0 都行但驱动包版本要匹配MySQL 8 需要mysql-connector-java-8.x.jarMySQL 5.7 用 5.1.x 也可以。很多人导入项目后ClassNotFoundException: com.mysql.jdbc.Driver就是驱动包没放进WEB-INF/lib或者版本不对。3.1 导入项目与配置 Tomcat在 Eclipse 里选File - Import - Existing Projects into Workspace指向StudentScore解压后的目录。如果项目没有自动识别为 Web 项目检查.project和.classpath文件是否存在。然后在Servers视图里新建一个 Tomcat 实例把项目添加到服务器。IntelliJ IDEA 的话用File - New - Project from Existing Sources选Web Application: Exploded再在Run/Debug Configurations里配 Tomcat。关键参数Application context一般设为/StudentScore或/看视频里演示的访问路径。# 检查 JDK 版本建议 1.8 或 11 java -version # 检查 MySQL 服务是否启动Windows 下 net start | findstr MySQL # 登录 MySQL 并执行 score.sql mysql -u root -p score.sql上面命令里mysql -u root -p score.sql是把脚本直接灌进数据库适合脚本里已经写好CREATE DATABASE的情况。如果脚本里没有建库语句先手动CREATE DATABASE student_score;再USE student_score;然后source score.sql。执行完用SHOW TABLES;确认表都建好了。3.2 修改 JDBC 连接参数并处理乱码代码里连接数据库的地方通常是一个DBUtil或BaseDao类里面写着url、username、password。把url改成jdbc:mysql://localhost:3306/student_score?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai。注意serverTimezone在 MySQL 8 里必须加否则报The server time zone value ... is unrecognized。characterEncoding建议用utf8或utf8mb4和数据库字符集保持一致。// 典型的 JDBC 工具类片段参数按本地环境改 public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/student_score ?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 你的密码; public static Connection getConnection() throws SQLException { try { Class.forName(com.mysql.cj.jdbc.Driver); // MySQL 8 驱动 return DriverManager.getConnection(URL, USER, PASSWORD); } catch (ClassNotFoundException e) { throw new SQLException(驱动未找到, e); } } }这段代码里Class.forName加载驱动MySQL 8 用com.mysql.cj.jdbc.DriverMySQL 5.7 用com.mysql.jdbc.Driver。serverTimezone设成Asia/Shanghai避免时区报错。如果部署后页面显示中文乱码除了 JDBC 连接串还要检查 JSP 页面顶部有没有% page contentTypetext/html;charsetUTF-8 %以及 Tomcat 的server.xml里Connector有没有加URIEncodingUTF-8。视频04-程序访问数据库乱码问题.mp4讲的就是这个跟着改一遍基本能解决。4. 功能模块与 MVC 分层成绩录入、查询、统计怎么串起来这个系统按 MVC 分了三层模型层是实体类和 DAO视图层是 JSP控制层是 Servlet。成绩录入对应一个AddScoreServlet查询对应QueryScoreServlet统计对应StatScoreServlet。理解这个分层改功能时才知道该动哪个文件。比如要加一个“按班级查平均分”就在 DAO 里写 SQL在 Servlet 里调在 JSP 里展示而不是把 SQL 写到 JSP 里。4.1 Servlet 接收请求与 DAO 执行 SQL以成绩录入为例前端 JSP 表单提交到AddScoreServletServlet 用request.getParameter拿学号、课程、分数封装成实体类再调 DAO 的insert方法。DAO 里用PreparedStatement执行INSERT INTO score ...。这里有个常见坑分数字段用double或BigDecimal接收如果前端传空字符串Double.parseDouble()会抛NumberFormatException所以 Servlet 里要先判空。// AddScoreServlet 核心逻辑注意参数校验 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String sno request.getParameter(sno); String course request.getParameter(course); String scoreStr request.getParameter(score); if (sno null || sno.trim().isEmpty() || scoreStr null || scoreStr.trim().isEmpty()) { request.setAttribute(msg, 学号和分数不能为空); request.getRequestDispatcher(addScore.jsp).forward(request, response); return; } double score Double.parseDouble(scoreStr); Score s new Score(sno, course, score); ScoreDao dao new ScoreDao(); boolean ok dao.insert(s); response.sendRedirect(ok ? queryScore : addScore.jsp); }这段代码里request.setCharacterEncoding(UTF-8)解决 POST 中文乱码PreparedStatement在 DAO 里防 SQL 注入。sendRedirect跳转到查询列表避免刷新重复提交。如果插入失败检查数据库字段长度和类型是否匹配比如score字段是DECIMAL(5,2)你传100.5没问题传1000就超范围。4.2 查询与统计的 SQL 写法查询模块一般支持按学号、课程、班级组合筛选SQL 用动态拼接或WHERE 11加条件。统计模块常见的是算总分、平均分、最高分用GROUP BY和聚合函数。注意在 DAO 里不要用字符串拼接传参否则容易被注入也容易因为单引号报错。-- 按班级统计平均分和最高分 SELECT class_name, AVG(score) AS avg_score, MAX(score) AS max_score FROM score s JOIN student st ON s.sno st.sno GROUP BY class_name; -- 按学号查询个人成绩参数用 ? 占位 SELECT course_name, score, exam_time FROM score WHERE sno ? ORDER BY exam_time DESC;上面第一条 SQL 用了JOIN把学生表和成绩表关联按班级分组。第二条用?占位在 Java 里ps.setString(1, sno)。如果统计结果为空先确认score表里有没有数据再确认sno字段类型和student表是否一致。常见问题是student表里sno是VARCHARscore表里写成了INT关联时隐式转换导致查不到。5. 避坑与排查部署和运行阶段最容易翻车的五件事这个项目本身不复杂但环境差异会让它在不同机器上表现完全不同。下面五条是我拆这类包时最常遇到的每条按现象、原因、解决写照着排查能省不少时间。5.1 启动 Tomcat 报 404项目访问不到现象Tomcat 启动没报错但浏览器访问http://localhost:8080/StudentScore显示 404。原因通常是Application context配错或者web.xml里url-pattern和访问路径不一致。解决在 Tomcat 配置里确认Path是/StudentScore然后看web.xml里servlet-mapping的url-pattern比如登录页可能是/login那访问地址就是http://localhost:8080/StudentScore/login。如果用了注解WebServlet(/login)检查web.xml的metadata-complete是不是true是的话注解不生效。5.2 数据库连接报 Access denied 或 Unknown database现象控制台抛Access denied for user rootlocalhost或Unknown database student_score。原因密码不对或者score.sql没执行库根本没建。解决先用mysql -u root -p登录执行SHOW DATABASES;看有没有student_score。没有就重新执行score.sql。密码不对就改DBUtil里的PASSWORD或者用ALTER USER rootlocalhost IDENTIFIED BY 新密码;改 MySQL 密码。5.3 页面中文乱码数据库里存进去是问号现象JSP 页面显示中文正常但插入数据库后变成???或者查询出来是乱码。原因JDBC 连接串没加characterEncoding或者数据库、表、字段的字符集不是utf8mb4。解决连接串加useUnicodetruecharacterEncodingutf8数据库执行ALTER DATABASE student_score CHARACTER SET utf8mb4;表也改ALTER TABLE score CONVERT TO CHARACTER SET utf8mb4;。Tomcat 的server.xml里Connector加URIEncodingUTF-8。5.4 驱动包版本不匹配ClassNotFoundException现象java.lang.ClassNotFoundException: com.mysql.jdbc.Driver或com.mysql.cj.jdbc.Driver。原因WEB-INF/lib下没有 MySQL 驱动 jar或者驱动版本和代码里写的类名不对应。解决MySQL 5.7 用mysql-connector-java-5.1.x.jar类名com.mysql.jdbc.DriverMySQL 8 用mysql-connector-java-8.x.jar类名com.mysql.cj.jdbc.Driver。把 jar 复制到WEB-INF/lib在 Eclipse 里右键项目Refresh再Project - Clean。5.5 视频里能跑自己跑就报错现象跟着部署视频一步步做视频里正常自己机器上就是不行。原因JDK、Tomcat、MySQL 版本和视频不一致或者系统环境变量没配。解决先对齐版本视频里如果用的是 JDK 8 Tomcat 8.5 MySQL 5.7你就别用 JDK 17 Tomcat 10 MySQL 8。Tomcat 10 的 Servlet 包名是jakarta.servlet老项目用javax.servlet会直接编译不过。要么换 Tomcat 9要么改包名但改包名工作量大换 Tomcat 更省事。注意如果项目里用了javax.servlet而你又必须用 Tomcat 10可以在WEB-INF/lib里加javax.servlet-api兼容包但更推荐直接换 Tomcat 9。6. 进阶用法把这份毕设改成能写进简历的项目如果你不只是想跑通还想拿它当简历项目或继续开发有几个方向可以动手。第一把 JDBC 换成 MyBatis 或 Hibernate体会 ORM 和手写 SQL 的差别第二加一个登录拦截器用Filter或Session控制权限区分管理员和学生角色第三把统计结果用 ECharts 在前端画出来比纯表格更有展示度。这些改动不需要推翻原项目在现有 MVC 结构上增量做就行。6.1 用 Filter 加登录校验在src下新建一个LoginFilter实现javax.servlet.Filter在doFilter里判断session有没有用户信息没有就跳登录页。然后在web.xml里配filter-mapping拦截/addScore、/queryScore等路径。这样直接访问功能页会被拦下来逻辑更完整。public class LoginFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) res; HttpSession session request.getSession(false); if (session null || session.getAttribute(user) null) { response.sendRedirect(request.getContextPath() /login.jsp); return; } chain.doFilter(req, res); } }这段代码里getSession(false)表示没有会话就不新建避免无意义创建。getContextPath()拿到项目根路径保证跳转地址正确。配web.xml时url-pattern/*/url-pattern会拦截所有请求记得放行登录页和静态资源否则登录页自己也进不去。6.2 验证改动是否生效的检查清单改完代码别急着说“好了”按下面几步走一遍先Project - Clean重新编译再重启 Tomcat然后清浏览器缓存或开无痕窗口访问。看控制台有没有SQLException看数据库里数据有没有真的变。如果加了 Filter先访问一个受保护页面确认跳登录登录后再访问确认能进。最后把score.sql重新执行一遍确认脚本本身没有语法错误这样别人拿到你的包也能跑起来。检查项预期结果常见异常项目编译无红叉Build Path 完整缺 jar 包JDK 版本不对Tomcat 启动无报错端口不冲突8080 被占用改 8081数据库连接能查到数据密码错库名错时区错页面访问登录页正常显示404500乱码功能操作增删改查生效SQL 语法错字段类型不匹配这张表可以当部署后的自检清单用每项过了再往下走。我自己的习惯是每次改完 JDBC 参数或 SQL都先把score.sql在干净库上重跑一遍确认脚本能独立建库建表再启动项目。从那以后我每次拿到这类毕设包都强制走一遍“先跑 SQL、再改连接、后启 Tomcat”的顺序基本没再被环境问题卡住。希望帮到你。本文还有配套的精品资源点击获取