☰
JSP+MySQL学生宿舍管理系统:从环境配置到Tomcat部署与二次开发
2026/10/6 12:45:43 网站建设 项目流程

简介:基于JSP与MySQL的学生宿舍管理系统实训项目,面向Java Web初学者、课程设计及毕业设计人群,主要用于解决宿舍分配、住宿费用、报修维修、统计报表和用户权限等管理场景,既可作为实训作业的完整参考,也可作为二次开发的项目底座。压缩包共67个文件,约5.55MB,包含17个Java源文件与对应class文件、10个JSP页面、8个XML配置、7个JAR依赖库、1个SQL数据库脚本及1份docx作业文档,代码、数据库、说明文档齐全,导入IDE后即可查看运行逻辑并继续修改。系统遵循高内聚低耦合原则,后台业务逻辑与数据库表结构分层清晰,SQL脚本可快速初始化宿舍、学生、费用、报修等数据,docx文档对系统架构、功能模块和部署步骤进行了说明。目前已有69人学习下载,适合需要对照完整项目理解JSP与MySQL整合流程、准备实训答辩或在此基础上扩展功能的学习者使用。

1. 把这份 JSP + MySQL 学生宿舍管理系统当黑匣子拆开:先跑起来,再谈改代码

这套基于 JSP + MySQL 的学生宿舍管理系统,是典型的 JavaWeb 实训作业形态:Maven 工程 + Servlet + JSP 页面 + MySQL 数据库脚本 + 设计文档打包在一起。它不像企业级 Spring Boot 项目那样有复杂的中间件依赖,核心链路就是浏览器发请求、Tomcat 里的 Servlet 接住、JDBC 查 MySQL、JSP 把结果渲染回页面。正因为结构传统,它反而适合用来理解 JavaWeb 最底层的请求-响应模型,也适合作为毕设或实训的骨架二次开发。我拆完这套源码后最大的感受是:能不能跑起来,百分之八十取决于环境和配置,而不是代码本身——这恰恰是新手最容易卡住的地方。

2. 拆项目结构:Maven 工程、JSP 页面与 Servlet 的分工边界

2.1 先从目录结构认出这套代码的路子

解压java-web-student-housion-manager-master.zip之后,你会看到这样的顶层结构:src、web、sql、doc、pom.xml,外加一些 IDE 配置文件。先别急着开代码,按目录把职责分清楚,后面排错时才知道去哪一层找问题。

src/main/java里放的是 Java 源码,包括 Servlet 控制器、JavaBean 实体类、JDBC 工具类;src/main/webapp里是 JSP 页面、CSS、JS 和 WEB-INF 下的web.xml;sql目录下的studenthousionmanager.sql是完整的建库建表脚本;doc目录下的作业.docx是配套的实训报告。pom.xml说明这是一个 Maven 管理的 Web 工程,不是手工拷 jar 包的传统 Eclipse 项目——这一点很重要,因为 Maven 会自动拉依赖,你不需要去网上下载 mysql-connector 再手动 build path。

看这类老 JavaWeb 工程,我一般会先确认两件事:第一,web.xml里配置的 Servlet 映射路径是什么,这决定了 URL 怎么访问;第二,JDBC 连接串写在哪个文件里,这决定了数据库连不连得上。这两处是最容易出问题的地方,后面会逐个展开。

2.2 pom.xml 到底管了什么:依赖、打包方式与 Tomcat 版本关系

打开pom.xml,核心内容其实是三段:packaging标签、依赖列表、构建插件。packaging通常是war,说明最终要打出 Web 归档包丢给 Tomcat 部署,而不是打成 jar 直接运行。依赖里最关键的三个:javax.servlet-api提供 Servlet 和 JSP 的编译支持,它的scope是provided,意思是 Tomcat 自己带这份库,打包时不会重复打进去;mysql-connector-java是 JDBC 驱动,这个必须是compile或默认 scope,否则运行时找不到驱动类;可能还有一个jstl依赖,用来在 JSP 里写<c:forEach>这类标签。

依赖版本和 Tomcat 版本有关系:如果你的 Tomcat 是 9.x,对应javax.servlet命名空间;如果将来想迁到 Tomcat 10,Servlet 包名会变成jakarta.servlet,旧代码的 import 全要改。常见做法是保留 Tomcat 9,让代码改动最小。我一般会先用mvn -version确认本机 Maven 版本,再mvn clean package看依赖能不能拉全——这一步失败往往不是代码问题,而是 Maven 仓库源访问不了。

