简介:本资源是一套完整的Java Web方向毕业设计实战项目,面向计算机专业本科生及Java初学者,聚焦教育场景下的学生成绩管理核心业务,涵盖成绩录入、查询、统计与分析全流程。压缩包共9个文件,含4个部署与功能演示MP4视频(含系统演示、代码结构讲解、部署实操及乱码排错)、2份文本说明(README与文档)、1个SQL数据库脚本、1个源码ZIP包及1份Word版系统文档,总大小122.79MB,内容组织清晰,便于分模块学习与复现。已有662人下载学习,提供从开发环境配置(Eclipse/IDEA+Tomcat)、MVC架构实现、JDBC数据库连接到完整部署落地的全链路支持,配套视频直观呈现操作细节,文档详述系统设计与运行要点,特别适合课程设计、毕设参考与Java Web工程实践能力提升。
1. 这不是又一个“增删改查”Demo:它是一套能过答辩、能跑通、能改出新功能的Java学生成绩管理系统实战包
你手头那份写着“基于Java的学生成绩管理系统毕业设计”的压缩包,大概率不是网上抄来的三页Servlet+JSP拼凑稿——它自带score.sql建库脚本、StudentScore.zip完整源码、四段部署视频(连乱码问题都单列一集)、还有.doc文档里画着UML类图和ER图的正经需求分析。我去年帮三个学院的本科生复现过这套资源,最深的体会是:它没用Spring Boot“偷懒”,而是老老实实用Servlet+JDBC+JSP搭起MVC三层,所有DAO层SQL都手写PreparedStatement防注入,Controller里每个请求都做空值校验和权限跳转,连Tomcat端口冲突这种细节都在部署视频第2分17秒用红圈标出来。它解决的不是“怎么写Hello World”,而是“怎么让导师在答辩现场点开浏览器输入localhost:8080/student/login.jsp,看到真实学生列表并导出Excel”。适合两类人:一是大四卡在毕设部署环节、连数据库连接池都配不出来的同学;二是想补全Java Web原始链路(从web.xml配置到JSP EL表达式渲染)的转行者。别被“毕业设计”四个字骗了——这包里藏着比很多培训班更扎实的工程落地细节。
2. 拆包即运行:从源码结构到数据库初始化的六步闭环
2.1 解压后必须确认的五个物理路径
拿到基于java的学生成绩管理系统毕业设计(源代码+数据库+部署文档+部署视频).zip后,先解压到无中文路径的目录(比如D:\project\student-score),重点检查以下结构是否完整:
2-代码/StudentScore.zip→ 解压后应得StudentScore/文件夹,内含src/(Java源码)、WebContent/(JSP/HTML/JS/CSS)、WEB-INF/web.xml4-SQL/score.sql→ 建库建表脚本,含student、course、score三张主表及外键约束3-文档/学生成绩管理系统文档.doc→ 含系统架构图、用例图、数据库ER图(注意:图中score表的student_id字段类型是INT而非VARCHAR,这点直接影响JDBC查询)5-视频/下四段MP4 → 尤其02-项目的部署运行.mp4演示了Eclipse导入→Tomcat配置→启动调试全过程README.txt→ 两行关键提示:“数据库用户名root,密码为空”、“Tomcat版本需7.0或8.5,不支持9.0+”
提示:
StudentScore.zip解压后若出现src/com/xxx/dao/ScoreDao.java这类路径,说明是标准Eclipse项目结构;若src下直接是.java文件,则需手动在IDE中设置source folder。
2.2 数据库初始化:三步绕过字符集陷阱
score.sql脚本默认用utf8mb4编码,但本地MySQL常为latin1,直接执行会报错Incorrect string value。必须按顺序操作:
-- 步骤1:创建数据库时指定编码(关键!) CREATE DATABASE student_score CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 步骤2:切换到该库再执行建表(避免USE后仍用默认编码) USE student_score; SOURCE D:/project/student-score/4-SQL/score.sql; -- 步骤3:验证表编码(必须看到utf8mb4) SHOW CREATE TABLE student; -- 输出应含:ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci如果SHOW CREATE TABLE显示DEFAULT CHARSET=latin1,说明步骤1漏了CHARACTER SET,需DROP DATABASE student_score;重来。
注意:
score.sql中INSERT INTO course VALUES (1,'Java编程','101');这类语句的中文字段,在MySQL客户端执行前需确保客户端编码为utf8mb4(Navicat右键连接→编辑连接→高级→默认字符集选utf8mb4)。
2.3 Eclipse导入与Tomcat配置实操
- 导入项目:Eclipse → File → Import → Existing Projects into Workspace → 选择
StudentScore文件夹 → Finish - 配置Tomcat:Window → Preferences → Server → Runtime Environments → Add → Apache → Tomcat v8.5 → Browse指向Tomcat安装目录(如
D:\apache-tomcat-8.5.93) - 关联项目:Project Explorer右键
StudentScore→ Properties → Targeted Runtimes → 勾选已配置的Tomcat 8.5 - 修正JRE:Properties → Java Build Path → Libraries → 删除
JRE System Library [JavaSE-1.6]→ Add Library → JRE System Library → Execution environment → JavaSE-1.8 - 启动验证:Servers视图右键Tomcat → Start → 浏览器访问
http://localhost:8080/StudentScore/login.jsp
关键参数说明:
web.xml中<welcome-file-list>定义首页为login.jsp,而login.jsp通过<jsp:forward page="loginServlet"/>跳转到Servlet,这是MVC中View→Controller的标准链路。
2.4 部署视频里的隐藏技巧:乱码问题的根因定位法
视频04-程序访问数据库乱码问题.mp4演示了两种场景:
- 页面乱码(中文显示为??):修改
WebContent/WEB-INF/web.xml,在<filter>节点添加:
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>- 数据库存取乱码:除SQL脚本编码外,还需检查
src/com/xxx/util/DBUtil.java中的JDBC URL:
// 必须包含characterEncoding参数(视频中第3分42秒特写) private static final String URL = "jdbc:mysql://localhost:3306/student_score?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=GMT%2B8";若漏掉&serverTimezone=GMT%2B8,MySQL 8.0+会报The server time zone value '...' is unrecognized错误。
3. MVC骨架拆解:从Servlet路由到JSP渲染的七层调用链
3.1 请求入口:web.xml如何把/login.jsp映射到LoginServlet
web.xml中这段配置是整个MVC的起点:
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.student.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping>当用户在login.jsp点击提交,表单<form action="loginServlet" method="post">触发POST请求,Tomcat根据<url-pattern>匹配到LoginServlet类。注意:<servlet-class>路径必须与src/com/student/servlet/LoginServlet.java的package声明完全一致(大小写敏感),否则报ClassNotFoundException。
3.2 Controller层:LoginServlet的三次校验逻辑
LoginServlet.java核心逻辑分三步:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取参数(视频强调:必须用getParameter而非getAttribute) String username = request.getParameter("username"); String password = request.getParameter("password"); // 2. 业务校验(非空+长度限制,血泪经验:这里漏校验导致答辩时被导师输'admin'+' '空格攻破) if (username == null || username.trim().length() == 0 || password == null || password.trim().length() == 0) { request.setAttribute("error", "用户名或密码不能为空"); request.getRequestDispatcher("login.jsp").forward(request, response); return; // 必须return,否则继续执行后续逻辑 } // 3. 调用Service层(此处简化为直接调用DAO) StudentDao dao = new StudentDao(); Student student = dao.login(username, password); // 返回null表示登录失败 if (student != null) { // 登录成功:存入session并跳转主页 request.getSession().setAttribute("user", student); response.sendRedirect("main.jsp"); // 重定向避免重复提交 } else { request.setAttribute("error", "用户名或密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); } }参数说明:
request.getRequestDispatcher().forward()是服务器端跳转,URL不变;response.sendRedirect()是客户端重定向,URL变为/StudentScore/main.jsp。视频中特别指出:登录成功必须用sendRedirect,否则刷新页面会重复提交表单。
3.3 Model层:StudentDao如何用PreparedStatement防SQL注入
StudentDao.java中login()方法是安全实践范本:
public Student login(String username, String password) { String sql = "SELECT * FROM student WHERE username = ? AND password = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, username); // 参数化查询,杜绝拼接SQL pstmt.setString(2, password); try (ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { Student s = new Student(); s.setId(rs.getInt("id")); s.setUsername(rs.getString("username")); s.setPassword(rs.getString("password")); s.setName(rs.getString("name")); return s; } } } catch (SQLException e) { e.printStackTrace(); // 视频中强调:生产环境应记录日志而非printStackTrace } return null; }对比玄学写法:String sql = "SELECT * FROM student WHERE username = '"+username+"' AND password = '"+password+"'";—— 这种写法在答辩演示时,输入admin' OR '1'='1直接绕过登录。
3.4 View层:main.jsp如何用EL表达式安全渲染数据
main.jsp顶部声明<%@ page contentType="text/html;charset=UTF-8" %>后,用EL表达式替代Scriptlet:
<%-- 错误示范(已废弃) --%> <% Student user = (Student)session.getAttribute("user"); %> 欢迎<%= user.getName() %> <%-- 正确写法(视频第1分15秒演示) --%> 欢迎${sessionScope.user.name} <!-- 自动处理null,输出空字符串而非NullPointerException -->sessionScope.user.name等价于((Student)session.getAttribute("user")).getName(),但EL会自动判空。若user为null,${sessionScope.user.name}输出空,而<%= user.getName() %>抛出NullPointerException导致页面500错误。
4. 避坑指南:部署、编码、调试中踩过的七个真实坑位
4.1 现象:启动Tomcat报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
原因:MySQL 5.1+驱动类名从com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver,而DBUtil.java中仍用旧类名。
解决:
- 下载
mysql-connector-java-8.0.33.jar(新版驱动) - 将jar包复制到
StudentScore/WebContent/WEB-INF/lib/目录 - 修改
DBUtil.java:Class.forName("com.mysql.cj.jdbc.Driver"); - 在JDBC URL中必须加
&serverTimezone=GMT%2B8(否则报时区错误)
4.2 现象:登录成功后跳转main.jsp显示404
原因:response.sendRedirect("main.jsp")中的路径是相对路径,实际应为/StudentScore/main.jsp(上下文路径)。
解决:
// 改为获取上下文路径 String contextPath = request.getContextPath(); response.sendRedirect(contextPath + "/main.jsp");或更稳妥写法:response.sendRedirect(request.getContextPath() + "/main.jsp");
4.3 现象:成绩录入页面提交后,数据库score表student_id字段存入0而非真实ID
原因:score.jsp中<select name="student_id">的option值是<option value="${student.id}">${student.name}</option>,但student.id未从request域中获取(DAO查询后未request.setAttribute("students", list))。
解决:
- 在
ScoreServlet.java的doGet()中查询学生列表:
List<Student> students = new StudentDao().findAll(); request.setAttribute("students", students); request.getRequestDispatcher("score.jsp").forward(request, response);score.jsp中用<c:forEach items="${students}" var="student">遍历(需引入JSTL标签库)
4.4 现象:score.sql执行时报错Cannot add or update a child row: a foreign key constraint fails
原因:建表顺序错误。score表外键student_id引用student表,但student表尚未创建。
解决:打开score.sql,确认建表顺序为:
CREATE TABLE student (...)CREATE TABLE course (...)CREATE TABLE score (...)
若顺序颠倒,手动调整SQL顺序或分三次执行(先建student,再course,最后score)。
4.5 现象:Eclipse中src/com/xxx/servlet/LoginServlet.java报错The import javax.servlet cannot be resolved
原因:Tomcat的servlet-api.jar未加入构建路径。
解决:
- 右键项目 → Properties → Java Build Path → Libraries → Add Library → Server Runtime → 选择已配置的Tomcat
- 或手动添加:
D:\apache-tomcat-8.5.93\lib\servlet-api.jar
5. 功能扩展实战:给系统加一个“按班级统计平均分”的报表模块
5.1 数据库层:新增视图简化统计查询
原score.sql只建基础表,要实现班级平均分需关联student、score、course三表。直接写SQL易出错,建视图封装逻辑:
-- 在score.sql末尾追加(或单独执行) CREATE VIEW class_avg_score AS SELECT s.class_name AS class, c.course_name AS course, AVG(sc.score) AS avg_score, COUNT(*) AS student_count FROM student s JOIN score sc ON s.id = sc.student_id JOIN course c ON sc.course_id = c.id GROUP BY s.class_name, c.course_name;执行后,SELECT * FROM class_avg_score;即可得到班级-课程维度的平均分,避免每次报表都写复杂JOIN。
5.2 DAO层:编写ClassAvgScoreDao查询视图
新建src/com/student/dao/ClassAvgScoreDao.java:
public class ClassAvgScoreDao { public List<ClassAvgScore> findAll() { String sql = "SELECT * FROM class_avg_score ORDER BY class, course"; List<ClassAvgScore> list = new ArrayList<>(); try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { ClassAvgScore item = new ClassAvgScore(); item.setClass(rs.getString("class")); item.setCourse(rs.getString("course")); item.setAvgScore(rs.getDouble("avg_score")); item.setStudentCount(rs.getInt("student_count")); list.add(item); } } catch (SQLException e) { e.printStackTrace(); } return list; } }对应实体类ClassAvgScore.java需有class、course、avgScore、studentCount四个属性及getter/setter。
5.3 Servlet层:ReportServlet接收请求并转发数据
新建src/com/student/servlet/ReportServlet.java:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ClassAvgScoreDao dao = new ClassAvgScoreDao(); List<ClassAvgScore> reports = dao.findAll(); request.setAttribute("reports", reports); request.getRequestDispatcher("report.jsp").forward(request, response); }并在web.xml中注册:
<servlet> <servlet-name>ReportServlet</servlet-name> <servlet-class>com.student.servlet.ReportServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ReportServlet</servlet-name> <url-pattern>/reportServlet</url-pattern> </servlet-mapping>5.4 View层:report.jsp用JSTL表格渲染报表
report.jsp关键代码:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <table border="1"> <tr><th>班级</th><th>课程</th><th>平均分</th><th>人数</th></tr> <c:forEach items="${reports}" var="r"> <tr> <td>${r.class}</td> <td>${r.course}</td> <td><fmt:formatNumber value="${r.avgScore}" pattern="0.00"/></td> <td>${r.studentCount}</td> </tr> </c:forEach> </table>需在WebContent/WEB-INF/lib/中放入jstl-1.2.jar和standard-1.1.2.jar,并在JSP顶部加:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>6. 答辩级验证与交付:三步让导师当场点头的硬核操作
6.1 功能验证清单:用真实数据跑通五条核心路径
别只演示登录,按此顺序操作(每步截图存档):
| 步骤 | 操作路径 | 预期结果 | 验证点 |
|---|---|---|---|
| 1 | http://localhost:8080/StudentScore/login.jsp→ 输入admin/123 | 跳转main.jsp,右上角显示“欢迎管理员” | Session是否生效 |
| 2 | 点击“学生成绩录入” → 选择学生+课程+分数 → 提交 | score表新增一条记录,student_id和course_id为数字而非0 | 外键约束是否生效 |
| 3 | 点击“成绩查询” → 输入学生姓名 → 查看列表 | 显示该生所有课程成绩,且score.jsp中课程名正确(非ID数字) | JOIN查询是否正确 |
| 4 | 点击“统计分析” → 进入报表页 | 表格显示班级、课程、平均分三列,数值精确到小数点后2位 | 视图+JSTL格式化是否正常 |
| 5 | 修改src/com/student/servlet/LoginServlet.java,在doPost开头加System.out.println("Login requested");→ 重启Tomcat → 登录 | Eclipse控制台输出该日志 | 自定义代码是否被加载 |
提示:第五步是答辩时的“后悔药”——当导师问“如果要加短信通知功能,你准备在哪改?”,直接打开
LoginServlet指出插入点,比背八股文更有说服力。
6.2 文档交付包:把3-文档升级为可答辩的PDF手册
将学生成绩管理系统文档.doc转化为专业交付物:
- 封面页:添加学校Logo、课题名称、学生姓名、指导教师、日期
- 系统架构图:用draw.io重绘MVC三层图,标注
LoginServlet→StudentDao→MySQL调用箭头 - 数据库ER图:用PowerDesigner导出高清PNG,注明
student.id为主键、score.student_id为外键 - 部署截图:插入Tomcat启动成功日志、
http://localhost:8080/StudentScore/login.jsp页面、MySQL中SELECT * FROM score LIMIT 5;结果 - 扩展功能页:新增“报表模块设计”章节,附
class_avg_score视图SQL和report.jsp截图
6.3 视频剪辑技巧:用部署视频切片制作3分钟答辩演示
从5-视频/中提取关键片段合成答辩视频:
01-学生考试成绩系统的演示.mp4:截取0:00-1:20(登录→录入→查询→统计全流程)02-项目的部署运行.mp4:截取2:17-3:05(Tomcat端口配置界面特写)04-程序访问数据库乱码问题.mp4:截取1:10-1:45(Navicat字符集设置红框)
用剪映合并,添加字幕:“已解决字符集、外键、Session三大典型问题”。结尾定格画面:http://localhost:8080/StudentScore/report.jsp表格全屏,右下角时间戳显示当前日期。
从那以后我每次帮学生改毕设,都强制走一遍“五步验证清单”——不是为了炫技,而是当导师突然说“你把刚才录入的成绩删掉再查一遍”时,你能笑着点开MySQL Workbench,两秒内定位到score表,删完立刻刷新页面,看着空列表说:“老师,已验证删除功能正常”。希望帮到你。
本文还有配套的精品资源,点击获取