ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

JSP+Servlet体育成绩管理系统开发实战:从数据库设计到Tomcat部署

2026/9/2 4:27:48 拓冰建站 浏览量
JSP+Servlet体育成绩管理系统开发实战:从数据库设计到Tomcat部署 简介基于JSP与JAVA技术实现的一套体育成绩管理系统完整项目适合学校教务部门、体育教师以及赛事组织者使用能显著提升比赛项目、班级信息、报名信息与成绩统计等环节的数字化管理效率。资源包总计98个文件涵盖16个JSP页面、4个Java源文件、12个class编译文件、15个JAR依赖库、MySQL数据库脚本sql、2个XML配置及3个JS/CSS前端样式等另有34张GIF图片说明和一段操作演示exe录屏压缩包大小仅4.96MB目录结构清晰便于快速定位源码、配置和数据库文件。系统实现了修改个人密码、班级信息管理、比赛项目管理、生成秩序册、报名信息管理、成绩信息统计等功能模块采用JSPServletJDBC经典分层设计能够帮助开发者理解请求处理、数据持久化与页面展示的完整流程。项目可作为JavaWeb课程设计、毕业设计或学习J2EE基础知识的参考资料已有468人学习下载。 搞过Java Web课程设计或者企业内部小系统的朋友对 JSP Servlet 这组老搭档应该都不陌生。我最近完整做了一套“JSP JAVA体育成绩管理系统”从需求梳理到数据库设计再到上线部署踩了不少坑也积累了一些很实在的经验。这篇文章就从这个项目的真实开发视角出发把整体思路、核心模块、功能落地和常见问题一次性讲清楚给正在做类似系统的同学或者需要快速搭一套成绩管理后台的同行做个参考。这套系统解决的是很典型的场景学校体育老师需要批量录入学生的体测成绩、跑步成绩、球类考核成绩还要按班级/年级做统计排名学生则希望能随时查到自己的成绩和评分明细。如果用 Excel 操作数据容易乱、权限不好控制、统计也麻烦。做成 Web 系统后管理员维护基础数据教师录入与审核学生只读查询职责清晰效率也上来了。1. 系统整体设计与技术选型思路1.1 需求拆解和功能边界做系统之前我习惯先把角色和功能边界列清楚不然写着写着就会失控。这套体育成绩管理系统我划分了三种角色系统管理员维护教师账号、班级信息、体育项目类型处理数据备份和异常数据修正。体育教师录入成绩、批量导入成绩、修改未确认的成绩、查看统计报表。学生查看自己的成绩、查看课程项目评分标准、查看班级排名可选。功能上主要拆分成四块用户认证与权限控制、基础数据管理学生、班级、项目、成绩录入与维护、统计分析与展示。这个规模的项目不适合一上来就上微服务或者复杂的权限框架用 JSP Servlet JDBC 这种经典分层结构既便于理解也足够稳定。1.2 为什么选了 JSP Java 这套组合我知道现在一聊 Java Web很多人的第一反应是 Spring Boot Vue 前后端分离。但针对体育成绩管理这类业务逻辑中等、用户量不大的系统JSP Servlet 依然有它的价值。学习资料极多遇到问题几乎都能搜到答案适合二次开发和交接。部署简单一个 Tomcat 扔进去就能跑不需要额外搭 Node 或 Nginx。JSP 天然支持服务端渲染在校园网环境、低版本浏览器下表现稳定。项目体积小改动一个页面直接替换 .jsp 文件即可生效维护方便。实际开发中我用的是 Servlet 4.0 JSP JDBCMySQL 8.0前端用 JSP JSTL 少量 jQuery没有引入太重的前端框架。不是说不能引入而是对这类系统来说控制复杂度本身就是一种正确选择。2. 数据库设计与核心模型解析2.1 表结构设计数据库是这套系统的地基。我设计的表不算多但每张表的字段都经过权衡。核心表包括表名用途关键字段sys_user用户表管理员/教师/学生id, username, password, role, student_nostudent学生信息表id, student_no, name, class_id, genderclass_info班级表id, class_name, grade, majorsport_item体育项目表id, item_name, unit, score_rulescore_record成绩记录表id, student_id, item_id, score, test_date, teacher_id, status这里有一个设计重点成绩记录中加了一个score_rule或者通过sport_item关联计分规则字段因为不同项目的评分方式差异很大。比如 1000 米跑是用时越短分数越高引体向上是次数越多分数越高而篮球运球上篮可能按秒数计分。如果只存一个score字段后续算总分时很容易混乱。我设计了两种分数存储方式一种是直接存百分制得分score另一种是存原始成绩raw_score再加上一个规则ID。这样既保留原始数据又可以根据规则随时重新换算得分非常灵活。2.2 成绩计算逻辑体育成绩和普通文化课成绩最大的不同在于它不是简单的卷面分而是依赖于项目规则。比如跑步类项目按完成时间换算得分时间越短得分越高。计数类项目按完成个数换算得分个数越多得分越高。主观评分项目由教师按评分标准打分。我用了一个比较朴素的方案在sport_item表里存rule_type1代表越小越好2代表越大越好再存一组成绩区间映射表score_convert记录从原始成绩到得分的分段。计算时通过 Service 层读取规则算分而不是把逻辑散落在 JSP 页面里。注意如果你也打算做类似系统强烈建议别把评分规则写死在 JSP 脚本片段里不然后期调整标准要改很多页面而且容易出现改了 A 页面漏了 B 页面的问题。3. 核心功能落地与代码实现3.1 项目结构搭建项目我按经典分层来组织清晰且容易扩展src/main/java ├── com.sport.controllerServlet 控制层 ├── com.sport.service业务逻辑层 ├── com.sport.dao数据访问层 ├── com.sport.entity实体类 ├── com.sport.util工具类DB连接、MD5加密、分页 └── com.sport.filter登录与权限过滤器控制层只负责接收请求、调用 Service、分发到 JSP不写业务逻辑。Service 负责事务和计算规则Dao 只做 SQL 操作。这样分层的好处是后续如果你想换掉 JSP 改做前后端分离控制层和 Service 层都可以保留复用。数据库连接我用了最简单的 JDBC 连接池Druid。如果你不熟悉连接池可以先从 DriverManager 手写连接开始但生产环境一定换连接池不然并发一高就会卡死。3.2 登录与权限控制这部分是整个系统安全的基石。我用 Session 存登录用户配合 Filter 做统一拦截。WebFilter(/*) public class LoginFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req (HttpServletRequest) request; HttpServletResponse resp (HttpServletResponse) response; HttpSession session req.getSession(false); Object user (session ! null) ? session.getAttribute(loginUser) : null; String uri req.getRequestURI(); if (user ! null || uri.endsWith(login.jsp) || uri.endsWith(login) || uri.contains(static)) { chain.doFilter(request, response); } else { resp.sendRedirect(req.getContextPath() /login.jsp); } } }这段代码的核心逻辑很简单除了登录相关请求和静态资源其余请求都检查 Session没有登录就重定向到登录页。但实际使用时要注意几个细节静态资源CSS、JS、图片必须放行否则页面样式全丢。密码不能明文存储我用了 MD5 加盐项目里用DigestUtils.md5Hex(password salt)虽然 MD5 不算强加密但这种内部系统的安全强度够用了。权限细分时可以在 Filter 里加角色判断也可以在 Servlet 或 JSP 标签里判断。我选择了 Filter JSP 中的c:if双重控制避免用户越权操作。3.3 成绩录入与批量导入成绩录入是这个系统的核心操作也是教师用户每天都要面对的功能。如果只提供单条录入50 人一个班就要点 50 次体验太差。我做了两个入口单条录入表单适用于补录、零散修改。表单包含学生学号、项目、成绩、测试日期、备注。学号输入后通过 Ajax 实时校验学生是否存在成绩输入后通过ScoreService里的规则引擎自动换算得分并展示给学生看。批量导入这是效率提升的关键。我在页面提供 Excel 模板下载教师按学号、项目、原始成绩三列填写后上传。后端用 POI 解析逐行校验后批量插入。批量导入碰到的问题是数据格式五花八门比如成绩写成1301分30秒数值列混入中文学号带空格等。我统一做了清洗和校验并返回错误行号。// 分页查询核心逻辑简化版 public PageResultScoreRecord pageQuery(int page, int size, String studentNo) { String countSql SELECT COUNT(*) FROM score_record; String dataSql SELECT * FROM score_record WHERE 11 LIMIT ?, ?; // 使用 PreparedStatement 避免 SQL 注入 // 拼接条件时用参数占位符 }重要提示无论单条录入还是批量导入SQL 一律使用 PreparedStatement 参数绑定不要用字符串拼接 SQL。成绩系统面对的虽然是内部用户但安全习惯必须养成。3.4 统计报表与可视化成绩录入之后统计展示才是最体现系统价值的地方。我的报表模块包括班级成绩汇总平均分、最高分、最低分、及格率。项目维度分析比如全年级 1000 米的成绩分布。个人历史成绩曲线学生查看自己多个学期的变化趋势。图表这块我用了轻量的 ECharts在 JSP 页面中通过 Ajax 请求后端接口获取 JSON 数据再渲染图表。选 ECharts 的理由是不需要服务端参与生成图片数据格式简单文档丰富兼容性好。$.ajax({ url: score/chartData, data: {itemId: 1, classId: 2}, dataType: json, success: function (res) { var chart echarts.init(document.getElementById(chart)); chart.setOption({ xAxis: {data: res.categories}, series: [{type: bar, data: res.values}] }); } });统计计算我放在 Service 层完成SQL 负责基础聚合Java 负责复杂的业务规则判断这样既保证性能也让逻辑可测试。4. 常见问题与排查技巧实录4.1 JSP 脚本片段的风险与控制开发阶段新手很容易在 JSP 里直接写 Java 脚本片段% ... %来做判断和循环。我一开始也这么干但后来发现带来了几个痛点页面混杂大量业务逻辑美工无法维护脚本片段出错时错误信息很难定位JSP 首次编译时间明显变长而且如果 JSP 页面权限控制不严暴露了内部逻辑风险很大。解决方式很简单页面只做展示逻辑全部交给 Servlet 和 Service。数据通过 request.setAttribute 传到页面JSP 中用 JSTL 和 EL 表达式取值。比如成绩列表展示c:forEach varrecord items${pageResult.list} tr td${record.studentNo}/td td${record.studentName}/td td${record.itemName}/td td${record.score}/td td${record.testDate}/td /tr /c:forEach4.2 中文乱码问题JSP 系统最经典的问题就是乱码。我这次遇到的情况有三种页面显示乱码JSP 文件编码、Content-Type 没设置对。统一设置为UTF-8。表单提交中文乱码POST 请求参数乱码需要在 Servlet 中设置request.setCharacterEncoding(UTF-8)或者写一个 CharacterEncodingFilter 统一处理。数据库存储乱码连接 URL 必须带characterEncodingutf8且数据库表本身要设置 utf8mb4 字符集。// 统一编码过滤器 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(UTF-8); response.setCharacterEncoding(UTF-8); chain.doFilter(request, response); }4.3 Tomcat 部署与路径问题很多同学部署时遇到的404空白页问题大多不是代码逻辑问题而是部署路径问题。我在 Eclipse/IDEA 中直接部署到 Tomcat 很顺利但一到生产环境手动放置 war 包时经常出现上下文路径不对。比如项目名为sport-system访问地址是http://ip:8080/sport-system/但代码里写的链接是/login.jsp没有带上下文路径结果 css 和请求全 404。我的经验是项目所有跳转、请求路径统一使用%request.getContextPath()%或者${pageContext.request.contextPath}作为前缀JSP 中一般是后者link relstylesheet href${pageContext.request.contextPath}/static/css/style.css4.4 分页查询的性能坑成绩记录会逐年增加如果不分页或者分页方式不对后期会越来越卡。我踩过的坑是使用LIMIT offset, size做大偏移量分页。当数据到几万条、用户直接翻到第 100 页时MySQL 要扫描 offsetsize 条记录性能明显下降。优化方式有几种一是利用主键做游标分页WHERE id ? ORDER BY id LIMIT ?比普通 OFFSET 分页稳定二是在成绩表上建联合索引(student_id, item_id)这是查询最频繁的条件。分页参数也建议在 Service 层做合法校验避免负数或者超大数值导致异常查询。4.5 开发环境的编译警告处理开发中我遇到过一个很常见的警告java: 警告: 源发行版 17 需要目标发行版 17这是因为项目编译级别和当前 JDK 版本不一致。原因是 IDEA 中 Project Structure 里的 SDK 版本、Java Compiler 的 target bytecode version、Maven 的 compiler 插件版本三者不一致。我的处理办法是统一在pom.xml中指定properties maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target /properties另外使用 Lombok 时偶尔会看到you arent using a compiler supported by lombok的提示这通常是因为 IDE 内置编译器与 Lombok 版本不兼容升级 Lombok 依赖或使用 Maven 编译就能解决。5. 项目部署与后续扩展建议5.1 部署步骤小结系统开发完成后部署步骤比想象中简单但也容易出错。我的完整流程是用 Maven 打包生成 war 包执行mvn clean package。确保 MySQL 中创建好数据库和用户导入初始化 SQL 脚本。将 war 包放入 Tomcat 的webapps目录启动后自动解压。修改数据库连接配置db.properties确认 URL、用户名、密码正确。访问http://ip:8080/项目名/用管理员账号初始化班级和教师账号。有一点值得注意如果服务器是 Linux记得给 Tomcat 和 webapps 目录设置正确的读写权限否则上传的 Excel 文件可能无法保存。5.2 这个系统的扩展方向如果后续你想把这套系统做得更完善有几个方向可以参考对接学校统一身份认证CAS/OAuth2学生用校园账号登录。引入二维码签到/扫码录入教师通过手机端快速录入。成绩数据分析增加更丰富的可视化大屏比如雷达图、热力图。把评分规则配置化做成管理员可维护的动态规则页面而不是写在代码里。增加成绩通知功能成绩确认后自动推送消息给学生。最后分享一点实操心得这套系统从零到落地我大概花了两周时间真正写业务代码的时间不到一半另一半全耗在数据库设计和各种细节调优上。我个人体会最深的一点是JSP 项目虽然老但它的核心价值不在于技术本身多新而在于它把一套清晰的 MVC 流程展现得明明白白——请求进来、业务处理、页面渲染、数据回显。把这些基本功吃透再转任何框架都会非常快。最后再给大家一个非常实用的小技巧开发这类系统时把每个页面操作对应的 SQL 日志打印出来通过日志可以非常快速地定位大多数性能问题和数据异常。我用的是 log4j2 自定义 SQL 拦截器在开发环境打开 SQL 输出线上环境关掉即可。这个习惯帮我省了无数排查时间值得一试。本文还有配套的精品资源点击获取