首页 / 资讯中心 / 文章详情

JavaWeb选课系统部署实战:数据库导入、Tomcat配置与并发优化

JavaWeb选课系统部署实战:数据库导入、Tomcat配置与并发优化 ★ FEATURED ARTICLE
简介这套基于 JavaWeb 的学生选课系统课程设计源码主要面向计算机相关专业在校生、JavaWeb 初学者以及需要完成课设、实训或期末项目的开发者。很多同学在选课类项目中常遇到页面与业务逻辑混杂、数据库设计不清晰的问题这份完整示例正好提供了可运行的参考范式能够帮助理解 JSPServletJDBC 模式下从请求处理到页面渲染的完整链路。压缩包共含 477 个文件核心为 76 个 JSP 页面、70 个 Java 类、15 个 XML 配置文件和 1 个 SQL 数据库脚本此外还包含 CSS、JavaScript、SVG 图标与 woff/eot/ttf 字体等前端资源整体约 5.26MB结构规整、导入后即可对照学习。目前已有 786 人学习下载。源码中覆盖学生信息维护、课程列表展示、选课与退课、管理员审核等典型模块SQL 脚本可快速还原表结构和示例数据便于在 IDE 中直接部署运行并观察模块间的调用关系无论是完成课设报告、准备答辩还是作为 JavaWeb 入门进阶练习这份源码都能提供直接的实现思路和排错参考。1. 学生选课系统很多人第一次独立跑通的JavaWeb课程设计项目周四晚上十一点距离验收还有两天你从U盘里拷来一个“基于JavaWeb课程设计学生选课系统源码数据库.zip”。这类包通常就是一套 JSPServlet或加了 SSM 的完整版项目源码外加一个包含建表语句和测试数据的数据库 SQL 脚本。它的价值在于不需要从零写框架只需把数据库导入、把连接配置对准、把 Tomcat 跑起来就能得到一个能登录、能选课、能管理课程的三层结构学生选课系统用来从容完成课程设计并应付答辩。它适合正在赶 JavaWeb 课程设计的本科生也适合想快速复习一个完整项目从建库到部署全流程的初级开发者。压缩包能不能跑起来关键就三步导入数据库、改连接、配置 Tomcat——对应着最容易翻车的三个位置。2. 先把数据库脚本灌进MySQL目录结构、建库验证与连接参数拿到压缩包先别急着用 IDEA 打开第一件事是把里面的 .sql 数据库脚本落到 MySQL 里。JavaWeb 项目里九成以上的运行时报错根源都是“代码没问题、库里没数据”。这一步拆解为三件事看清包内结构、导入脚本并验证默认账号、对准 JDBC 连接参数。2.1 拆开压缩包先看四处源码、WebRoot、lib、数据库脚本常见做法是先把 zip 解压扫一眼顶层目录。一个标准的 JavaWeb 课程设计源码包通常会同时包含以下四个部分我用表格梳理一下路径目录内容在本项目中的作用/srcservlet、service、dao、model 等 Java 源码业务逻辑与控制层/WebRoot 或 /webJSP 页面、WEB-INF/web.xml、静态资源页面渲染与部署描述/lib 或 /WEB-INF/libservlet-api、mysql-connector-java 等 jar 包编译与运行依赖/db 或 /database 或 /sql建库脚本 course_db.sql 等数据库初始化与测试数据先看 /db 或 /sql 目录找到那个后缀为 .sql 的数据库脚本这就是标题里“数据库”三个字对应的实物。再打开 README.txt 或项目说明文件里面通常会写明数据库名、Tomcat 版本、默认账号密码这些信息比网上随便搜的通用教程更能对号入座。我一般还会顺手记下脚本里的库名比如 course_db、xscj 之类后续导入时用到。2.2 数据库导入的两种姿势命令行 source 与图形工具导入 .sql 最省事的方式是命令行。打开终端先进入 MySQLmysql -uroot -p # 输入 MySQL 的 root 密码后进入 mysql 提示符 CREATE DATABASE IF NOT EXISTS course_db DEFAULT CHARSET utf8mb4; USE course_db; SOURCE D:/course_work/course_db.sql;这段命令的意思很直接CREATE DATABASE 建一个选课系统的库字符集指定为 utf8mb4用来容纳中文课程名和学生姓名USE 切换当前库SOURCE 后跟的是 .sql 脚本的绝对路径建议把路径里的斜杠写成正斜杠Windows 下反斜杠可能被转义导致找不到文件。不用进入 mysql 提示符的替代写法是mysql -uroot -p course_db D:/course_work/course_db.sql等效但少一步交互。有些 .sql 脚本内部自带 CREATE DATABASE 和 USE 语句如果脚本里指定的库名和你手动建的不一致执行时会自动切到脚本里的库后续验证就得按脚本里的库名查。还有一部分包直接给出图形工具导入路径打开 Navicat 或 MySQL Workbench右键目标连接下的数据库选 Run SQL File选中同一个脚本执行效果等价但命令行反馈更直观——报错会精确到第几行。导入完成后立刻验证防止后面白忙半天USE course_db; SHOW TABLES; SELECT sno, sname, spassword FROM student LIMIT 5;如果 SHOW TABLES 列出了 student、course、sc、admin 这类表说明表结构建好了最后一条 SELECT 能查出学生测试数据说明脚本里带入了初始数据。这里注意很多课程设计脚本的 insert 语句会把密码明文写在表里spassword 或 password 字段默认账号通常长这样——admin / admin123、student / 123456具体以脚本里的 insert 值为准不要盲信网传的默认值。查询返回空或者报“Table doesnt exist”就要回头检查是不是把脚本导进了别的库。2.3 核对连接层jdbc.properties 与 MySQL 驱动版本数据库就位后下一步是让源码里的连接配置指向这个库。JavaWeb 课程设计项目最常见的写法是 JDBC 直连连接参数通常集中在 src 下的 jdbc.properties也有叫 db.properties或者直接写在 DBUtil.java 里。打开后你应该看到这样四行drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/course_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse usernameroot password123456这四行是项目连接 MySQL 的命根子。driver 填驱动类全名username 和 password 必须是本机 MySQL 的真实账号。需要特别区分如果包内配套的是 MySQL 8.x驱动要写成 com.mysql.cj.jdbc.Driver 并加 serverTimezone否则启动时会报时区错误如果包是老项目、配的是 MySQL 5.x 的驱动 jardriver 才写成 com.mysql.jdbc.Driver。判断依据很简单——去 /lib 目录看 mysql-connector-java 的 jar 文件名里的版本号8.x 用前一种写法5.x 用后一种。还有一部分包用的是连接池DBCP 或 C3P0配置不在 jdbc.properties 而在 dbcp.properties 或 applicationContext.xml核心仍然是 URL、username、password 三兄弟改法一致。改完连接后顺手在 MySQL 里执行一条SELECT DATABASE();确认当前库再回 IDEA 启动项目就很少再遇到“能开机、点不动”的情况。这一步是后面所有调试的地基。3. 用 IDEA 运行 JavaWeb 项目Tomcat 配置、页面验证与版本搭配数据库就绪接下来就是把源码跑起来。一个 JavaWeb 课程设计 zip 的部署路径基本是固定的IDEA 导入、配置 Tomcat、启动、访问登录页。这里最容易出岔子的不是代码而是工程类型和运行时版本错位。3.1 先搞清楚导入的是 Maven 工程还是普通 Web 工程解压后的项目根目录如果存在 pom.xml它就是 Maven 工程如果只有 .classpath、.project 或纯 src WebRoot/src 的目录结构则是普通 Web 工程。两种的导入和运行方式完全不同搞反了会在后面浪费大量时间。Maven 工程常见做法是把 Tomcat 插件写进 pom.xml老项目里高频出现的是 tomcat7-maven-pluginplugin groupIdorg.apache.tomcat.maven/groupId artifactIdtomcat7-maven-plugin/artifactId version2.2/version configuration port8080/port path//path uriEncodingUTF-8/uriEncoding /configuration /plugin这段配置的意思是把 Tomcat 7 内嵌到 Maven 里启动port 指定端口path 指定根访问路径这里设为/后访问时不需要带工程名uriEncoding 是给表单提交和 URL 里的中文参数兜底的。在 IDEA 右侧 Maven 面板找到 tomcat7:run 双击就能启动。要提醒的是这个插件对 JDK 8 很友好但如果你本机装了 JDK 17 以上老插件会出现各种反射或类加载报错此时更推荐放弃 Maven 插件、改用下面这种本地 Tomcat 方式。另外 Spring 版本很老的项目Maven 依赖下载也可能因为仓库地址失效而卡住不要死磕。3.2 普通 Web 工程本地 Tomcat IDEA Artifact 部署普通 Web 工程没用 Maven 管理我一般这样配IDEA 里 File → Open 打开项目根目录确认 Project Structure 里的 SDK 是 JDK 8或包内 README 写明的版本再把 WebRoot/WEB-INF/lib 里的 jar 包加入 Libraries最后在 Run/Debug Configurations 里点加号选 Tomcat Server → Local在 Deployment 页签下添加一个 Artifact。这里有两个容易被忽略的配置项配置项推荐值踩坑点Deployment 里 Artifact 类型选 war exploded修改 JSP 不用反复重启适合赶工Application Context/course 或 /访问路径必须和这里完全一致选 war exploded 是因为课程设计期间会频繁改 JSP 和样式Exploded 部署能热更新页面如果选 war 包每次改动都要重新打包部署耽误时间。Application Context 决定最终访问的地址前缀设为 /course就要访问 http://localhost:8080/course/login.jsp设为 /则直接访问 http://localhost:8080/login.jsp。很多 404 都是因为这里写的名字和解压包目录名不一致。3.3 版本搭配表Tomcat、JDK、Servlet 的三角关系配置过程中最大的黑匣子是版本匹配。课程设计 zip 里的代码通常是多年前写的运行时的版本组合直接影响你会踩多少坑。我建议直接对照这个表来选Tomcat 版本建议 JDKServlet/JSP对课程设计包的态度7.0JDK 6/7/8Servlet 3.0 / JSP 2.2老包兼容好但缺新特性8.5JDK 8Servlet 3.1 / JSP 2.3最稳妥组合优先选9.0JDK 8Servlet 4.0 / JSP 2.3需确认驱动和依赖能跑10.0JDK 8Servlet 5.0 / jakarta.*老代码大面积 ClassNotFound不建议结论很直接拿到老课程设计包优先装 JDK 8 Tomcat 8.5。Tomcat 7 对 JDK 8 也兼容但 8.5 更稳定Tomcat 10 之后包名从 javax.* 变成 jakarta.*老源码几乎必须改 import赶工期别选它。配好之后启动一次如果后台日志没有异常直接访问登录页验证curl -I http://localhost:8080/course/login.jsp返回 HTTP/1.1 200 说明页面正常404 是 Context 路径不对500 则是运行时错误要看 Tomcat 的 logs/catalina.out八成是数据库连接或表没导进去。把这三件事做对项目就“活”了。4. 选课核心逻辑从先查后插到原子扣减课程设计里最该讲清楚的一块系统跑起来只是第一步答辩时老师最常问的就是“选课时课满了怎么办”。学生选课系统最核心的价值逻辑就三件事课程余量校验、选课冲突检测、数据一致性。这一章把三件事一次讲透也是你读懂这套源码里最重要的部分。4.1 课程设计的常见写法先查后插以及它为什么会超选绝大多数源码包里选课方法的骨架长这样先查课程余量再查有没有已选记录都通过后 insert 一条选课记录。用 JDBC 写出来大约是这样// 老项目最常见的选课写法先查后插 String checkSql SELECT capacity, selected FROM course WHERE cno ?; // 执行查询取出 capacity 和 selected if (selected capacity) { return 课程已满; } String checkSc SELECT COUNT(*) FROM sc WHERE sno ? AND cno ?; // 执行查询Count 0 则 return 已选过该课 return 可以选课执行 INSERT INTO sc ...;这段“先查后插”逻辑在演示时能跑通但它有三个隐患第一查余量和插入不是原子操作两个学生同时抢最后一个名额时两边都查出来“还剩 1 个”然后都插入成功余量就超了第二校验课满和真正插入之间隔了两次数据库往返中间状态可以被其他请求改写第三如果这段代码没有开事务插入失败时余量并不会回退。单用户演示看不出问题但老师一问并发这里就是全场哑火的点。解决办法并不复杂是让数据库来帮你守住边界。4.2 用一条原子 UPDATE 把“查余量”和“扣余量”合并正确做法是把校验写进 update 的条件里一条 SQL 同时完成检查和扣减。建议把选课方法改成这个结构public String doChoose(String sno, String cno) { String sqlUpdate UPDATE course SET selected selected 1 WHERE cno ? AND selected capacity; String sqlInsert INSERT INTO sc(sno, cno) VALUES(?, ?); conn.setAutoCommit(false); try (PreparedStatement ps1 conn.prepareStatement(sqlUpdate); PreparedStatement ps2 conn.prepareStatement(sqlInsert)) { ps1.setString(1, cno); int rows ps1.executeUpdate(); if (rows ! 1) { conn.rollback(); return 课程余量不足; } ps2.setString(1, sno); ps2.setString(2, cno); ps2.executeUpdate(); conn.commit(); return 选课成功; } catch (SQLException e) { conn.rollback(); return 选课失败 e.getMessage(); } }关键在 executeUpdate 的返回值UPDATE 影响行数只有 0 或 1。selected capacity 成立update 才会真正改到一行数据返回 1余量已为 0 时where 条件不成立影响行数是 0代码据此直接回滚返回“课程余量不足”。“判断是否满”和“占用一个名额”合并成了同一时刻内的一行锁操作并发下也不会超选。这比先 SELECT 再 if 判断、再 INSERT 的写法严谨得多是答辩时可以直接讲给老师听的加分点。顺带提一个隐蔽坑course 表建表时 selected 字段要写 DEFAULT 0如果允许空值且表里没有数据selected capacity 会因 NULL 永远不成立选课就会永远提示“余量不足”。4.3 冲突检测同一时间段的课不能重复选课程设计一般还有个隐含需求学生不能在同一时间段选两门课。对应到表结构需要 course 表里有一个表示上课时间的字段常见列名 ctime、classTime 或 time值类似“周一 3-4 节”。选课前做一次时间重叠查询SELECT COUNT(*) FROM sc JOIN course c ON sc.cno c.cno WHERE sc.sno ? AND c.ctime ?;把当前学生 sno 和目标课程 ctime 带进去Count 大于 0 说明该生已经在同一时间段选了别的课直接拒绝本次选课。这个方法在不少源码包里是缺失的拿到包后如果发现 course 表没有时间字段可以用ALTER TABLE course ADD COLUMN ctime VARCHAR(20)补上并在课程维护页面加一个时间录入框。这是把基础功能补完整不是推翻重来。冲突检测同样要放进事务里——哪怕检查通过了后续插入失败也要回滚否则用户会看到“冲突”提示库里却已经多了一条记录。把 4.2 的原子扣减和这里的冲突查询放进同一个事务commit 延迟到两个条件都通过后才发生这才是选了课还不出错的完整闭环。5. 选课系统避坑记录从 404 到中文乱码的 5 个真实翻车点下面直接给排查清单每条都是拿压缩包跑 JavaWeb 选课系统时的高频现场按“现象 → 原因 → 解决”整理照着核对能省下大半个晚上的血泪调试时间。5.1 登录页中文全部变成问号现象Tomcat 正常启动登录页中文标题、课程名全变成“??”但数据库 SELECT 出来是正确中文。 原因三处编码没统一——JDBC 连接字符集、JSP 页面编码、Tomcat 的 URI 编码。 解决按顺序检查jdbc.url 是否带了 characterEncodingutf8JSP 开头 contentType 是否写了 charsetUTF-8Tomcat 的 conf/server.xml 中 Connector 是否加了 URIEncodingUTF-8。三处对齐后重新部署乱码基本消失。还要注意 .sql 文件本身的编码用记事本另存为 UTF-8 格式再导入否则建表注释和初始数据从源头就是坏的页面救不回来。5.2 Tomcat 启动报 Address already in use现象点启动按钮控制台几行后报 java.net.BindException: Address already in useTomcat 起不来。 原因8080 端口被其他程序占用或上一次 Tomcat 进程没完全退出。 解决Windows 下执行netstat -ano | findstr 8080找出占用进程的 PID进任务管理器结束它也可以改 Tomcat 的 server.xml 把端口换成 8081但要同步改访问 URL并在 README 里记下来。课程设计演示时我见过不少人改了端口结果老师用 8080 访问、页面 404 的尴尬场景改配置一定要留痕。5.3 UnsupportedClassVersionError 类文件版本错误现象启动或编译时报 UnsupportedClassVersionError: class file has wrong version 55.0, should be 52.0 之类。 原因源码用 JDK 11版本号 55编译运行环境是 JDK 8版本号 52字节码版本对不上。 解决Project Structure 里把 Project SDK 和模块 Language Level 调成 8重新 Build 后再启动。省心的组合是 JDK 8 Tomcat 8.5。如果包内项目是老 JDK 编译的、本机只有 JDK 17装一个 JDK 8 并在 IDEA 里指定给该项目即可不建议为了跑老代码去大面积改源码容易闯下更多乱子。5.4 连接 MySQL 8 失败驱动与加密规则的“双杀”现象启动后后台报 Communications link failure或 Access denied for user rootlocalhost。 原因项目 lib 里是 MySQL 5 的旧驱动而本机 MySQL 是 8.xMySQL 8 默认 caching_sha2_password 认证旧驱动不认识URL 里也没带 serverTimezone。 解决把 lib 里的 mysql-connector-java 换成 8.0.x 版本driverClass 写成 com.mysql.cj.jdbc.DriverURL 加 serverTimezoneAsia/Shanghai 和 useSSLfalse。如果仍报 Access denied说明 root 账号还是新加密规则可以执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码;再FLUSH PRIVILEGES;。本地演示环境这样做无妨老包就能重新连上。5.5 数据库正常、页面也部署了却一直 404现象Tomcat 日志干净MySQL 查询正常访问 /login.jsp 始终 404。 原因Application Context 和实际访问路径不一致或 IDEA 部署的 artifact 选错war 包和 exploded 目录各打包了一份。 解决打开 Run/Debug Configurations确认 Tomcat Server 的 Deployment 里 Application Context 与访问路径完全一致。排查节奏是先 curl 访问路径看状态码404 先查 Context500 再看 catalina.out。多模块项目里还要注意是否把部署目标选到了别的 module 的 artifact 上把根 Context 设为 / 是最不易迷路的做法。6. 答辩前半小时把 zip 里的课设讲成一个有条理的小故事系统跑通之后真正的分水岭在答辩。老师不会关心你解压过几次只关心三件事表设计合理吗、核心业务有没有漏洞、你改动过什么。验收前我建议照两步走。第一用两条 SQL 给数据兜底。反复测试选课后course 表的 selected 可能被加得过满sc 表可能出现重复插入。先跑一遍诊断SELECT cno, cname, capacity, selected FROM course; SELECT sno, cno, COUNT(*) FROM sc GROUP BY sno, cno HAVING COUNT(*) 1;如果出现 selected capacity或者第二句查出超过 1 条记录说明测试时产生了脏数据需要清理后重新跑一遍。这个动作本身就是一次很好的数据库增删改查复习也是答辩时讲表结构的底气。第二把改动记进 README。你改了端口、改了密码、换了驱动版本、加了时间字段每一处都写下来。老师问“你改了什么”时你能从容说出每个改动的理由这比背一段教程式介绍可信得多。我自己当年演示翻车就是这样给 Tomcat 改了端口却忘了改访问 URL老师拿起鼠标输入 8080页面直接 404。那次之后我养成习惯每次改完配置先写一行记录再启动验证跑任何 JavaWeb 课程设计包都先做这个动作。备一个能讲的小故事也很有用用两个浏览器同时抢同一门课告诉老师“这里用一条 UPDATE 的 where 条件挡掉了超选风险”再用 4.3 的查询解释冲突检测。把这两段讲顺整套系统就不再是黑匣子而是一个你确实读透了、能经得住追问的学生选课系统。希望这篇能帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站