2.3 JSP 与 Servlet 的数据流:一次登录请求走完的路径

理解这套系统的运行逻辑,最简单的方式是跟一条完整请求链路。假设管理员在login.jsp输入账号密码点登录,浏览器把表单 POST 到LoginServlet的映射地址,Servlet 里通过 JDBC 查数据库,验证通过后request.getSession().setAttribute写入会话,再forward或redirect到首页;验证失败则带错误提示返回登录页。JSP 页面本身不做复杂逻辑,只负责用<%= %>或 EL 表达式从 request/session 取值渲染。

看代码时优先找DBUtil或BaseDao这类工具类,它会暴露这套系统的数据库访问方式。典型写法是静态代码块里注册驱动、建立连接、提供executeQuery和executeUpdate两个通用方法:

public class DBUtil { private static String url = "jdbc:mysql://localhost:3306/studenthousionmanager?useSSL=false&characterEncoding=utf8"; private static String user = "root"; private static String password = "123456"; static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException("MySQL 驱动加载失败", e); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } }

这段代码里三个参数需要按你的环境改:localhost:3306是数据库地址和端口;studenthousionmanager是库名,要和你导入 SQL 时建的库一致;root / 123456是本机 MySQL 的账号密码。characterEncoding=utf8是为了让中文写入数据库不乱码,useSSL=false是避免本地调试时 MySQL 提示 SSL 握手警告。如果 MySQL 是 8.0 版本,驱动类要改成com.mysql.cj.jdbc.Driver,连接串里还得加serverTimezone=Asia/Shanghai,否则会报时区错误。

顺着这个思路,任何请求出问题,排查顺序永远是:先看请求到没到 Servlet(Servlet 里加System.out.println),再看 SQL 有没有查对(把 SQL 语句打出来),最后确认是渲染还是数据问题。

3. 数据库先行:studenthousionmanager.sql 的表关系与初始化

3.1 库表设计:学生、宿舍、住宿记录与费用的关联方式

打开studenthousionmanager.sql,整体设计思路是围绕「人-房-账」三条主线的。学生表存个人基本信息和班级学号,宿舍表存楼栋、房间号、床位容量和当前入住人数,住宿分配表把学生和宿舍关联起来,费用表记录应交、实交和欠费状态。表与表之间通过主键和逻辑外键关联,比如住宿记录表里有学生 ID 和宿舍 ID,费用表里有学生 ID 和住宿记录 ID。

先看表结构,重点观察字段类型与约束设计。床位余量一般用available字段存整数,或者在查询时通过「容量 - 已入住」实时算出来;这种设计差别会影响后面的统计 SQL。如果你是从零做二次开发,随手加一遍三张核心表的建表语句就能看出作者的设计风格:是倾向于把逻辑算好存冗余字段,还是只用关联查询现算——这决定了你后面改功能时动的字段是哪些。

3.2 导入 SQL 脚本的正确姿势:命令行与图形化两种方式

拿到studenthousionmanager.sql之后,先在 MySQL 里把脚本执行一遍。命令行方式最稳,不容易出现图形工具编码错乱的问题。前提是你已经用mysql -u root -p能正常登录,并且 MySQL 服务已经在运行。

mysql -u root -p < studenthousionmanager.sql

执行完后,用SHOW DATABASES;确认studenthousionmanager库已创建,再切进去查一下关键表:

USE studenthousionmanager; SHOW TABLES; SELECT COUNT(*) FROM student;

如果 SELECT 返回 0 或者报「Table doesn't exist」,大概率是脚本执行时默认连到了错误的库,或者脚本里没有CREATE DATABASE语句而你把输出重定向到了别的库。用 Navicat 之类的图形工具操作时,注意脚本里的SET NAMES utf8或utf8mb4不要被工具覆盖,否则中文字段值会变成问号。导入完数据后,先用SELECT * FROM user LIMIT 5;抽查管理员账号是否存在,这是确认数据初始化成功最直接的方式。

3.3 MySQL 版本差异:5.7 与 8.0 的字符集和驱动坑

