简介基于JavaWeb的体育竞赛管理系统毕业设计资源包面向计算机相关专业学生及需要快速搭建竞赛管理平台的开发者。系统覆盖运动员报名与成绩查询、管理员用户与赛事安排、裁判员成绩录入与公示等核心模块基于JDK1.8、MySQL5.7和JSP技术构建可直接作为毕业设计参考或二次开发的基础。资源为7z格式压缩包共2662个文件约29.37MB包含Java源文件、JSP页面、HTML/CSS/JS前端、class编译文件及SQL脚本等目录结构清晰便于按模块检索。目前已有903人学习下载。除可运行的完整工程外还附带项目文档、配置文件和多种素材涵盖在线报名、资格审核、成绩自动排名等关键逻辑非常适合用于理解JavaWeb项目分层结构、掌握竞赛管理核心业务流程并可为论文撰写和答辩演示提供支撑。1. 体育竞赛管理系统一个可以照着跑起来的 JavaWeb 毕设全集每年答辩季都能看见这样的场景老师打开你的系统问“报名数据是怎么走到数据库里的”你只能从头点一遍鼠标讲不清楚。如果你也在找一套能支撑答辩、能实际运行、也能改的 JavaWeb 项目这套基于 JSP Servlet DAO 的体育竞赛管理系统值得重点看。它用 JDK 1.8 和 MySQL 5.7 把运动员报名、管理员审核、裁判录入成绩这三条业务链路完整串了起来前端是 JSP 动态页面后端是经典三层架构代码里能看到 Servlet 控制器和 DAO 实现类能跑通、能讲逻辑、也能二次开发。适合正在做毕设、JavaWeb 课设或者想系统过一遍 Servlet JSP 开发流程的从业者。2. 先从类名反推系统骨架三层架构和四张核心表2.1 从 class 文件名反推项目分层拿到这份资源第一步不是急着导入 IDEA而是先把目录结构看一遍。压缩包里出现了StudentServlet.class、DirectorServlet.class、DirectorDaoImpl.class这个命名已经把项目分层暴露得很清楚了。一个传统的 JavaWeb 三层结构大致是这样文件类名推断职责对应层StudentServlet.class运动员端控制器处理报名、查成绩等请求Controller 层DirectorServlet.class管理员/裁判端控制器处理审核、录入成绩等请求Controller 层DirectorDaoImpl.class管理员/裁判相关的数据访问实现Dao 层controller.ashx不是 Java 文件疑似打包混入的杂物建议直接删除无关文件DirectorDaoImpl这个名字说明项目不是把 SQL 直接写在 Servlet 里而是做了“接口 实现”的 DAO 模式。常见的结构是接口叫DirectorDao实现类叫DirectorDaoImplServlet 只依赖接口不直接碰 JDBC 代码。这一点在答辩时是加分项因为它体现了分层解耦的思想而不是把数据库操作全堆在 JSP 里。StudentServlet和DirectorServlet是从角色维度拆分的控制器。运动员和后台管理员的入口分开各自处理各自的功能。就毕设规模来说这种拆分足够清晰比按功能模块拆 Servlet 更直观。两个 Servlet 之间的公共逻辑比如用户登录校验通常抽成了工具类或过滤器具体要看源码结构但从命名习惯看开发者是踩过“所有请求塞进一个 Servlet 然后 if-else 满天飞”这种坑的。2.2 四张核心表的结构设计与 SQL 草稿摘要里的功能点拆开落到数据库层面其实只需要四张表用户表、比赛项目表、报名表、成绩表。参赛管理和报名审核的状态流转都可以在这几张表上完成。我在类似项目里一般会这样建表初稿可以照抄CREATE DATABASE IF NOT EXISTS sports_competition DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE sports_competition; CREATE TABLE sys_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, role TINYINT NOT NULL COMMENT 1-运动员 2-管理员 3-裁判员, real_name VARCHAR(50), phone VARCHAR(20), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB; CREATE TABLE competition_project ( id INT PRIMARY KEY AUTO_INCREMENT, project_name VARCHAR(100) NOT NULL, category VARCHAR(50) COMMENT 项目类别田赛/径赛/球类等, schedule_time DATETIME, location VARCHAR(100), max_registration INT DEFAULT 0 COMMENT 0表示不限人数 ) ENGINEInnoDB; CREATE TABLE registration ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, project_id INT NOT NULL, status TINYINT DEFAULT 0 COMMENT 0-待审核 1-已通过 2-已拒绝, register_time DATETIME DEFAULT CURRENT_TIMESTAMP, remark VARCHAR(255) ) ENGINEInnoDB; CREATE TABLE competition_result ( id INT PRIMARY KEY AUTO_INCREMENT, registration_id INT NOT NULL, score DECIMAL(6,2), rank_no INT, update_time DATETIME ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_reg (registration_id) ) ENGINEInnoDB;sys_user表用role字段区分三种角色比拆三张用户表省事得多权限校验时在 Servlet 里取当前登录用户的 role 判断即可。registration.status是整个系统的核心状态字段0 → 1 → 2 对应报名到审核的完整转换管理员审核时其实就是对这个字段做一次 UPDATE。competition_result通过registration_id关联报名记录避免直接冗余student_id和project_id这样成绩复核时能直接回溯到报名来源。2.3 为什么这个项目用 JSP Servlet 而不是 Spring Boot以及它的边界现在很多学生的第一选择是 Spring Boot但这份资源的技术路线反过来对应了大多数高校 JavaWeb 课程的教学顺序先讲 JSP 和 Servlet再讲框架。选这套方案有三个现实原因第一毕设题目是“基于 JavaWeb”用纯 JSP Servlet 最贴合题目描述第二课程设计阶段往往还没系统学框架用 Servlet 能讲清楚请求处理、会话管理、JDBC 这些底层机制第三答辩时老师更可能追问“Session 怎么存用户信息的”“数据库连接怎么关闭的”这些在 Spring Boot 里被框架藏起来了反而不好答。这套技术栈的边界也要说清楚JSP 页面里不适合写复杂业务逻辑数据访问层不能塞进 Servlet项目里没有连接池大概率是DriverManager.getConnection直接连库并发量一高就容易出连接耗尽的问题。不过对毕设来说这些边界恰恰是加分点——你能说出“当前实现适合低并发场景生产环境需要换成连接池”比被问住强得多。3. 在 IDEA 里把它跑起来JDK 1.8 MySQL 5.7 Tomcat 的完整配置3.1 环境准备版本对上才能省事很多人拿到项目第一步就翻车原因不是代码有问题而是环境版本乱配。这份资源的技术基线是 JDK 1.8、MySQL 5.7配套 IDE 是 IntelliJ IDEA运行容器是 Tomcat。建议按下面这张表来配环境组件建议版本说明JDK1.88u202 及之后项目按 JDK 1.8 语法写的用 11 以上大概率报兼容问题MySQL5.7.x驱动和认证方式都是按 5.7 配置的直接上 8.0 会踩认证插件坑Tomcat8.5.x 或 9.0.x对应 Servlet 3.1/4.0 规范兼容 JSP 2.3IDEA2020.3 ~ 2023.x新版本也能用但导 Web 项目的入口略有不同MySQL 驱动5.1.49与 MySQL 5.7 匹配避免驱动版本过高导致的未知异常提示如果你本机已经装了 MySQL 8.x先别急着改代码可以另起一个 3307 端口的 5.7 实例把项目的端口参数改过去比在 8.0 里改认证插件省心得多。3.2 导入 IDEA 并配置 Tomcat导入方式和普通 Java 项目不同需要选择“来自已有源码”的方式具体路径是File - New - Project from Existing Sources然后选中项目根目录。如果源码目录结构是src/main/java这种 Maven 形式IDEA 会直接识别如果是纯src加WebContent结构很多课程设计都是手动搭的目录导入后要做两件关键事第一把 Web 根目录标记出来。在Project Structure - Facets - Web里找到 Web Resource Directory改成实际的 WebContent 或 webapp 目录第二添加 Tomcat 运行配置。在Run/Debug Configurations里新增 Tomcat Server - LocalApplication Server 指向你本地的 Tomcat 安装目录Deployment 里把项目 artifact 添加进去Application context 建议设置为/sports_competition。配置完成后一个典型的server.xml拆出来看是这样的Host namelocalhost appBasewebapps unpackWARstrue autoDeploytrue !-- IDEA 的 Tomcat 配置通常是部署到临时目录 -- Context path/sports_competition docBaseD:/sports_competition/web reloadabletrue/ /Host这段配置的作用是把访问路径/sports_competition映射到项目的 web 目录。如果 404 了九成是docBase指向错误或者在 IDEA 的 Deployment 里没有把 artifact 挂进 Tomcat。启动前再检查一下Artifacts标签页里有没有生成对应的 exploded artifact没有就点手动加。3.3 初始化 MySQL 数据库与连接配置数据库部分比配置 Tomcat 更直接。先连接 MySQL 执行第 2.2 节的建库建表 SQL然后看项目里src下的配置文件常见名字是db.properties或jdbc.properties内容大致是这样jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/sports_competition?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.passwordyour_password如果你的 Tomcat 启动后提示获取数据库连接失败优先检查三处MySQL 服务有没有启动、jdbc.password有没有改成你自己的密码、URL 里的库名sports_competition是否和第 2.2 节建库时一致。useSSLfalse是因为 5.7 默认不走 SSL 加密开着反而可能因为证书问题连接被拒绝。characterEncodingutf8对应表的utf8mb4能保证中文字段读写不乱码。这套 JavaWeb 项目里数据库操作基本是 JDBC 直连没有配置连接池。因此每一次读写数据库都是先getConnection、最后finally里close的写法。看到这种代码别觉得简陋它反而把数据库连接的生命周期暴露得很清楚比直接上 MyBatis 更适合作为讲解素材。4. 三条核心业务链路报名、审核、成绩排名的代码落点4.1 运动员报名链路JSP 表单 → StudentServlet → DAO运动员报名的完整链路是JSP 表单提交 →StudentServlet.doPost→ 调用 DAO 插入报名记录 → 返回结果页。理解这条链路只需要抓住一个核心点Servlet 永远不直接写 SQL它做参数接收、类型转换和逻辑判断数据库操作交给 DAO。StudentServlet核心逻辑大致如下WebServlet(/student/register) public class StudentServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Integer studentId Integer.valueOf(request.getParameter(studentId)); Integer projectId Integer.valueOf(request.getParameter(projectId)); if (studentId null || projectId null) { response.sendRedirect(register.jsp?msgparam_error); return; } RegistrationDao dao new RegistrationDao(); if (dao.hasRegistered(studentId, projectId)) { response.sendRedirect(register.jsp?msgalready_registered); return; } boolean ok dao.insert(studentId, projectId); if (ok) { response.sendRedirect(student/register_success.jsp); } else { response.sendRedirect(register.jsp?msgfailed); } } }WebServlet注解是 Servlet 3.0 以后的写法省掉了 web.xml 里大量映射配置。Integer.valueOf负责把 JSP 表单提交的字符串转成数字这里要注意如果表单没填值request.getParameter返回 nullInteger.valueOf(null)会抛NumberFormatException所以上面的判空前置是必要的。dao.insert(studentId, projectId)内部执行的就是一条 INSERT但值得关注的是它的先查询后插入设计hasRegistered先判断同一个学生是否已经报过同一个项目避免重复报名。这在业务逻辑层面是一道必要的校验如果漏掉数据库层就得用联合唯一索引兜底。答辩被问到“怎么防止重复报名”答出这一层就是完整的。4.2 管理员审核与参赛项目管理管理员模块的核心动作是审核报名在数据库层面就是更新registration.status。从 0待审核改成 1已通过或者改成 2已拒绝对应后台审核页面的“通过”和“拒绝”按钮。UPDATE registration SET status 1, remark 审核通过 WHERE id 7 AND status 0;这条 SQL 值得玩味的是WHERE id 7 AND status 0这个写法。加status 0是防止重复审核如果两条管理员请求同时到达第一条把 status 改成 1 之后第二条的 UPDATE 影响行数为 0业务层就能据此判断“该记录已经被处理过”而不是把已通过的报名再覆盖一遍。这种细节在毕设代码里写出来了老师会觉得你有并发意识。参赛项目管理则是对competition_project表做增删改查重点在日程安排。schedule_time字段是DATETIME类型后台传参时一定要拼成yyyy-MM-dd HH:mm:ss格式不能只传日期否则会解析报错。4.3 裁判录入成绩MySQL 5.7 下的排名计算裁判录入成绩的页面提交score对应的 DAO 执行 UPDATE 写入competition_result。项目用的是 MySQL 5.7不能用RANK() OVER这种 8.0 才有的窗口函数排名的常见做法是在应用层计算或者用 MySQL 变量实现行号排名下面这种写法在 5.7 里可以直接跑SET rank : 0; UPDATE competition_result r JOIN registration reg ON r.registration_id reg.id JOIN ( SELECT id, rank : rank 1 AS new_rank FROM competition_result ORDER BY score DESC, update_time ASC ) ranked ON ranked.id r.id SET r.rank_no ranked.new_rank;这段的逻辑是先按成绩降序排列成绩记录然后用rank变量逐行赋值最后把算好的名次回填到rank_no字段。同分情况的处理参考了update_time升序也就是说同样分数先录入的排前面这是体育竞赛系统里常见的规则。这里有一个值得注意的问题如果成绩表里出现了成绩相同的情况上面这段 SQL 里的排名是连续的1、2、3不是并列名次1、1、3。毕设里用连续名次完全够但如果老师追问“并列第几怎么处理”你可以在应用层加一层判断查出得分相同的记录把名次改成相同值。能答到这一层基本就把成绩模块吃透了。5. 避坑让毕设翻车的 5 个经典问题与解决顺序5.1 导入后源码一片红找不到 JDK 或 Servlet 依赖现象IDEA 打开项目所有.java文件全部报错提示Cannot resolve symbol HttpServlet。原因项目导入后IDEA 没有正确识别 JDK 版本同时缺少 Tomcat 提供的 Servlet API 依赖。课程设计项目普遍不用 Maven依赖都靠 Tomcat 运行时的 jar 提供。解决先Project Structure - Project把 SDK 切到 JDK 1.8再把Project Structure - Modules里当前模块的 Language Level 改成 8。最后在Project Structure - Libraries里点击加号把 Tomcat 安装目录/lib/servlet-api.jar和/lib/jsp-api.jar加进来。三个地方都对了源码报红会自动消失。5.2 MySQL 8.x 环境连不上报认证插件错误现象Tomcat 启动后后台打印Unable to load authentication plugin caching_sha2_password。原因系统装的是 MySQL 8.x默认认证插件是caching_sha2_password而项目里用的是 5.1.49 的驱动无法识别该插件。解决最省事的做法是按第 3.1 节表格里的版本装 MySQL 5.7。如果不想换版本也可以把现有 8.0 的 root 用户改回传统认证ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY your_password; FLUSH PRIVILEGES;改完之后重启 Tomcat 再试。优先推荐直接换 5.7因为 8.0 下即使能连上SQL 语法和时区行为也可能和项目原环境不一致容易引出新问题。5.3 Tomcat 启动正常但浏览器访问 404现象Tomcat 能启动控制台也不报错但访问http://localhost:8080/sports_competition/返回 404。原因多数情况下是 IDEA 的 Deployment 里没有挂载 artifact或者 Application context 路径和实际访问路径不一致。有时也可能是项目没有编译成功classes目录下是空的。解决打开Run/Debug Configurations - Tomcat Server - Deployment确认下面有项目的 artifact再检查 Application context 是否填了/sports_competition。然后执行一次Build - Build Artifacts - Rebuild确保target/classes或out/artifacts里有编译好的 class 文件。手动打开http://localhost:8080如果能看到 Tomcat 默认首页说明容器正常再去核对项目路径。5.4 JSP 页面中文乱码或表单提交后乱码现象页面显示中文正常但表单提交到数据库后变成问号或者一打开页面就是乱码。原因三个环节没有保持统一编码。JSP 页面声明的编码、Servlet 读取参数的编码、数据库连接的characterEncoding三者不一致最常见的是 JSP 页面顶部没有写pageEncodingutf-8。解决在 JSP 页面最顶部加上% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %Servlet 里如果按字节方式读参数加上这句request.setCharacterEncoding(UTF-8);数据库连接 URL 里characterEncodingutf8已经在第 3.3 节写过了三处统一后中文就正常了。5.5 项目里混进controller.ashx这类非 JavaWeb 文件现象压缩包解压后源码目录里出现controller.ashx文件、重复的 class 文件目录结构显得很乱。原因ashx是 ASP.NET 的处理器文件出现在 JavaWeb 项目里通常意味着打包工具或文件整理时混入了无关内容也可能是项目曾在多种环境间复制残留了编译产物。解决把controller.ashx和所有.class文件从源码目录里删掉只保留.java、.jsp、.xml、.properties这些源文件。.class是编译产物IDEA 会自动重新编译保留反而会让 IDEA 的索引混乱严重时会导致运行的是旧 class。拿到任何项目先做一遍“目录清扫”是我个人刻进肌肉记忆的习惯。6. 最后一步用一套测试数据走通全流程再决定要不要迁 Spring Boot6.1 一套完整的验收测试用例项目跑起来之后别急着演示建议按下面这套用例完整走一遍既能验证功能也把答辩时的演示路径提前固定下来。步骤操作预期结果1用管理员账号登录后台能看到未审核报名列表2添加一个比赛项目写清项目和赛程列表出现该项目报名端可选3用运动员账号报名该项目报名列表出现该记录状态为“待审核”4切回管理员账号点击“通过”报名状态变为“已通过”5用裁判员账号录入一条成绩成绩保存成功排名自动更新6用运动员账号查看个人成绩能看到分数和名次数据与库内一致走完这一步后再用一条 SQL 验证核心数据链路上最终状态是否正确SELECT u.real_name, p.project_name, r.status, cr.score, cr.rank_no FROM registration r JOIN sys_user u ON r.student_id u.id JOIN competition_project p ON r.project_id p.id LEFT JOIN competition_result cr ON r.id cr.registration_id ORDER BY cr.rank_no;这条 SQL 把四张表串在了一起查询结果能直观展示“谁报了哪个项目、审核状态如何、成绩排名多少”。答辩时如果老师问“数据是怎么关联的”把这条 SQL 一摆比说十句话都有效。6.2 如果要迁 Spring Boot先确认这三件事如果你想把这份资源迁移到 Spring Boot很多人会在毕设里做“二期改造”动手前先确认三件事。第一Servlet 的生命周期理解。Spring Boot 底层是嵌入式的 Tomcat但它把 Servlet 包装成了 DispatcherServlet原来doPost里的参数获取和页面跳转逻辑要改写成 Controller 的RequestParam和返回 ModelAndView。第二数据库访问方式。项目现在用 DAO JDBC建议换成 Spring Data JPA 或 MyBatis但注意registration.status这种状态字段要在实体类里映射成枚举或 Integer不然查询条件容易写散。第三会话管理。Servlet 里的HttpSession在 Spring Boot 里对应HttpSession可以直接用但如果要做登录拦截要用 Spring MVC 的拦截器或 Spring Security原来的 Session 判断逻辑只保留业务层。迁移这件事不是把 JSP 改成 Thyemeleaf 那么简单真正的价值在于你借此理解了框架背后到底做了什么。我自己第一次做类似迁移时把 Servlet 版跑通花了三小时迁移到 Spring Boot 却折腾了一整天才理顺参数绑定和事务管理。从那以后我拿到任何 JavaWeb 项目第一件事都是先把源码里的 class 和杂物清干净再谈启动和改造。希望这套思路能帮你在毕设路上少走一半弯路。本文还有配套的精品资源点击获取