JavaWeb学生成绩管理系统:MySQL+Servlet+JDBC池可运行源码
简介本资源是一套完整的JavaWeb学生成绩管理系统实战项目面向Java初学者与Web开发入门者聚焦教育管理场景下的CRUD业务实现与MVC架构实践。压缩包含353个文件总大小8.98MB涵盖53个Java源码含StudentServlet、ScoreService等核心业务类、53个编译后class文件、24个JSP页面、40个CSS与10个JS前端资源、24个运行依赖jar包以及MySQL数据库文件.sql与.db和基础配置XML完整支撑系统部署与二次开发。已有1740人学习下载可直接导入IDE运行调试快速掌握ServletJSPJDBC技术栈整合应用深入理解学生/课程/成绩三表关联设计、Session登录控制、验证码校验及Excel成绩导出等典型功能实现逻辑。1. 这不是“又一个JavaWeb练手项目”它是一套能直接进课设答辩、改两行就能交毕设的学生成绩管理系统源码包你搜“javaweb学生成绩管理系统”页面刷出几百个标题雷同的压缩包——但点开发现要么只有JSP没数据库脚本要么用HSQLDB硬编码写死路径要么连Tomcat端口都配成8081却没说明怎么改。真正能双击start.bat就跑起来、登录页不报404、查成绩不抛NullPointerException、导出Excel不乱码的不到三成。这个.rar包之所以值得你花20分钟解压验证是因为它同时满足四个硬指标MySQL 5.7兼容、Servlet 3.1规范、JDBC连接池实装、前后端分离式登录态管理非session明文传参。它不是教你怎么写% out.print(hello); %的入门Demo而是按高校《软件工程课程设计》评分标准反向构建的有完整ER图注释、DDL建表语句带字段说明、DAO层方法命名严格遵循findByStudentId()而非getStu()、甚至web.xml里filter链顺序都按安全最佳实践排布。适合两类人大三学生赶课设 deadline 前夜需要可运行基线代码培训班学员想拆解真实业务中“成绩录入→班级统计→导出报表”这条数据流闭环。别被“源码数据库”六个字骗了——关键在“”号后面那个.sql文件是否带ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci这决定了你明天会不会在插入中文姓名时看到一堆问号。2. 从解压到首页渲染三步走通最小可运行路径2.1 解压后必须立刻核验的三个物理文件提示别急着导入IDE先确认这三个文件存在且内容合理否则后续所有配置都是无用功。db/grade_system.sql这是整个系统的数据契约。用文本编辑器打开重点看前三行-- MySQL dump 10.13 Distrib 5.7.36, for Linux (x86_64) -- Host: localhost Database: grade_system -- Server version 5.7.36-log如果显示Server version 8.0.33而你本地是MySQL 5.6请立刻停手——高版本导出的json类型字段或generated column语法会直接让source grade_system.sql报错。src/main/webapp/WEB-INF/web.xml检查servlet-mapping节点是否绑定到/login而非/LoginServlet。很多盗版源码把URL-pattern写成类名导致浏览器访问http://localhost:8080/login时404。正确写法必须是servlet-mapping servlet-nameLoginServlet/servlet-name url-pattern/login/url-pattern /servlet-mappingsrc/main/resources/jdbc.properties确认jdbc.url末尾带?useUnicodetruecharacterEncodingUTF-8serverTimezoneGMT%2B8。漏掉serverTimezone参数会导致Java读取MySQL时间字段时偏移8小时——你录的“2024-06-01 14:00”在页面显示成“2024-06-01 06:00”学生投诉查分不准的锅就甩不掉了。2.2 在IntelliJ IDEA中零配置启动的关键操作注意不要用“Add Framework Support”向导它会自动加web.xml版本声明反而破坏原有Servlet 3.1兼容性。新建空项目 → 选择“Empty Project” → Next别选“Maven”或“Java Enterprise”避免pom.xml污染原有依赖树File → Project Structure → Modules → → Import Module → 选中解压后的src目录此时IDEA会自动识别为Java Module但需手动指定Web资源路径在Module Settings里点击“Web”选项卡Web resource directory填src/main/webappWeb.xml location填src/main/webapp/WEB-INF/web.xml配置Tomcat Server时唯一要改的参数Run → Edit Configurations → → Tomcat Server → Local → Deployment → Artifact → 选grade-system:war exploded关键动作点击右侧“Fix”按钮红色感叹号图标IDEA会自动补全/WEB-INF/lib/*.jar到classpath。若跳过此步运行时必报ClassNotFoundException: com.mysql.cj.jdbc.Driver——因为MySQL驱动jar没进war包lib目录。2.3 首次启动必遇的“白板页”排查流程如果浏览器打开http://localhost:8080只显示空白页非404按以下顺序检查打开浏览器开发者工具F12→ Network标签 → 刷新页面 → 查看第一个请求的Status是否为200若是302重定向到/login.jsp但返回404说明web.xml中welcome-file-list没配对或login.jsp实际路径是/pages/login.jsp而配置写成/login.jsp查看Console是否有Uncaught ReferenceError: $ is not defined这表示jQuery没加载。检查login.jsp中script srcjs/jquery.min.js路径是否相对于webapp根目录。常见错误把js文件放在src/main/resources/static/js/下却用srcjs/jquery.min.js引用查看Tomcat日志logs/catalina.out末尾是否有Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet出现此错误说明你误删了WEB-INF/lib/spring-webmvc-5.3.30.jar。该系统虽未用Spring MVC全栈但登录过滤器依赖其HandlerInterceptor接口缺jar直接启动失败3. 数据库初始化绕过字符集陷阱的建库四步法3.1 创建数据库时必须执行的强制命令MySQL客户端连接后禁止直接执行CREATE DATABASE grade_system;。必须用以下命令确保UTF8MB4全兼容CREATE DATABASE grade_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;为什么不用utf8MySQL的utf8实际是utf8mb3不支持emoji和部分生僻汉字如“䶮”、“”。学生姓名含这些字时INSERT会静默截断查出来变成“张*”——而utf8mb4才是真正的UTF-8实现。3.2 导入SQL文件前的预处理grade_system.sql文件头部通常有SET NAMES utf8;这在MySQL 8.0会触发警告。需手动替换为-- 将原文件中的 SET NAMES utf8; -- 替换为 SET NAMES utf8mb4;否则导入时可能遇到ERROR 1366 (HY000): Incorrect string value: \xF0\x9F\x98\x80 for column student_name at row 1这是emoji 的UTF-8四字节编码utf8无法存储3.3 验证数据完整性三条必查SQL导入完成后在MySQL命令行执行以下查询任一结果非预期值即说明数据未正确载入-- 1. 检查学生表记录数应为10条测试数据 SELECT COUNT(*) FROM student; -- 2. 检查课程表字符集必须是utf8mb4 SHOW CREATE TABLE course; -- 3. 检查成绩表外键约束是否激活应显示CONSTRAINT fk_score_student_id FOREIGN KEY SHOW CREATE TABLE score;补充技巧若SHOW CREATE TABLE输出中ENGINEMyISAM说明建表语句漏写了ENGINEInnoDB。MyISAM不支持事务和外键删除学生时成绩记录不会级联清除——这会让教务老师发现“已退学学生仍有成绩记录”的逻辑漏洞。4. 功能模块避坑指南五个血泪经验换来的参数清单4.1 成绩录入页的“提交无响应”问题现象点击“保存成绩”按钮后页面无反应Network面板显示POST /score/add返回500原因ScoreServlet.java第42行调用Double.parseDouble(request.getParameter(score))时前端传入空字符串而非null触发NumberFormatException解决在ScoreServlet中增加空值校验String scoreStr request.getParameter(score); if (scoreStr null || scoreStr.trim().isEmpty()) { request.setAttribute(error, 成绩不能为空); request.getRequestDispatcher(/pages/add_score.jsp).forward(request, response); return; } double score Double.parseDouble(scoreStr);4.2 班级统计页的“平均分计算错误”现象某班10人成绩总和为850页面显示平均分84.99999999999999原因ScoreDao.java中使用float类型累加浮点精度丢失解决改用BigDecimal精确计算// 原错误代码 float sum 0f; for (Score s : scores) sum s.getScore(); // 正确写法 BigDecimal sum BigDecimal.ZERO; for (Score s : scores) { sum sum.add(BigDecimal.valueOf(s.getScore())); } BigDecimal avg sum.divide(BigDecimal.valueOf(scores.size()), 2, RoundingMode.HALF_UP);4.3 Excel导出功能的中文乱码现象导出的Excel文件打开后姓名列显示“涓冨崕”原因ExportServlet.java中response.setContentType(application/vnd.ms-excel)缺少字符集声明解决添加charsetutf-8并设置Headerresponse.setContentType(application/vnd.ms-excel;charsetutf-8); response.setHeader(Content-Disposition, attachment;filenamescore_export_ System.currentTimeMillis() .xls);4.4 登录密码明文传输风险现象抓包发现POST /login请求体中password123456明文可见原因前端login.jsp表单method为GET且未启用HTTPS解决将form methodget改为form methodpost在web.xml中添加安全约束开发环境可暂不启用HTTPS但必须禁用GET传密security-constraint web-resource-collection web-resource-nameLogin/web-resource-name url-pattern/login/url-pattern http-methodGET/http-method /web-resource-collection auth-constraint/ /security-constraint4.5 分页查询的“最后一页数据重复”现象学生列表分页第3页显示第21-30条但第4页又出现第21-25条原因StudentDao.java中LIMIT #{offset}, #{pageSize}的offset计算错误当currentPage4时offset3*1030但数据库实际只有35条记录LIMIT 30,10会越界取数解决在SQL中增加ORDER BY确保排序稳定并用COUNT(*)校验总数SELECT * FROM student ORDER BY student_id ASC LIMIT #{offset}, #{pageSize}并在Service层添加边界判断int total studentDao.countAll(); int maxPage (int) Math.ceil((double) total / pageSize); if (currentPage maxPage) currentPage maxPage;5. 进阶改造把“教学系统”升级为“可交付项目”的三个硬核动作5.1 给DAO层加上MyBatis动态SQL替代原始JDBC拼接原始代码中StudentDao.java的查询方法充斥着SELECT * FROM student WHERE name LIKE % name %这是SQL注入温床。改造步骤在pom.xml中添加MyBatis依赖注意版本匹配JDK8dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.5.10/version /dependency创建StudentMapper.xml用bind标签防注入select idfindByName resultTypeStudent SELECT * FROM student where if testname ! null and name ! bind namelikeName value% name % / name LIKE #{likeName} /if /where /select在StudentDaoImpl.java中调用public ListStudent findByName(String name) { SqlSession session MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper mapper session.getMapper(StudentMapper.class); return mapper.findByName(name); // 自动处理空值和转义 } finally { session.close(); } }这样改完即使学生输入 OR 11作为姓名搜索MyBatis会将其转义为\ OR \1\\1彻底杜绝注入。5.2 为成绩录入页增加实时校验规则原始JSP页面仅靠input typenumber min0 max100做前端限制但用户可禁用JS后随意提交。需在Servlet层加固// ScoreServlet.java 中 validateScore 方法 private boolean validateScore(double score) { if (score 0 || score 100) { return false; } // 检查小数位数最多保留1位小数 String scoreStr String.valueOf(score); int dotIndex scoreStr.indexOf(.); if (dotIndex ! -1 scoreStr.length() - dotIndex 2) { return false; // 如 85.23 → 超过1位小数 } return true; }对应前端增加提示script document.getElementById(score).addEventListener(blur, function() { const val parseFloat(this.value); if (isNaN(val) || val 0 || val 100) { alert(成绩必须是0-100之间的数字); this.focus(); } }); /script5.3 用Log4j2替换System.out.println生产环境必备原始代码中遍布System.out.println(查询学生 id)这在Tomcat多线程环境下会混杂日志。改造方案删除所有System.out引入Log4j2!-- pom.xml -- dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-core/artifactId version2.20.0/version /dependency创建log4j2.xml配置文件放在src/main/resources?xml version1.0 encodingUTF-8? Configuration statusWARN Appenders File nameFileAppender fileNamelogs/grade-system.log PatternLayout pattern%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n/ /File /Appenders Loggers Root levelinfo AppenderRef refFileAppender/ /Root /Loggers /Configuration在每个Servlet中声明Loggerprivate static final Logger logger LogManager.getLogger(LoginServlet.class); // 替换原System.out logger.info(用户{}登录成功, username);这样做的价值当教务处半夜打电话说“系统卡住了”你不用翻catalina.out大海捞针直接tail -f logs/grade-system.log | grep ERROR就能定位到具体哪行代码抛异常。我去年帮兄弟院校处理一次线上故障就是靠这招10分钟内锁定是ScoreDao连接池耗尽而不是盲目重启Tomcat。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Matlab实现风电功率预测误差时空相关性建模与场景生成分析

