ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

学生成绩管理系统实战:Servlet+JSP+MySQL部署与避坑指南

学生成绩管理系统实战:Servlet+JSP+MySQL部署与避坑指南 简介基于ServletJsp实现的学生成绩管理系统包含完整源码与数据库脚本主要面向计算机相关专业毕业设计学生及需要项目实战的Java学习者。系统运行环境为Tomcat7及以上、MySQL5及以上可配合Eclipse或IDEA开发工具使用项目经过调试可直接部署运行。压缩包共166个文件涵盖69个JSP页面、25个Java类及对应Class编译文件并包含SQL数据库脚本、XML配置与少量图片资源整体包体仅1.53MB结构轻量、便于导入与二次开发。资源已吸引538人学习下载。系统按三种用户划分功能管理员可进行学生、教师、课程信息管理教师可开设课程、提交成绩学生可在线选课和查询成绩覆盖高校成绩管理的主要业务场景。相关数据库表设计完善源码按DAO、Servlet、JSP分层职责清晰适合作为课程设计、毕业设计或初学Java Web项目的练手参考。1. 学生成绩管理系统的第一印象ServletJsp 老项目值得抄吗解压这份学生成绩管理系统源码包时我猜你跟我当初一样手比脑子快直接把整个文件夹拖进了 Tomcat 的 webapps 目录然后对着 404 页面愣了半天。这类基于 ServletJspMySQL 的老项目能不能跑起来从来不取决于代码本身只取决于你有没有把环境参数对齐这里面其实没什么玄学。它是标准的 Java Web 三层结构JSP 出页面、Servlet 收请求、DAO 层访问数据库管理员管学生、教师、课程教师开课录成绩学生选课查成绩六张表撑起三种角色。适合正在赶毕设的在校生也适合想把 Java Web 全链路串一遍的初学者。下面从结构拆解、环境部署、数据库设计到踩坑清单一步步讲完。2. 源码结构拆解从 DAO 类名看懂分层与请求走向2.1 压缩包里的真实内容三层结构与一份.class 清单打开压缩包你大概率会先看到一堆名字带 DAO 和 slt 的文件这些是编译后的 class 文件不是源码。先别急着删它们的命名透露出整个项目的分层思路DAO 结尾的是数据访问层负责跟 MySQL 打交道slt 结尾的是 Servlet 层负责接收 HTTP 请求剩下的 JSP 页面负责展示。这种按职责命名的习惯在小项目里看起来冗余但真到改需求的时候你能一眼定位该动哪个文件比那种全堆在 JSP 里的写法好维护得多。类名推断职责StudentDAO / TeacherDAO学生、教师基本信息读写ScDAO / TcDAO / MscDAO关联表读写选课关系、授课关系、管理端统计sc_slt / tc_slt / msc_slt对应的请求处理 Servletteacher_slt教师端请求入口jxl_slt基于 jxl 库的 Excel 导出处理这里有个值得留意的点jxl 是 Java 操作 Excel 的老牌库jxl_slt 大概率承担成绩单导出功能。很多人在部署时发现 lib 里少了 jxl.jar项目能启动但一点导出就报 ClassNotFoundException原因就在这。建议拿到包先看一眼 WEB-INF/lib 目录把 jxl.jar 和 mysql 驱动确认在不在能省掉后面一大半排错时间。2.2 DAO 层写法一段标准的 JDBC 访问代码这类项目最常见的 DAO 写法是这样从连接、预编译、执行到结果集封装一套流程固定不变。下面以查询学生为例public Student findByNo(String no) { Student s null; String sql SELECT * FROM student WHERE stu_no ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, no); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { s new Student(); s.setStuNo(rs.getString(stu_no)); s.setName(rs.getString(stu_name)); s.setClassNo(rs.getString(class_no)); } } } catch (SQLException e) { e.printStackTrace(); } return s; }逻辑说明先拿连接再预编译 SQL用占位符?传参避免字符串拼接带来的注入风险。这是那个年代 DAO 的固定模板几乎所有表都能套这个结构。参数说明stu_no是学生表主键?占位符下标从 1 开始try-with-resources 能自动关闭连接、语句、结果集不用手写 finally 里的一堆 close()。这个方法返回 null 就表示没查到这个人Servlet 拿到 null 后判断登录失败。2.3 Servlet 层怎么接请求一个提交成绩的例子看一个成绩提交的 Servlet 骨架就能明白这项目里请求是怎么流转的protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String stuNo request.getParameter(stu_no); String courseNo request.getParameter(course_no); String score request.getParameter(score); TcDAO dao new TcDAO(); boolean ok dao.updateScore(stuNo, courseNo, Double.parseDouble(score)); if (ok) { response.sendRedirect(teacher/score_ok.jsp); } else { request.setAttribute(msg, 成绩提交失败); request.getRequestDispatcher(teacher/score_input.jsp).forward(request, response); } }逻辑说明Servlet 只做三件事——收参数、调 DAO、决定跳转。这里用了 sendRedirect 重定向和 forward 转发两种方式区别是重定向会改地址栏适合提交成功后防刷屏转发能带 request 里的 msg 回原页面展示错误信息。参数说明request.getParameter拿到的全是字符串数字字段要手动转换Double.parseDouble遇到空值会抛 NumberFormatException实际项目里最好先判空再转。常见误用是把这段逻辑塞进 JSP 的% %里页面一多就乱成一团。这份资源把 DAO 和 Servlet 分开改表结构时只需要动 DAO 层这个分层习惯值得保留。提示后面你跑通项目后如果想改功能先遵循这个分层页面改动找 JSP请求处理找 slt数据操作找 DAO别跨层改。3. 环境搭建与部署TomcatMySQLNavicat 的参数清单3.1 版本组合怎么选才不翻车这项目要求 Tomcat7 以上、MySQL5 以上。我的建议是别追求最新JDK8 Tomcat8.5 MySQL5.7 是这类老项目最稳的组合。Tomcat9 也能跑但 Tomcat7 早期版本配 JDK8 容易出现 JSP 编译期类加载问题MySQL8 不是不行要换驱动类名再加时区参数对新手不友好。我见过太多卡在 mysql 安装上的人其实跟版本号没关系是把驱动和时区参数对齐。组件推荐版本备注JDK1.8别用 JDK11老项目的 JSP 编译时常出类加载问题Tomcat8.5.x兼容 Servlet 3.1稳定MySQL5.7.x5.5 也行5.7 最省心驱动mysql-connector-java 5.1.49MySQL5.7 专用用 MySQL8 见 5.2 节IDEEclipse 或 IDEA任选导入方式略不同3.2 导入 IDE让项目进入可编译状态Eclipse 里File - Import - General - Existing Projects into Workspace选中解压后的目录Finish。IDEA 里用 Open 选到含 .project 的目录会自动识别成 Java Web 项目。导入后第一件事是检查 Project Structure 里的 JDK 是不是 1.8再把 WEB-INF/lib 下的 jar 全部加进 Build Path。很多人栽在这一步项目能打开但报一堆红色叉其实就是 lib 没加进编译路径。# 在项目根目录确认 lib 下的核心依赖 ls -l src/main/webapp/WEB-INF/lib/ 2/dev/null || ls -l WebContent/WEB-INF/lib/ 2/dev/null # 期望至少看到 mysql-connector-java 和 jxl 两个 jar逻辑说明这行命令同时兼容两种项目目录结构找不到就换另一个路径再试。参数说明管道符||表示前一条命令失败才执行后一条避免目录不存在时刷一堆报错。看到两个 jar 后再去 IDE 的 Build Path 里确认它们被引用缺一步都会在运行时报 ClassNotFound。3.3 数据库初始化脚本执行与连接参数先用 Navicat 新建一个数据库名字跟项目里的连接串保持一致字符集选 utf8mb4。然后右键数据库选运行 SQL 脚本选中项目自带的 .sql 文件执行完会生成六张表。命令行执行效果一样mysql -uroot -p123456 student_score.sql # 如果脚本里没有 CREATE DATABASE先手动建库再执行逻辑说明把文件内容重定向给 mysql 命令逐条执行。参数说明-u指定用户-p后直接跟密码不能留空格密码含特殊字符时建议只写-p回车后再输入避免特殊字符被 shell 解析。执行完用show tables;确认六张表都在再往下走。接着改连接配置这项目的连接串一般集中在 db.properties 或 DBUtil.java 里jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/student_score?useUnicodetruecharacterEncodingutf8 jdbc.usernameroot jdbc.password123456参数说明driver 的类名跟 MySQL 版本强相关MySQL5 用com.mysql.jdbc.DriverMySQL8 要换成com.mysql.cj.jdbc.Driver并在 url 后补useSSLfalseserverTimezoneAsia/Shanghai。useUnicodetruecharacterEncodingutf8是中文不乱码的前提漏掉的话第 5.3 节的乱码问题等着你。username 和 password 改成你自己 MySQL 的账号密码。3.4 部署到 Tomcat 并启动Eclipse 里右键项目 - Run As - Run on Server选 Tomcat8.5启动后浏览器会自动打开。IDEA 则在 Run Configuration 的 Deployment 里加 artifactApplication context 改成 /score。启动后先确认端口在听netstat -ano | findstr 8080 # Windows 用 netstatLinux 用 ss -lntp逻辑说明看到 LISTENING 表示 Tomcat 起来了页面打不开时去 logs 目录翻 catalina.out 或 localhost.log 看最后 20 行大多数启动失败的原因日志里都有。参数说明应用 context 路径决定了访问地址http://localhost:8080/score/login.jsp里的 /score 就是 Application context改了这个路径访问地址要跟着改这是 404 的高发区。4. 六张表与三种角色权限设计是怎么转起来的4.1 表结构每张表管什么六张表分别是系统用户表、学生表、教师表、课程表、学生课程关联表sc、教师课程关联表tc。用户表统一存登录账号和密码角色字段区分管理员、教师、学生业务数据放在各自的表里选课和授课通过关联表连接。这个设计的核心思想是把「谁是谁」和「谁做了什么」分开账号体系独立出来以后要加个教务员角色不用动业务表。表名关键字段作用sys_userid, username, password, role登录入口role 0/1/2 区分角色studentstu_no, stu_name, class_no学生基础信息teachertea_no, tea_name, dept教师基础信息coursecourse_no, course_name, credit课程档案scstu_no, course_no, score选课关系 成绩tctea_no, course_no教师开课关系这里有个值得学习的设计成绩字段放在 sc 表而不是单独建一张成绩表因为成绩本质上是「学生-课程」这个关系的属性。你用一条 join 就能查出某个学生的所有成绩不用来回联三张表。这个数据建模思路拿到别的管理系统里同样适用。4.2 建表 SQL 与关联约束看两个核心表的建表语句重点是约束怎么加CREATE TABLE sys_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) NOT NULL UNIQUE, password VARCHAR(32) NOT NULL, role TINYINT NOT NULL DEFAULT 2 -- 0 管理员 / 1 教师 / 2 学生 ); CREATE TABLE sc ( id INT PRIMARY KEY AUTO_INCREMENT, stu_no VARCHAR(20) NOT NULL, course_no VARCHAR(20) NOT NULL, score DECIMAL(5,1) DEFAULT NULL, UNIQUE KEY uk_sc (stu_no, course_no), CONSTRAINT fk_sc_stu FOREIGN KEY (stu_no) REFERENCES student(stu_no), CONSTRAINT fk_sc_course FOREIGN KEY (course_no) REFERENCES course(course_no) );逻辑说明UNIQUE KEY 防止同一个学生重复选同一门课外键保证不存在的学号、课程号进不了关联表。如果你导入时发现建表顺序报错先建课程表和学生表再建关联表。参数说明DECIMAL(5,1)能存最大 999.9 的分数保留一位小数足够AUTO_INCREMENT让 id 自增作为无业务意义的代理主键真实业务编号用 stu_no、course_no 这类业务主键。4.3 登录判定与角色分流登录接口收到用户名密码后先去 sys_user 表查匹配成功就把 user 对象和 role 放进 session再按 role 做分支跳转。我一般把角色判断放在同一个 Servlet 里比写三个 login Servlet 干净得多User u dao.findByUsernameAndPwd(username, md5(password)); if (u null) { request.setAttribute(msg, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); return; } session.setAttribute(loginUser, u); switch (u.getRole()) { case 0: response.sendRedirect(admin/index.jsp); break; case 1: response.sendRedirect(teacher/index.jsp); break; case 2: response.sendRedirect(student/index.jsp); break; }逻辑说明登录失败用 forward 回到登录页并带出错误提示登录成功用 sendRedirect 跳到对应角色的首页避免刷新页面时重复提交表单。参数说明session 是服务端对象重定向后 JSP 页面照样能通过${loginUser.name}取到用户信息。别用 request 传登录用户重定向会丢。密码这里我写了 md5(password)如果原始资源存的是明文建议你改成 MD5 或加盐哈希答辩时能加不少分。4.4 三条核心业务 SQL选课、录分、查成绩学生选课INSERT INTO sc (stu_no, course_no) VALUES (2024001, C001); -- 如果 sc 表加过 UNIQUE KEY重复选课会被数据库拦截逻辑说明这条语句只插入学号和课程号成绩字段保持 NULL表示还没录入。参数说明NULL 和 0 是两回事页面判断「未录入」时要用score IS NULL不要用score 0否则没录分的课会被当成 0 分。教师录成绩UPDATE sc SET score 88.5 WHERE stu_no 2024001 AND course_no C001; -- 没有成绩就是 NULL页面显示「未录入」逻辑说明成绩提交本质是更新选课记录里的 score 字段。参数说明WHERE 条件务必带全学号和课程号漏一个就可能把同一个学生的所有课程成绩全改掉这是录成绩功能最危险的误操作。查成绩带课程名和教师名SELECT c.course_name, t.tea_name, s.score FROM sc s JOIN course c ON s.course_no c.course_no JOIN tc ON c.course_no tc.course_no JOIN teacher t ON tc.tea_no t.tea_no WHERE s.stu_no 2024001;逻辑说明这个 join 把选课关系、课程信息、授课关系全串起来一次查出课程名、教师名和分数。参数说明如果出现重复行说明 tc 表里同一门课被多个老师开了班业务上要按班级或教学班再加条件。这种「一行变多行」的 join 问题是查成绩最容易踩的遇到先看 tc 表有没有重复记录。5. 部署运行避坑五个最容易卡住新手的位置5.1 打开页面 404Tomcat 部署路径和访问路径对不上现象Tomcat 能启动浏览器输入 localhost:8080 看得到 Tomcat 首页但访问项目路径就 404。原因项目没有部署成功或者 application context 和你输入的不一致。老手常用的排查顺序是先看有没有把项目发布到 webapps再看 context 名字最后确认 URL。解决Eclipse 的 Servers 标签页右键项目 - Add and Remove确认项目已经加进右边列表IDEA 则在 Run Configuration 的 Deployment 里看 Application context。我一般把 context 固定设成 /score访问地址就固定为http://localhost:8080/score/login.jsp省得记来记去。也可以直接在 tomcat 的 conf/server.xml 里加Context docBaseD:/student_score path/score reloadabletrue/参数说明docBase 写项目磁盘路径path 是访问前缀。改完必须重启 Tomcat这个 Context 是启动时加载的不重启不生效。这个坑我踩过不止一次改完配置不重启盯着浏览器看了十分钟不知道怎么还是 404。5.2 MySQL 报 Communications link failure驱动与时区参数的组合问题现象点登录后页面卡很久然后报 Communications link failure 或 SSL connection error控制台出现 Server returns invalid timezone。原因十有八九是 MySQL8 的驱动类名和时区问题。项目原配的com.mysql.jdbc.Driver在 MySQL8 下虽然能用但连接串里没有 serverTimezone导致握手时失败。解决把 db.properties 改成下面这个版本jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/student_score?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai参数说明useSSLfalse 跳过 SSL 握手本地开发完全够用serverTimezoneAsia/Shanghai 解决时区报错。如果你坚持用 MySQL5驱动保持com.mysql.jdbc.Driver这两个参数不用加。选哪条路取决于你机器上装的是哪个版本的 MySQL打开 Navicat 看一眼版本就知道不用纠结。5.3 登录成功后全文乱码三层编码不一致现象页面 title 是好的从数据库查出来的学生姓名全是问号或乱码。原因JSP 页面、Servlet 请求、MySQL 连接三个环节各有一套编码任何一个不是 UTF-8 就乱。最常见的是连接串没带 characterEncodingutf8以及 JSP 页面头部的 pageEncoding 和 contentType 不一致。解决先统一三处。页面头改成% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %Servlet 在 doGet 和 doPost 最上面加request.setCharacterEncoding(UTF-8)连接串加 characterEncodingutf8。MySQL 那边如果建库时用了 latin1改库的字符集要重建表建议新建库重导脚本别在旧库上改改不干净的。5.4 8080 端口被占用Tomcat 起不来现象启动时报 Address already in use: JVM_Bind或者 Tomcat 页面打不开。原因其它程序占了 8080常见的是另外的 Tomcat、Oracle 数据库、或者一些开发工具的本地服务。解决先找占用者再决定杀还是换端口netstat -ano | findstr 8080 tasklist | findstr PID如果是个无关进程直接任务管理器结束如果是你自己另一台 Tomcat就把当前项目改成 8081。改法在 conf/server.xml 的 Connector 标签Connector port8081 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443/改完重启访问地址同步换成 8081。注意 IDE 里如果配置了多个 Tomcat 实例改的是你要 Run 的那一个 server.xml别改错了安装目录里的那份改错的结果就是怎么改都不生效。5.5 一提交成绩就 ClassNotFoundExceptionlib 里少了 jxl.jar现象登录、选课都正常教师一点「导出成绩」控制台报 java.lang.ClassNotFoundException: jxl.write.WritableWorkbook。原因jxl_slt 这个 Servlet 用 jxl 库写 Excel但 WEB-INF/lib 下没有 jxl.jar或者 IDE 的 Build Path 没加进去。项目启动时不会立即检查到这个类等你点导出才触发加载属于「用到才炸」的典型。解决确认两个位置都要有 jar。物理目录里find . -name jxl*.jar然后 IDE 的 Build Path 也要引用。Eclipse 是右键 jar - Build Path - Add to Build PathIDEA 在 File - Project Structure - Libraries。很多情况下物理目录有 jar 而 IDE 没引用一样报错。这类问题光看启动日志发现不了跑一遍三个角色的完整流程才能暴露出来。注意jxl 是 Java Excel API 的缩写不是某个中文拼音别手滑把 jxl_slt 当成无关文件删了它是成绩导出的核心。6. 进阶两个把项目变成「你自己的」的验证习惯6.1 拿到 .class 没有 .java反编译三分钟找回源码压缩包里只有 .class 文件的情况多半是打包机器只出了编译产物拿到手一样能用。JDK 自带的 javap 能看字节码javap -c -p StudentDAO.class # 会输出方法签名和字节码指令够你读明白每个方法的参数和调用关系想直接还原成 Java 源码用 JD-GUI 或 Fernflower 这类反编译工具把整个 classes 目录拖进去就能导出。反编译出来的代码可能有符号丢失但拿来理解结构和补全业务逻辑足够。答辩前花半小时把每个类的职责捋一遍比背稿子管用得多。6.2 答辩/验收前走一遍三角色回归流程我建议按这个顺序过一遍管理员登录新增一个学生、一个教师、一门课程教师登录开课并录入成绩学生登录选课再查成绩确认分数显示正常教师导出成绩 Excel确认 jxl 导出不报错最后换一个错密码登录确认有错误提示而不是 500。这五步走完项目才算在你这台机器上真正可信。我自己的一个血泪教训是有次以为只改了 context 路径看着配置没问题没重启就接着调页面结果所有请求都 404查了半小时才发现 server.xml 的改动要重启才生效。从那以后我每次改完配置都强制走一遍「重启 看日志 跑五步流程」这套动作希望帮到你。本文还有配套的精品资源点击获取
返回列表