很多实训代码的时间比较早,默认按 MySQL 5.7 的环境写的。如果你本机装的是 MySQL 8.0,至少要处理两个差异:驱动类名和认证方式。5.7 时代常用com.mysql.jdbc.Driver,8.0 里这个类已经标记废弃但还在,建议改成com.mysql.cj.jdbc.Driver;同时 8.0 默认的caching_sha2_password认证方式会导致部分老客户端连接失败,最简单的处理是把用户认证改为mysql_native_password,SQL 是ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';。

差异项MySQL 5.7MySQL 8.0
驱动类名com.mysql.jdbc.Drivercom.mysql.cj.jdbc.Driver
连接串时区可不写建议加 serverTimezone=Asia/Shanghai
默认认证mysql_native_passwordcaching_sha2_password
建表默认字符集utf8utf8mb4

还有一个隐蔽问题:8.0 的utf8mb4已经是默认字符集,但你导入的脚本如果写的是DEFAULT CHARSET=utf8,在 5.7 下正常,在 8.0 下还兼容;反过来,脚本若带了 8.0 才支持的语法,5.7 可能直接报错。所以遇到 SQL 导入失败,先确认 MySQL 版本是不是和当初写代码的人一致。

4. 把源码跑起来:配置、打包、部署与联调全流程

4.1 修改 JDBC 连接配置:三个必改参数

在src/main/java下找到DBUtil.java或db.properties,把连接串、账号、密码按本机环境改掉。如果项目用的是properties文件方式,格式一般是jdbc.url、jdbc.username、jdbc.password三行。这里有个常见分歧:有的项目把配置写在 Java 类里,有的写在.properties里,还有的写在web.xml的 context-param 里——先全局搜索getConnection或DriverManager在哪,就能定位配置位置。

改完配置后,我一般会在DBUtil的main方法里写一段临时测试,直接调用getConnection()看能否连上。这一步能在启动 Tomcat 前就把数据库配置问题暴露出来,比部署后看 Tomcat 日志快得多。

4.2 Maven 打包 war:从 clean 到 deploy

配置改好之后,打开命令行进入项目根目录,执行 Maven 打包命令:

mvn clean package

第一次执行会下载大量依赖,如果网络慢或者 Maven 源不是国内镜像,package阶段容易超时。常见做法是修改 Maven 的settings.xml,把中央仓库镜像换成阿里云镜像,再继续执行。打包成功后,target目录下会生成JavaWebStudentHousionManager.war文件。

4.3 Tomcat 部署与初始化数据验证

把.war文件复制到 Tomcat 的webapps目录下,然后启动 Tomcat。运行方式取决于你的 Tomcat 版本和操作系统,这里用最常见的脚本方式:

# Linux / macOS $CATALINA_HOME/bin/startup.sh # Windows %CATALINA_HOME%\bin\startup.bat

启动后,Tomcat 会自动解压 war 文件。先确认启动日志有没有报错,再访问http://localhost:8080/JavaWebStudentHousionManager/看到登录页,说明部署成功。然后按数据库里的管理员账号登录,逐一测试功能路径。

4.4 功能验证清单

功能模块验证操作预期结果
管理员登录输入正确账号密码跳转管理首页,会话建立
学生信息管理新增一条学生记录列表页出现新记录
宿舍分配给学生分配宿舍宿舍入住人数 +1
费用管理添加住宿费记录费用列表出现记录
报修登记提交一条报修报修记录进入列表

这套系统本质上是「增删改查 + 登录鉴权」的组合,如果登录能通、新增能看到、修改能生效,核心链路就没问题。统计报表模块如果报 SQL 异常,通常是表名和 SQL 脚本里的实际表名不一致,重点检查多表 JOIN 的字段是否大小写不敏感。

5. 翻车记录:部署与运行常见的五个坑

5.1 现象:页面和数据库中文全部变成「???」

原因:连接串没指定characterEncoding=utf8,或者数据库本身的字符集是 latin1,导致 UTF-8 字符在写入 MySQL 时被转成问号。

解决:修改 JDBC URL,加上characterEncoding=utf8;同时检查建表语句,确保表的DEFAULT CHARSET是 utf8 或 utf8mb4。改完连接串后重启 Tomcat,再用UPDATE把脏数据删掉重新插入测试。

