简介一份基于 Java Web 的学生选课系统源码实现学生、教师、管理员三类角色的教务管理功能。学生端提供注册登录、修改信息、查看选课、成绩查询、公告浏览与课程信息管理教师端支持课程信息维护、查看选课情况、成绩增删改查、修改密码与查看公告管理员端则对学生、教师、班级、课程、选课、成绩和公告进行统一增删改查。资源共 305 个文件压缩包仅 6.94MB文件以 PNG 截图、CSS 样式、Java 源码、Class 字节码、JSP 页面、JAR 依赖、JS 脚本和 SQL 数据库脚本为主可覆盖从界面参考到后台逻辑的完整阅读路径。已有 3560 人学习下载配套视频教程详细演示通过 IDEA 导入项目并运行的完整流程同时修复了多处历史 bug。除源码外还附带图文讲解与录屏演示从数据库导入到代码结构均有关键说明便于课程设计、毕业设计参考和二次功能扩展。1. 为什么每个计算机专业学生都该自己动手跑一遍选课系统源码不少人在面试里被问“你做过什么完整项目”时答案都是课程设计里的 JavaWeb 学生选课系统。这个标题下的源码包通常是一份 javaweb 项目完整案例数据库用 MySQL页面用 JSP运行在 Tomcat 容器上连图文和视频部署教程都替你备好了。它要解决的不是“怎么写代码”而是“怎么让项目在另一台电脑上也跑起来”——这正是简历里最容易被追问的部署经验。适合正在赶课设的大三学生、需要毕业设计兜底的应届生以及第一次接触 IDEA 运行 JavaWeb 项目配置的入门者。别急着双击 README先看懂这包东西是怎么组织的后面每一步才不踩坑。2. 拆开源码看门道JavaWeb 选课系统的技术选型、目录结构与 MySQL 脚本拿到这类“源码笔记视频”的压缩包我的建议是先别急着打开 IDEA花十五分钟把目录结构看一遍。大量部署失败不是代码写错而是你根本不知道这份源码如何被组织它是不是 Maven 工程、编译用哪个 JDK 版本、数据库密码写在哪个文件里这些信息八成能从目录和配置里读出来。搞清楚再动手比照着视频盲点有效得多。2.1 先判断它是什么形态纯 JSP/Servlet 还是 Maven 工程学生选课系统在课程设计源码里有两个常见形态。第一种是 JSP Servlet JDBC工程里没有 pom.xmljar 包直接放在 WebRoot/WEB-INF/lib 下数据库访问靠 DBUtil 手写 Connection第二种是 Maven 化的 SSM 版本根目录有 pom.xml代码按 controller、service、mapper 分包。标题只写“JavaWeb”没有提 Spring那大概率是第一种。为什么课设偏爱这个形态因为答辩时老师会追问 Servlet 生命周期、doGet/doPost 区别、PreparedStatement 防注入这些在框架里全被藏起来而 JSPServlet 能让你把知识点讲到源码层很容易撑起一场答辩。反过来如果解压后发现根目录有 pom.xml你就要先确认本机 Maven 的 settings.xml 配好了镜像源否则依赖下载会把耐心磨光。2.2 从目录结构判断部署方式lib、web.xml、sql、docs 各管哪一块常见的学生选课系统源码目录长这样你拿到手先对照一遍course-select/ ├─ src/ # Java 源码 │ ├─ com/course/entity/ # 实体类Student、Course │ ├─ com/course/dao/ # JDBC 数据访问层 │ ├─ com/course/servlet/ # 控制器HttpServlet 子类 │ ├─ com/course/util/ # DBUtil 连接工具 │ └─ com/course/filter/ # 登录拦截过滤器 ├─ WebRoot/ # Web 根目录 │ ├─ WEB-INF/ │ │ ├─ web.xml # Servlet 映射、欢迎页、过滤器 │ │ └─ lib/ # mysql-connector-java.jar 等 │ ├─ login.jsp # 登录页 │ ├─ index.jsp │ ├─ student/ # 学生端页面 │ └─ admin/ # 管理端页面 ├─ sql/ │ └─ course_select.sql # 建库建表 初始数据 └─ docs/ ├─ 部署图文教程.md └─ video/ # 视频教程存放处这个结构透露出三件关键事。第一lib 下直接放 jar 意味着不需要 Maven本地环境少装一个东西但也说明 jar 版本可能很老最常见的就是 mysql-connector-java 5.1.x配上 MySQL 8 容易撞出驱动类问题。第二web.xml 是部署描述符里面定义了 Servlet 的 url-pattern 和欢迎页你访问的每个路径都能在它身上找到来源。第三docs 目录是作者给的图文和视频教程通常包含环境安装、数据库导入、IDEA 配置截图我一般会先看图文版而不是视频因为图文版方便对着操作视频拉进度条反而容易漏。web.xml 里还有一段必须关注就是 Servlet 映射。比如登录请求写成这样servlet servlet-nameLoginServlet/servlet-name servlet-classcom.course.servlet.LoginServlet/servlet-class /servlet servlet-mapping servlet-nameLoginServlet/servlet-name url-pattern/login/url-pattern /servlet-mapping这段配置决定 JSP 表单的 action 最终跳到哪个类。部署阶段你不一定要读懂每个映射但至少要看两处welcome-file 指向谁以及 url-pattern 里有没有带项目名前缀。前者出错会让首页 404后者出错会让表单提交 405 或 404。这些 404 问题十有八九不是 Tomcat 坏了而是映射没对上。2.3 数据库脚本细节学生、课程、选课三张表和一条联合唯一约束选课系统的 SQL 脚本通常不算复杂我在本地跑这类项目时见得最多的是三张表学生表、课程表、选课记录表偶尔加一张管理员表。下面是常见的建表脚本形态SET NAMES utf8mb4; CREATE DATABASE IF NOT EXISTS course_select DEFAULT CHARSET utf8mb4; USE course_select; CREATE TABLE student ( sno VARCHAR(20) PRIMARY KEY, -- 学号 password VARCHAR(64) NOT NULL, -- 登录密码 sname VARCHAR(32) NOT NULL, -- 姓名 sclass VARCHAR(32) -- 班级 ); CREATE TABLE course ( cno VARCHAR(20) PRIMARY KEY, -- 课程编号 cname VARCHAR(64) NOT NULL, -- 课程名 teacher VARCHAR(32), -- 授课教师 credit DECIMAL(3,1), -- 学分 capacity INT DEFAULT 60, -- 容量 selected INT DEFAULT 0 -- 已选人数 ); CREATE TABLE sc ( id INT AUTO_INCREMENT PRIMARY KEY, sno VARCHAR(20), cno VARCHAR(20), select_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_sno_cno (sno, cno) -- 同一学生同一课程只能选一次 );这段脚本里有几个值得细看的参数。course 表的 capacity 和 selected 一配合就是容量校验Servlet 里先查 selected 是否小于 capacity再决定是否插入 sc 记录而 sc 表上的唯一约束 uk_sno_cno 是最后一道闸就算 Java 层的判断被并发绕过数据库也会拒绝重复选课。很多仿写系统把去重逻辑只写在代码里遇到并发请求时两个事务同时读到同一个 selected 值双双通过校验就会超选。唯一约束就是防止这种情况的兜底也是答辩时一个不错的加分回答。另外注意 select_time 的默认值。如果脚本里没有 DEFAULT CURRENT_TIMESTAMP那么插入 sc 记录时 Java 代码必须显式传时间如果传 null 还碰上非空约束选课接口直接 500。这类小坑在避坑章会再展开。3. 部署前把环境一次配齐JDK、Tomcat、MySQL 的版本组合与安装要点看懂了源码结构下一步是准备运行环境。按我调试这类课设项目的习惯最稳的组合是JDK 1.8 Tomcat 8.5 MySQL 5.7。不是版本越新越好而是源码编译目标基本是 JDK 8你拿 JDK 17 去跑可能出现非法访问或反射报错Tomcat 10 之后包名从 javax.servlet 换成 jakarta.servlet老源码里的 import javax 直接加载失败。如果教程视频里老师用的 Eclipse JDK 8而你机器上是 JDK 17先别硬刚降级通常比改造代码快得多。3.1 版本组合为什么 JDK 8 Tomcat 8.5 MySQL 5.7 最稳下表是我在多个学生项目上验证过的一组推荐组合照着配能省掉大半启动报错组件推荐版本理由JDK1.8OpenJDK 8 或 Oracle JDK 8老源码大多以 JDK 8 编译反射和字节码兼容性最好Tomcat8.5.x使用 javax.servlet 命名空间和 JSP/Servlet 课设源码完全匹配MySQL5.7 或 8.05.7 最稳8.0 需要换 MySQL Connector/J 8.x 驱动并额外配置时区参数IDEAUltimate 2021内置 Tomcat 集成Community 社区版需要装 Smart Tomcat 插件额外说一句如果你自己写的是基于 Jakarta 命名空间的新项目那用 Tomcat 10 没问题但“JavaWeb 学生选课系统”这个标题下的老源码几乎不用考虑这个方向。判断标准很简单打开源码里任意一个 Servlet 文件看 import 的是 javax.servlet 还是 jakarta.servlet前者就用 Tomcat 8.5后者才能上 Tomcat 10。3.2 JDK 与 OpenJDK 的安装细节JAVA_HOME 和 PATH 怎么设Windows 上装 JDK 时最常见的失误是安装完不配 JAVA_HOME导致 Tomcat 启动时找不到 Java 环境。IDEA 自己能选 JRE但 Tomcat 的启动脚本依赖系统环境变量。我一般这样处理# Windows PowerShell管理员方式执行把路径换成你自己的安装目录 [Environment]::SetEnvironmentVariable(JAVA_HOME, C:\Program Files\Java\jdk1.8.0_202, Machine) # Linux / macOS export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH设置完环境变量必须新开一个终端窗口再验证旧窗口不会自动刷新环境变量。验证命令是java -version输出第一行应该是 java version 1.8.0_xxx而不是类似 openjdk version 17.0.5 的结果。如果输出版本不对先检查 PATH 里是否残留了其他 JDK 路径Windows 上尤其要注意 C:\Windows\System32 下可能存在的 java.exe 干扰那个通常来自 Oracle 的自动更新或某些桌面软件优先级反而比 JAVA_HOME 高。3.3 初始化选课数据库用 source 导入 SQL 脚本与账号权限MySQL 装好、服务启动后导入选课系统 SQL 脚本。这里的常见做法是用 source 命令而不是把 SQL 内容整段复制进命令行客户端后者的行处理更容易被转义符和注释干扰。命令如下mysql -uroot -p # 输入 root 密码后进入 MySQL 命令行 set names utf8mb4; source D:/project/course-select/sql/course_select.sql; show tables;三行命令各有用意。set names utf8mb4先把当前会话的字符集切成 utf8mb4避免脚本里带中文注释时写入乱码。source后面必须跟绝对路径而且 Windows 上建议用正斜杠比如 D:/project/...直接复制 Windows 资源管理器里的反斜杠路径 D:\project... 经常被命令行解析成转义符这是新手最常翻车的地方。show tables是验证如果列出了 student、course、sc 三张表说明导入成功如果提示 No database selected说明脚本里的 USE 语句没执行手动执行一条use course_select;再确认。提示很多课设源码把 JDBC 配置写死为 root/123456。如果你的 MySQL root 密码不是 123456有两类做法把 MySQL 密码改成 123456或者改源码里的 db.properties。改密码图省事但不安全也不专业改配置文件更符合工程习惯后面第 4 章会讲具体改哪几个参数。4. 用 IDEA 运行 JavaWeb 项目的配置从导入源码到浏览器访问环境就绪后进入部署核心环节在 IDEA 里把源码跑起来。“idea运行javaweb项目配置”这个搜索需求很真实说明卡在这一步的人远比卡在写代码的人多。下面按 IDEA Ultimate 的常见界面路径写Community 社区版的差异会在小节里单独标注。4.1 导入源码Open 进项目后先确认是不是 Web 工程打开 IDEAFile → Open选中源码根目录也就是包含 src 和 WebRoot 的那一层。如果弹出“Maven project detected”提示说明它识别到了 pom.xml按 Maven 工程导入没有提示说明这是一个传统 Web 工程。传统工程导入后直接点运行会告诉你没有配置 Tomcat这时候别慌按下面的顺序处理。第一步Project StructureCtrlAltShiftS→ Modules → 选中当前模块 → 点 “” → Web。如果这里不添加 Web 能力IDEA 不认为这是 Web 项目后面 Artifact 根本建不出来。第二步在 Modules 的 Dependencies 页签里把 WebRoot/WEB-INF/lib 下的 jar 全部加进依赖。常见做法是直接把 lib 目录作为一个 Library 引入IDEA 会递归包含里面的 jar。第三步确认 Project 页签里 Project SDK 选的是 1.8Project language level 也对应 8否则某些写法在编译阶段就会标红。Community 社区版的用户内置的 Tomcat 集成是被裁掉的但问题不大装一个 Smart Tomcat 插件配置好 Tomcat 路径后也可以把 Web 项目直接启动。区别只是没有完整的 Artifact 打包界面跑课设完全够。4.2 配置 Artifact 和 Tomcatwar exploded 才是调试首选运行 JavaWeb 项目必须理解 IDEA 里两个概念Artifact 和 Application context。Artifact 是打包产物IDEA 提供两种 Web Artifactwar 和 war exploded。war 是把项目压缩成一个 war 文件再丢给 Tomcatwar exploded 是以目录形式直接部署改 JSP 刷新浏览器就能看到效果不用反复打包重启。调试阶段永远选 exploded这是血泪经验换来的。配置路径Project Structure → Artifacts → “” → Web Application: Exploded → From Module。生成后在 Output Layout 里重点检查有没有 WEB-INF/lib 和里面的 jar这一步直接决定后面会不会报 ClassNotFoundException。如果 Output Layout 里看不到 lib 下的 jar右键点 WEB-INF → Create Directory → 建一个 lib → 再右键 → Add Copy of → File → 把驱动 jar 选进来。接着配置运行入口Run → Edit Configurations → “” → Tomcat Server → Local。Application Server 里选择本地 Tomcat 8.5 的根目录切换到 Deployment 页签点 “”选 Artifact类型是 course-select:war explodedApplication context 通常填 /这样访问地址就是 http://localhost:8080/index.jsp。4.3 修改 JDBC 参数并启动url、username、password 到底填在哪启动前最后一步把数据库连接参数对齐。源码里的 DBUtil 一般会加载 db.properties 或 config.properties也可能直接硬编码在 DBUtil.java 中。全局搜索“jdbc:mysql”一定能找到连接串改成下面这种形态jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/course_select?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456逐项说明参数意义。jdbc.driver 在 MySQL 5.7 时代用 com.mysql.jdbc.Driver如果你换成了 MySQL 8 驱动类名要改成 com.mysql.cj.jdbc.Driver还沿用旧类名会直接启动失败。jdbc.url 里的 course_select 必须和 SQL 脚本中 CREATE DATABASE 的名字一致大小写和拼写一个都不能差。useUnicodetrue 和 characterEncodingutf8 是中文不乱码的关键参数缺一个页面写入的中文就可能变成问号。serverTimezoneAsia/Shanghai 在 MySQL 8.0 下必填5.7 可以省略如果不填连接时经常会报时区 CST 错误。useSSLfalse 则是为了关掉 SSL 握手告警不影响功能但能少刷屏。参数改完后回到 Tomcat 运行配置点 Debug 按钮绿色虫子图标。调试启动比 Run 启动更适合课设因为 breakpoint 随时能挂排查选课逻辑时非常有用。启动后看 IDEA 下方 Tomcat 日志出现“Server startup in [xxx] milliseconds”就说明容器起来了。浏览器访问你配的 Application context 路径如果看到登录页项目就算跑通了一半。5. JavaWeb 选课系统部署避坑指南五个高频失败点与排查方法这一章集中写我见过、也踩过的五个高频坑。每一条都按“现象 → 原因 → 解决”展开照着顺序查多数 404、500 能在一刻钟内定位。5.1 现象页面 500控制台报 ClassNotFoundException: com.mysql.jdbc.Driver现象是 Tomcat 能启动但访问首页或登录接口时直接 500IDEA 控制台抛 NoClassDefFoundError 或 ClassNotFoundException点名道姓说找不到 com.mysql.jdbc.Driver。原因几乎总是驱动 jar 在项目里存在但没有被打进 Artifact 的 WEB-INF/lib。传统 Web 工程的 lib 目录如果不显式加入 ArtifactIDEA 不会自动把它包含进部署目录于是 Tomcat 运行时根本看不见这个类。解决Project Structure → Artifacts → 选中 war exploded → Output Layout → 右键 WEB-INF → 确认 lib 下是否有 mysql-connector-java 的 jar。如果没有右键 lib → Add Copy of → File → 指向本地驱动 jar也可以选中整个 lib 目录Add Copy of → Directory Content把整个目录打进去。改完不直接点运行而是先 Build → Rebuild防止 Artifact 缓存还停留在旧状态。另外检查驱动类名是否和驱动版本匹配5.1.x 用 com.mysql.jdbc.Driver8.x 用 com.mysql.cj.jdbc.Driver混搭也会得到同样的报错。5.2 现象数据库连接失败控制台报 Communications link failure现象是页面能打开但点登录或选课时抛 SQLException伴随 Communications link failure或者类似于 Connection refused 的信息。原因通常是三类MySQL 服务没启动MySQL 端口不是默认 3306JDBC url 里的数据库名或用户名密码和实际不符。其中密码不符在课程包项目里出现频率最高——教程里写死 root/123456但你自己装 MySQL 时设的是别的密码。解决分三步。第一步确认 MySQL 进程存在Windows 执行netstat -ano | findstr 3306Linux 执行ss -ltnp | grep 3306能看到 3306 端口监听说明服务在运行看不到就去服务管理里启动 MySQL。第二步确认 url 里的端口号有些开发机 3306 被占用后安装时改成了 3307源码里还是 3306必须同步。第三步是逐字核对 db.properties 里的 username 和 password特别是密码里面如果有特殊字符比如 或 #在 properties 文件里不需要转义但如果你顺手写成了 Java 字符串里的转义形式反而会让解析结果不对。配合mysql -uroot -p手动登录一次能最直接地区分是密码问题还是 MySQL 本身没起来。5.3 现象IDEA 启动 Tomcat 提示 Port 8080 is already in use或 Maven 依赖下载极慢现象一是点启动按钮后弹窗报端口被占用Tomcat 没起来现象二是 Maven 工程里依赖下载像蜗牛卡在 Resolving dependencies 超过十分钟。原因各有不同端口占用通常是你之前启动过一次 Tomcat关掉了 IDEA 窗口但 Tomcat 进程还在后台存活或者是另一个 Java 进程霸占了 8080Maven 慢则是默认连的中央仓库在公网上对国内网络环境不友好换国内镜像源是最常见的解法。解决端口问题Windows 上执行netstat -ano | findstr 8080找到占用 PID然后taskkill /F /PID PID号或者直接改 IDEA 里 Tomcat 配置的 HTTP port从 8080 改成 8081顺手把 JMX port 也改成不冲突的值。解决 Maven 慢到 Maven 安装目录 conf/settings.xml在 mirrors 节点里加一个阿里云镜像配置mirror idaliyun/id mirrorOfcentral/mirrorOf nameAliyun Maven Repository/name urlhttps://maven.aliyun.com/repository/public/url /mirror注意改完 settings.xml要在 IDEA 里把 Maven 的 User settings file 指向这个配置文件否则它可能还在用 IDEA 自带的默认配置。定位方式Settings → Maven → User settings file → Override 勾上 → 选择你的 settings.xml。端口和镜像这两件事在你启动一个“javaweb 项目完整案例 mysql 版”时十有八九会碰到至少一个。提前处理比看到红字再反应省时间。5.4 现象页面中文乱码登录后用户名变成问号现象是 JSP 页面上中文正常但把数据写进 MySQL 后再读出来变问号或者登录后页面上显示的用户名、课程名全部乱码。原因不是单一一处而是三处编码不一致JSP 页面声明的 charset、请求处理时的 encoding、数据库客户端的字符集连接参数三者只要有一处不统一中文就保不住。解决思路是把所有环节统一到 UTF-8。第一处JSP 顶部必须有% page contentTypetext/html;charsetUTF-8 %没有就补上第二处web.xml 里加一个编码过滤器或者在每个 Servlet 的 doPost 开头调用request.setCharacterEncoding(UTF-8)推荐的还是过滤器写法一次生效第三处JDBC url 里带上 characterEncodingutf8也就是第 4 章给出的参数。已经乱掉的数据不会自动恢复需要把表 drop 掉重新 source 一遍 SQL 脚本再走一遍新增数据的流程。乱码是课设系统中典型的“改一处不够改三处才稳”的问题答辩老师经常会拿它来考你排查思路。5.5 现象视频教程一次启动成功你本地怎么都跑不对现象是教程里老师点一下运行几秒后页面就出来了你照着点要么 404要么 500连弹窗都不一样。原因基本可以归为版本和环境差异视频里是 Eclipse你是 IDEA视频里 JDK 8你机器上是 JDK 17视频里 MySQL 5.7你装的是 MySQL 8.0。每一个差异都会改变运行结果IDEA 的 Artifact 概念在 Eclipse 里根本不存在Eclipse 的 Run On Server 也不会问你 Application context。解决把排除优先级定好。第一步把 JDK 和 Tomcat 版本对齐到视频里的版本最快的方式是按第 3 章的表格重新装一套本地 JDK8IDEA 里 Project SDK 和 Tomcat 的 JRE 都指向它第二步不再照 Eclipse 操作步骤而是按你 IDEA 界面的实际菜单路径走Artifact、Deployment、Application context 这三处是 IDEA 特有单独对着做第三步如果启动后 404先别怀疑配置去看 Tomcat 的本地日志 localhost.log里面有一行“Deploying web application directory”如果项目名和你访问的路径对不上就会 404。视频是参考地图不是圣旨以你本机日志为准。6. 部署完成后怎么验证并把它变成课程设计一点进阶技巧部署跑通只是起点。真正的课程设计答辩和简历里需要你能证明这个系统“真的能跑”。第一个验证动作是走完一遍完整业务流用初始化的学生账号登录打开课程列表选一门课回列表看已选人数加一再去选课记录里退课已选人数减一。这个过程能把 Servlet、JDBC、数据库三条链路串起来证明系统不是停在“首页能打开”。我在这一步习惯同时打开数据库客户端执行SELECT selected FROM course WHERE cno...页面点一下数据库数值跟着变眼见为实。第二个动作是把运行环境固化下来省得答辩现场开 IDEA 卡半天。常见做法是写一个 Dockerfile 把 Tomcat 和 WAR 包打包这也是热词里 Docker 部署思路在课设里最轻量的用法FROM tomcat:8.5-jre8 COPY target/course-select.war /usr/local/tomcat/webapps/ROOT.war EXPOSE 8080简单说下参数镜像用 tomcat:8.5-jre8对应 JDK 8 和 javax.servlet 命名空间把 war 复制成 ROOT.war 是为了用根路径访问如果保留原名访问地址就会多一层上下文路径。容器里连宿主机 MySQL 时JDBC url 里的 localhost 要改成 host.docker.internalWindows/macOS 的 Docker Desktop 可用或宿主机局域网 IPLinux 常见做法否则容器内访问不到外部数据库。构建命令是docker build -t course-select .启动命令是docker run -p 8080:8080 course-select。第三个可选扩展点是给课程设计加料把 DBUtil 换成 DBCP 连接池给选课接口加事务或者把明文密码改成 MD5/BCrypt 存储。这些都是答辩老师爱问的“还有什么可改进”的现成回答一个点说透就够。我自己第一次部署这类课设项目时卡在欢迎页 404 上折腾到半夜才发现是 Application context 填成了 /course-select/而实际访问地址少写了一个字符。那之后我养成了两个习惯改任何配置文件前先备份一份原文件启动前先看 Tomcat localhost 日志再点浏览器。前者是后悔药后者是照妖镜希望你也能用上。本文还有配套的精品资源点击获取