Matlab实现风电功率预测误差时空相关性建模与场景生成分析

以前我在做风功率预测项目的时候,最头疼的其实不是预测算法本身,而是预测做完之后没法交代“你这个预测到底准在哪”。RMSE、MAE、MAPE这些指标我当然会给,但调度那边追问的是另一句:那你告诉我明天这个风电场群的出力&#xff0c…

2026/10/24 9:55:32 阅读更多 →
Electron核心实战:从本地联调到打包分发避坑指南

Electron核心实战:从本地联调到打包分发避坑指南

做了几年 Electron 桌面应用,踩过的坑凑起来能写一本书。很多人上手 Electron 都从“能跑起来”开始,但真正到了要上生产、要打包、要处理原生能力的时候,才会发现文档之外全是细节。这篇东西不是入门教程,而是把 Electron 开发里…

2026/11/13 15:39:31 阅读更多 →
10款降AI率工具实测:专科生论文如何通过AIGC检测

10款降AI率工具实测:专科生论文如何通过AIGC检测

先说个我自己比较深的感受:这几年每年毕业季,总有大四学生因为论文被判定“AI痕迹过重”被打回重写,其中专科生的比例尤其高。专科论文本来就不要求像本科那么强的理论原创性,很多同学习惯用AI写初稿、自己再调格式,提…

2026/10/28 8:53:19 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/13 5:13:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/13 5:13:25 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/13 5:13:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/13 22:08:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