5.2 现象:Tomcat 启动后访问报 404 / ClassNotFoundException

原因:war 包里的类没有编译进去,常见于 Maven 打包时跳过编译,或者 JDK 版本与编译参数不匹配。

解决:先执行mvn clean,再mvn package,确认target里有classes目录;检查pom.xml里maven-compiler-plugin的 source/target 是否低于你本机 JDK 版本。部署后重启 Tomcat,清空浏览器的缓存和 Cookie,避免拿到旧会话。

5.3 现象:MySQL 8.0 下提示「Public Key Retrieval is not allowed」

原因:连接 8.0 数据库时,客户端缓存了旧的公钥信息,或者 JDBC 驱动版本太旧,不知道如何从服务器获取公钥。

解决:在 JDBC 连接串加一个参数:allowPublicKeyRetrieval=true。同时确认 pom 里的 mysql-connector-java 版本不低于8.0.11,不然还是走老认证逻辑。

5.4 现象:Tomcat 启动报 8080 端口被占用

原因:本机有别的进程占用了 8080,常见的是另一个 Tomcat 实例、Java 进程或开发工具内置服务器。

解决:找出占用进程并结束。命令行里用netstat -ano | findstr 8080(Windows)或lsof -i:8080(macOS/Linux)定位 PID,结束进程后重启;或者修改 Tomcat 的server.xml把端口改到 8081,同时保证 JDBC 连接串里的 MySQL 端口不是 8080,两者不要混。

5.5 现象:登录后跳转报空指针,或列表页整页空白

原因:从数据库查出来的结果集在 JSP 里取值时字段名不匹配,比如 SQL 里用了as别名但 JSP 里取原名,或者request.getSession().getAttribute拿到 null 直接做了运算。

解决:在 Servlet 里打印查询出的对象,确认字段值都在;检查 JSP 页面取值用的 key 是否和 Servlet 里setAttribute的 key 完全一致,大小写、下划线都不能错。空白页八成是页面抛了未捕获异常,直接看 Tomcat 的catalina.out日志,能精准定位到哪一行 NPE。

6. 二次开发的正确姿势:日志定位、SQL 追踪与页面改版

6.1 先看日志再改代码

拿到这套源码后,别急着在 JSP 页面里删删改改。先把 Tomcat 的日志输出打开,conf/logging.properties里调整org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level的级别,最省事的办法是看logs/localhost.yyyy-MM-dd.log。浏览器里操作一个功能,然后回去翻日志——所有异常、断点、SQL 报错都会出现在这里。这个习惯能帮你把「改代码→重新打包→部署→已验证」的循环缩短一半。

6.2 用 Navicat 直接改数据验证页面逻辑

想快速验证一个页面字段是否绑定正确,不必反复走管理系统里的新增流程。直接在 Navicat 里对目标表做一条INSERT,刷新页面确认展示,再决定是否需要改 JSP 里的取值语句。这比在界面里点半天快得多,也方便造边界数据来测空值显示。

6.3 给 JSP 页面加一个最小分页实现

这套系统如果没做分页,数据一多列表页就会很长。最小实现思路:Servlet 里接收pageNo参数,用LIMIT offset, pageSize查出当前页数据,同时查总记录数算出总页数,把结果存进 request。JSP 页面里放上一页/下一页链接,用${pageNo}拼参数。改成LIMIT #{offset}, #{pageSize}时注意 MySQL 的参数顺序,offset 是跳过的行数,pageSize 是取多少行,两个参数最容易写反。改完测试时重点验证末页和越界页,防止首页点「上一页」直接报错。

6.4 我的收尾习惯

碰到这类实训源码,我现在的固定流程是:备份原始 war 和 SQL → 改 DBUtil 连接串 → 用 Navicat 先跑通 SQL 脚本 → 启动 Tomcat 验证登录 → 记录下所有修改点。这套习惯是从拆第一份 JSP 项目翻车之后养成的——当时直接改代码,改到一半发现数据库里根本没数据,浪费了一整晚。从那以后我每次拿到陌生源码都强制先走一遍「环境初始化 + 验证清单」再动代码。这套宿舍管理系统代码量不大,但结构完整,做毕设改造时想要什么功能都能顺着原有链路加。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询