尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

JSP+MySQL宿舍管理系统:从部署到避坑的完整实践指南

发布时间:2026/9/26 4:21:36

资讯中心
01
ARTICLE

JSP+MySQL宿舍管理系统:从部署到避坑的完整实践指南

JSP+MySQL宿舍管理系统:从部署到避坑的完整实践指南
简介这是基于JavaJSPMySQL的Web学生宿舍管理系统完整项目采用B/S架构面向高校信息管理课程设计、Java Web初学者及需要快速搭建管理系统的开发者。系统覆盖宿舍信息增删改查、管理员登录验证等核心模块可直观理解JSP页面、Servlet控制层与JDBC数据访问的协作流程并借助MySQL脚本快速初始化库表结构。资源包共80个文件包含26个JSP页面、11个Java源码、22个编译后的class文件、10个CSS样式表及1个SQL数据库脚本总大小仅3.9MB轻量易部署适合导入Tomcat直接运行或二次开发。目前已有2018人学习下载。整套代码结构清晰前端、后端与配置文件分层存放附带工程配置与依赖JAR包可作为课程设计参考、毕业设计蓝本或Java Web入门实战练习帮助读者掌握从表单提交到数据库持久化的完整链路。1. 宿管老师报修说名单又在 Excel 里串行了这套 JSPMySQL 系统就是来收拾这个烂摊子的乱改一个单元格整栋楼的住宿信息就对不上号这是 Excel 管宿舍最典型的翻车现场。JavaJSPMySQL 实现的 Web 学生宿舍管理系统本质就是把这张随时可能崩的表格搬进浏览器做成一个 B/S 架构的管理后台管理员登录后新增、修改、删除、查询宿舍记录宿舍分配和学生入住情况也从散落的表格里收拢成一张可以检索的表。它没有 Spring Boot 那套自动装配的魔法恰好适合想把 Java Web 底子磨扎实的人——毕设选了宿舍管理、课设要交 JSP 项目的同学或者刚学完 Servlet 想找一个完整闭环案例的开发者。拆完它的 SQL 脚本和 web.xml 之后我的感觉是这系统虽然朴素但该有的链路一样没少值得照着跑一遍。2. 拆开压缩包先把 .idea、src、web、out 这四层关系理顺我拿到手的是一个 zip解压后能看到DormManagement.sql、DormManagement.iml、src、.idea、web、out六个部分。很多人习惯直接往里灌进 IDEA 点运行结果报各种错就是因为没搞明白这些目录谁管编译、谁管部署、谁管运行。先把根目录盘清楚后面所有排障都有据可查。2.1 压缩包目录拆解哪些是源码、哪些是编译垃圾、哪些千万别删用命令看一下整个根目录的结构大概是这个样子├── DormManagement.iml # IDEA 的模块描述文件记录源码路径和依赖 ├── DormManagement.sql # 数据库初始化脚本建库建表插数据都在这里 ├── .idea/ # IDEA 工程配置目录含编译器、artifacts 设置 ├── src/ # Java 源码Servlet、DAO、JavaBean 都在这里 ├── web/ # Web 根目录JSP 页面、WEB-INF、静态资源 └── out/ # IDEA 编译输出class 文件、war exploded 结果这里最容易被忽视的是out。它在 IDEA 里是编译产物目录web目录下的 JSP 和src目录下的 Java 源码最终会被拼装到out里形成一个可以被 Tomcat 识别的 Web 应用目录结构。你把src里的代码改得再漂亮不触发编译、out里没刷新跑起来的还是旧版本——这种“改了没反应”的问题十有八九是没注意到out的缓存逻辑。.iml文件的作用是告诉 IDEA 这个模块的源码根和依赖在哪里。我遇到过一个情况复制项目给别人时漏了.iml结果 IDEA 打开后找不到src目录整个工程全是灰色文件。所以这个 xml 文件看着小实际是 IDEA 项目的指路牌。.idea目录里比较有价值的是artifacts和compiler.xml它们决定了打包成 war 还是 exploded 结构以及编译输出路径。2.2 web.xml 与 Servlet 映射整个项目的运转主线路传统的 JSP 项目没有 Spring 的前端控制器谁来接请求、接到请求后交给哪个 Java 类处理全部由web/WEB-INF/web.xml说了算。打开这个文件核心的配置段长这样?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 !-- 登录处理 Servlet -- servlet servlet-nameLoginServlet/servlet-name servlet-classcom.dorm.servlet.LoginServlet/servlet-class /servlet servlet-mapping servlet-nameLoginServlet/servlet-name url-pattern/login/url-pattern /servlet-mapping /web-appservlet-class写的是类的全限定名url-pattern则是你将来在浏览器里访问的路径。比如把这个项目部署到 Tomcat 后访问http://localhost:8080/dorm/loginTomcat 拿到/dorm/login会先去匹配 context path也就是/dorm剩下的/login交给 Servlet 容器去 web.xml 里找映射。找不到映射就是 404找错映射就是 500所以每新增一个功能模块第一件事就是回头看一眼这里。整个请求链路串起来是这样浏览器发请求 → Tomcat 根据 URL 匹配到 Servlet → Servlet 解析 request 参数 → 调 JavaBean 或 DAO 访问 MySQL → 拿到结果后跳转到 JSP 页面 → JSP 里用 Java 代码片段把数据渲染成 HTML。这条链路里JSP 可以理解成“长了 Java 的 HTML”它负责展示Servlet 负责接收请求和控制跳转JavaBean 负责装数据。这个系统的所有功能说白了都是顺着这条主线在跑。3. 先让数据库立住从 SQL 脚本推演出核心表结构与字段落点很多同学拿到.sql脚本的第一反应是直接双击导入导入失败后才开始看内容。我偏向反过来先读一遍脚本里的建表语句搞清楚管理员和宿舍、宿舍和学生之间的数据关系再动手导库。这样出了问题你知道是哪个表报错而不是对着 Navicat 的红字干瞪眼。3.1 从 SQL 脚本反推表结构管理员、宿舍、住宿登记怎么关联DormManagement.sql里通常包含建库、建表、插初始数据三个部分。按这类系统最常见的建模核心表一般有三张管理员表、宿舍表、住宿登记表。我按照这套系统的需求推演建表语句通常是下面这个样子-- 管理员表登录和身份识别 CREATE TABLE admin ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL, real_name VARCHAR(50) ); -- 宿舍表记录楼栋、房间号和容量 CREATE TABLE dorm ( dorm_id INT PRIMARY KEY AUTO_INCREMENT, building_no VARCHAR(20) NOT NULL, room_no VARCHAR(20) NOT NULL, capacity INT DEFAULT 4, current_count INT DEFAULT 0 ); -- 住宿登记表学生住宿的关联记录 CREATE TABLE student_dorm ( id INT PRIMARY KEY AUTO_INCREMENT, stu_no VARCHAR(20) NOT NULL, stu_name VARCHAR(50) NOT NULL, dorm_id INT NULL, in_date DATE, FOREIGN KEY (dorm_id) REFERENCES dorm(dorm_id) );三张表各自承担一个职责admin表管登录它只存身份信息username 设了 UNIQUE 约束是为了防止出现两条同名管理员记录dorm表管宿舍资源capacity是最大容量current_count是当前已入住人数这俩字段在 JSP 页面做宿舍剩余床位展示时直接用不需要每次去 JOIN 子查询student_dorm表管入住关系dorm_id允许为空意味着这个学生当前不占床位方便后面做退宿操作时直接把dorm_id置空。字段顺序和约束是这套系统的关键。AUTO_INCREMENT保证主键不用手动维护DEFAULT 4把宿舍默认容量定成四人寝这些默认值在录入数据时能省掉不少重复劳动。之所以把current_count单独存而不是靠 COUNT 关联查询一是为了兼容老版本 MySQL 的查询性能二是减少复杂 JOIN——在 JSP 这个技术栈里能用一次简单查询解决的事尽量别让数据库去做大计算。3.2 JDBC 连接与参数文件URL、驱动、时区和 SSL 的一次说清Java 代码访问 MySQL 走的通道是 JDBC这套系统的数据访问层通常不会用 MyBatis 这类框架而是直接拿 JDBC 写。连接数据库的配置一般抽成一个jdbc.properties放在src目录下内容大概是drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/dormdb?characterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai usernameroot password123456每个参数都有讲究。localhost:3306是 MySQL 的默认地址和端口3306 没改过就用默认dormdb是库名要和create database里的名字严格一致大小写都别马虎。characterEncodingutf8是让数据库连接以 UTF-8 编码传输中文不设这个参数JSP 页面读出来的宿舍楼栋名大概率是乱码。useSSLfalse在本地开发时建议关掉MySQL 8 的驱动默认开启 SSL 校验证书对不上会直接抛连接异常。serverTimezoneAsia/Shanghai是 MySQL 8 的硬性要求老版本的驱动反而看不懂这个参数所以加之前先确认你用的连接驱动版本。获取连接的代码常见做法是封装一个工具类import java.sql.Connection; import java.sql.DriverManager; import java.util.ResourceBundle; public class DbUtil { private static String url; private static String username; private static String password; static { // 读取 classpath 下的 jdbc.properties ResourceBundle bundle ResourceBundle.getBundle(jdbc); url bundle.getString(url); username bundle.getString(username); password bundle.getString(password); try { Class.forName(bundle.getString(driver)); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws Exception { return DriverManager.getConnection(url, username, password); } }这里的static代码块在类第一次被加载时执行保证驱动只注册一次这是 JDBC 的老规矩。ResourceBundle.getBundle(jdbc)会自动从 classpath 里找jdbc.properties文件注意文件名不能带.properties后缀。getConnection()每次调用都返回一个新连接这在课设项目里够用如果追求性能可以换成连接池但那是后话。4. 在 IDEA 里把项目拽起来Tomcat 部署与 JDBC 连接的五个关键步骤接下来的目标只有一个让浏览器能打开登录页。这一步卡住过非常多的人而且翻车点往往不在代码本身而在部署路径和配置细节上。我按执行顺序把这五个步骤拆开每一步做完可以停一下看一眼效果别一口气点到底。4.1 先导数据库命令行或 Navicat 执行 DormManagement.sql数据库是系统的底座要先于代码跑起来。我习惯用命令行执行直观也方便排查mysql -u root -p DormManagement.sql你会被提示输入 MySQL 的 root 密码成功后不会有任何输出直接回到提示符。如果想确认导入结果进 MySQL 客户端看看mysql -u root -p USE dormdb; SHOW TABLES;如果显示了三张表说明脚本执行成功。用 Navicat 的朋友操作更简单右键连接 → 运行 SQL 文件 → 选择DormManagement.sql。这里有一个执行顺序的细节容易被忽视脚本里如果有多条CREATE TABLE必须先创建带外键约束的父表admin、dorm再创建依赖外键的子表student_dorm顺序错了会在建表时报外键关联不到的错误。4.2 IDEA 导入项目并关联 TomcatOpen 而不是 New Project拿到项目后最忌讳的操作是 New Project 从头建一个再往里贴文件那会丢失所有模块结构。正确做法是 IDEA 欢迎页选 Open定位到解压后的DormManagement根目录不是选里面的src也不是选web要选最外层、包含.iml文件的那个目录。导入后先检查右侧 Maven 面板——这套系统不依赖 Maven如果 IDEA 弹窗问你是否加载 Maven 项目选不加载。Tomcat 的关联分两步。第一步是 Project Structure → SDK 里选中本机 JDK第二步是 Run/Debug Configurations → 左上角加号 → Tomcat Server → Local。在 Deployment 标签页里点加号选 Artifact找到带:war exploded后缀的那个它的 context path 建议改成/dorm。这里选 exploded 而不是 war是因为开发阶段改代码后 Tomcat 能直接读编译产物改完刷新页面就能看到效果省掉每次重新打包的等待时间。4.3 启动验证控制台状态和浏览器访问各看什么配置完成后点启动观察 IDEA 底部的 Tomcat 日志输出。看到Server startup in字样说明 Tomcat 起来了但项目是否部署成功要看后面有没有一行Deployment of web application archive或Starting protocol之类的记录。浏览器访问http://localhost:8080/dorm/会跳到系统的登录页或首页。提示如果访问出现 404先检查地址里的/dorm和你在 Deployment 里配的 Application context 是否完全一致路径不匹配是 JSP 项目首次运行时最高频的错误之一。mysql-connector-java的 jar 包这个环节要格外留意。IDEA 左侧 External Libraries 里能看到它只代表编译期通过了运行时装不装得进去是另一回事。确认 jar 已经放进web/WEB-INF/lib目录IDEA 里叫 Add as Library这一步漏掉就会出现第 5 章要讲的ClassNotFoundException。另外很多同学会在out目录里翻来找去疑惑为什么改了代码没生效——每次改完 Java 文件让 IDEA 重新编译确认out里的 class 时间戳更新了再刷新浏览器这个习惯能省掉半天排障时间。5. 避坑手册五条能让新手在 JSPMySQL 上翻车的典型路径这套系统踩过坑的人绝对不在少数而且坑位高度集中。我按出现频率从高到低把最典型的五类问题整理出来每条都按现象、原因、解决的顺序讲透你遇到时直接对号入座。5.1 现象 1Tomcat 启动即报 8080 端口被占用现象IDEA 控制台出现一行BindException: Address already in use: JVM_Bind:8080Tomcat 卡在启动阶段起不来。原因8080 是 Tomcat 默认端口另一个 Tomcat 实例、某个 Java 服务或者别的程序占用了它。这个错误特别迷惑人的一点是有时候你看不见任何浏览器窗口但后台确实驻留着一个老旧的 Tomcat 服务。解决先找到占用者再处置。Windows 命令行执行netstat -ano | findstr 8080记下最后一行显示的 PID然后taskkill /F /PID 进程号直接结束它。或者干脆给当前 Tomcat 换个端口打开conf/server.xml把 Connector 标签里的port8080改成port8081重启后再访问http://localhost:8081/dorm/。改端口的副作用你得心里有数所有访问地址的端口号都要跟着变不然你会误以为项目又坏了。5.2 现象 2页面能开但数据库一操作就抛 ClassNotFoundException现象登录页正常显示输入账号密码点登录页面直接报java.lang.ClassNotFoundException: com.mysql.jdbc.Driver或com.mysql.cj.jdbc.Driver。原因两种情况。一是mysql-connector-java的 jar 包根本没进web/WEB-INF/libIDEA 编译期能找到依赖运行时 Tomcat 却加载不到二是驱动类名写错了——MySQL 5.x 的驱动类是com.mysql.jdbc.DriverMySQL 8.x 换成了com.mysql.cj.jdbc.Driver写旧类名去加载新驱动必然抛类找不到。解决先打开web/WEB-INF/lib看有没有mysql-connector-java-8.0.x.jar没有就把 jar 拷进去然后在jdbc.properties里把driver改成和 jar 版本匹配的类名。这是这套系统最常见的环境配置坑因为它是传统 Web 项目依赖打包方式跟 Maven 自动下载完全不同jar 必须老老实实躺在WEB-INF/lib里。5.3 现象 3系统能跑但页面上中文全是乱码现象宿舍楼栋名显示成“瀵硅寖澧?”管理员姓名变成一堆火星文。原因三级编码没有对齐。第一级是 JSP 页面本身的pageEncoding第二级是 MySQL 连接串的characterEncoding第三级是数据库和表的字符集。任意一级不统一中文进出数据库都会产生乱码。解决JSP 页面头部统一写成% page contentTypetext/html;charsetUTF-8 %数据库连接串里加上characterEncodingutf8建库时指定DEFAULT CHARSETutf8mb4。如果这三个地方都对了但还是乱多半是接收请求的 Servlet 忘了设置request.setCharacterEncoding(UTF-8)把它加在getParameter之前最好使。这套规则我后来做每一个 Java Web 项目都强制用一遍治乱码比什么都灵。5.4 现象 4Tomcat 正常启动但访问登录页出现 404现象控制台看到 Tomcat 启动成功但http://localhost:8080/dorm/返回 404或者出现的是 Tomcat 默认首页而不是系统登录页。原因Deployment 里没有添加 Artifact或者 Application context 路径和访问地址不一致。很多新手在 Run Configurations 里只配了 Server 没配 DeploymentTomcat 起来了但没带你的应用另外web.xml里url-pattern写得和页面实际路径也对不上JSP 页面如果放在WEB-INF目录下直接浏览器访问也会 404因为WEB-INF下的资源不允许外部直接访问只能通过 Servlet 内部转发。解决打开 Run/Debug Configurations → Deployment看列表里有没有你的 artifact没有就加进来Application context 填/dorm。访问时确认路径是http://localhost:8080/dorm/login.jsp还是http://localhost:8080/dorm/login后者取决于web.xml有没有给登录 Servlet 配/login映射。JSP 直接放web根目录就能被访问放WEB-INF就一定要通过转发这个区分是很多 JSP 项目 404 的根源。5.5 现象 5MySQL 连接超时、时区报错或 socket 连接失败现象页面操作时抛Communications link failure或提示The server time zone value йʱ is unrecognizedLinux 环境下还容易看到ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock。原因MySQL 8 引入了服务端时区概念驱动连接时如果 URL 里没带serverTimezone参数就跟服务端对不上Communications link failure通常是 MySQL 服务没启动或者连接串端口写错ERROR 2002则是客户端连localhost时走了 socket 文件而 MySQL 服务根本没起来。解决先确认 MySQL 服务状态——Windows 服务管理器里看MySQL80是否运行Linux 执行systemctl status mysql连接串完整写法直接抄这个jdbc:mysql://localhost:3306/dormdb?characterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue这个参数在 MySQL 8 的某些鉴权插件下也得带上否则会有明文密码传输的报错。这条解决了数据库连接基本就稳了。6. 从“能跑”到“能改”给系统加一个退宿登记的完整流程读懂了这套系统的结构之后最有价值的练手方式就是给它加一个小功能。我来演示一个“退宿登记”的完整落法正好把数据库、DAO、Servlet、JSP 这四层全部串起来。这个功能的核心逻辑很简单学生退宿时把student_dorm表里对应记录的dorm_id置空并记下退宿日期。第一步动数据库在你的表上补一个字段ALTER TABLE student_dorm ADD COLUMN out_date DATE NULL;第二步写 DAO 方法负责执行更新public int outDorm(String stuNo) throws Exception { String sql UPDATE student_dorm SET dorm_id NULL, out_date ? WHERE stu_no ?; try (Connection conn DbUtil.getConnection(); PreparedStatement pstmt conn.prepareStatement(sql)) { pstmt.setDate(1, new java.sql.Date(System.currentTimeMillis())); pstmt.setString(2, stuNo); return pstmt.executeUpdate(); } }注意setDate(1, ...)接收的是java.sql.Date不是java.util.Date这是老手也容易写错的点。executeUpdate()的返回值代表影响行数返回 1 说明更新成功返回 0 说明学号不存在或者已经退过宿这个返回值可以做页面提示。第三步在 Servlet 里接参数、调 DAO、跳转页面。最后在 JSP 里加一个表单入口把学号传给处理退宿的 Servlet。这个分工本身就是这套系统给我的最大收获JSP 只负责把表单渲染出来Servlet 只做事别把业务逻辑写成页面里一大坨的% %脚本。验证方法我习惯三步走先看 Tomcat 控制台有没有报错再看浏览器页面跳转对不对最后直接去数据库里SELECT * FROM student_dorm WHERE stu_no 你的测试学号;确认dorm_id真的成了NULL。三个点对上这个功能才算真的落地。有了这次成功的扩容经验再碰到这种 JSP 老系统我就不会再被它的“旧”唬住了——先读web.xml再读 SQL 脚本这两个文件不乱系统基本就能跑得起来。从那以后我每次拿到这类项目源码都强制自己先走一遍这个流程再动手改希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。