ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Servlet+JSP+MySQL宿舍管理系统:从环境搭建到二次开发全流程

Servlet+JSP+MySQL宿舍管理系统:从环境搭建到二次开发全流程 简介这是一套面向高校计算机相关专业学生的JavaWeb学生宿舍管理系统完整源码与配套教程基于Servlet、JSP与MySQL技术栈开发适合用作期末大作业、课程设计或毕业设计参考难度适中对刚接触JavaWeb开发的学习者较为友好。压缩包共202个文件约7.21MB涵盖22个JSP页面、21个Java类、73个JavaScript脚本、16个CSS样式及7个jar依赖包另含SQL建库脚本、yml与xml配置文件、md说明文档等前端引入Bootstrap与jQuery DataTables等组件结构完整、层次清晰。目前已有248人学习下载。源码均经本地编译验证可运行评审分达98分并附有使用教程读者可据此快速理解宿舍管理模块的数据库设计、Servlet请求处理与页面交互逻辑掌握从环境搭建到功能调试的完整流程为后续项目开发与答辩提供可复用的参考方案。1. 从一份能跑起来的 ServletJSPMySQL 宿舍管理系统说起很多同学做毕设或者课程设计时都会搜到「基于 ServletJSPMySQL 开发 JavaWeb 学生宿舍管理系统源码使用教程」这类资源。它本质上是一个典型的 JavaWeb 三层架构项目Servlet 负责接收请求和业务调度JSP 负责页面渲染MySQL 负责数据持久化中间用 JDBC 或简单的 DAO 模式串联。它解决的核心问题是把宿舍楼、房间、学生、入住退宿、报修这些线下台账搬到浏览器里让宿管员和学生各自登录后看到自己权限内的数据。这套技术栈虽然老但它是理解 JavaWeb 请求流转最直接的路径——你能亲眼看到一次表单提交怎么从浏览器到 Servlet、再到数据库、再回到 JSP 渲染成 HTML。适合正在学 JavaWeb 需要完整案例的人、要交课程设计但不想只写增删改查的人以及想拿一个能跑通的项目去改造成自己版本的人。下面我按实际部署和二次开发中会遇到的顺序把这件事拆开讲清楚。2. 环境搭建与数据库初始化把 MySQL 和 Tomcat 先跑通2.1 选 MySQL 5.7 还是 8.0以及安装时最容易卡住的地方这套项目源码里通常用的是 MySQL 5.7 时代的 JDBC 驱动和 SQL 语法但你现在去官网下载默认给的是 8.0 或 8.4 LTS。两者在连接配置上有几个硬差异不处理就会直接报错。第一个差异是驱动类名。5.7 用com.mysql.jdbc.Driver8.0 用com.mysql.cj.jdbc.Driver。第二个差异是连接 URL 必须带时区和 SSL 参数否则 8.0 会抛The server time zone value或者SSL connection error。第三个差异是 8.0 默认认证插件变成了caching_sha2_password老驱动连不上。我一般会这样处理如果项目里已经写死了 5.7 的驱动那就装 5.7.44 或 5.7.26安装过程选Server only或者Custom去掉不需要的组件。安装时记住 root 密码字符集选utf8mb4。装完后用命令行验证mysql -u root -p # 输入密码后执行 SHOW VARIABLES LIKE character_set_server; # 应该看到 utf8mb4如果装的是 8.0连接配置要改成jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/dorm_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue jdbc.usernameroot jdbc.password你的密码serverTimezone不设会报时区错误useSSLfalse关掉 SSL 避免证书问题allowPublicKeyRetrievaltrue让老驱动能通过新认证插件。这几个参数是 8.0 环境下必调的少一个都可能连不上。注意如果之前装过 MySQL 又卸载不干净net start mysql会提示服务无法启动。这时候要去注册表删掉HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL相关项再重新初始化。2.2 建库建表与初始数据导入拿到源码后先找sql目录或者根目录下的.sql文件。常见命名是dorm_db.sql或student_dorm.sql。导入方式有两种命令行和图形化工具。命令行方式# 先创建数据库如果 sql 文件里没有 CREATE DATABASE mysql -u root -p -e CREATE DATABASE dorm_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 导入结构和数据 mysql -u root -p dorm_db /path/to/dorm_db.sql图形化工具比如 Navicat 或 MySQL Workbench 更直观新建连接右键运行 SQL 文件。导入后执行SHOW TABLES;确认表都建好了。典型表包括admin管理员、student学生、dorm_building宿舍楼、dorm_room房间、checkin_record入住记录、repair报修等。导入后要检查两件事一是admin表里有没有默认账号通常是admin/123456或admin/admin二是student表里有没有测试学生数据没有的话登录后会看不到任何记录。如果源码里没带初始数据可以手动插一条INSERT INTO admin (username, password, role) VALUES (admin, 123456, super);密码字段如果是明文就直接写如果是 MD5 就写e10adc3949ba59abbe56e057f20f883e123456 的 MD5。这一步不做后面登录页会一直提示用户名或密码错误排查半天以为是代码问题。2.3 Tomcat 部署与 IDEA 运行 JavaWeb 项目配置源码通常是 Eclipse 或 IDEA 项目结构。如果是 IDEA导入后要配置 Artifacts 和 Tomcat。步骤是File - Project Structure - Modules确认源码目录和依赖 jar 都在Artifacts里新建Web Application: Exploded把WEB-INF和编译输出加进去Run - Edit Configurations新建 Tomcat LocalDeployment 里选刚才的 ArtifactApplication context 设成/dorm或/。启动后浏览器访问http://localhost:8080/dorm/应该看到登录页。如果 404检查web.xml里的welcome-file和 Servlet 映射路径。如果 500看 Tomcat 日志里有没有ClassNotFoundException通常是 MySQL 驱动 jar 没放进WEB-INF/lib。提示IDEA 社区版没有内置 Tomcat 支持需要装 Smart Tomcat 插件或者直接用 Maven 的tomcat7-maven-plugin跑。命令行方式是在项目根目录执行mvn tomcat7:run前提是pom.xml里配好了插件。3. Servlet 与 JSP 的请求流转从登录到数据展示的完整链路3.1 一次登录请求在 Servlet 里经历了什么登录是理解整个项目请求流转的最好入口。用户在login.jsp输入用户名密码表单action指向/loginServletmethod是post。Tomcat 根据web.xml或WebServlet注解找到对应的 Servlet 类调用doPost方法。在doPost里典型流程是request.getParameter(username)拿到参数调用AdminDao.findByUsernameAndPassword()查数据库查到就把Admin对象放进session然后response.sendRedirect(main.jsp)查不到就request.setAttribute(msg, 用户名或密码错误)再request.getRequestDispatcher(login.jsp).forward(request, response)。这里有两个关键区别sendRedirect是客户端跳转地址栏会变session里的数据能带到新页面forward是服务器内部跳转地址栏不变request里的属性能在目标页面用 EL 表达式取到。登录失败用 forward 是为了让login.jsp能显示错误提示登录成功用 redirect 是为了避免刷新页面重复提交表单。WebServlet(/loginServlet) public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String password request.getParameter(password); AdminDao dao new AdminDao(); Admin admin dao.findByUsernameAndPassword(username, password); if (admin ! null) { request.getSession().setAttribute(admin, admin); response.sendRedirect(request.getContextPath() /main.jsp); } else { request.setAttribute(msg, 用户名或密码错误); request.getRequestDispatcher(/login.jsp).forward(request, response); } } }request.getContextPath()拿到的是项目部署路径比如/dorm拼上/main.jsp就是完整跳转地址。不写这个直接sendRedirect(main.jsp)在非根路径部署时会 404。3.2 JSP 页面怎么取数据、怎么控制权限显示JSP 里取 Servlet 放进去的数据用 EL 表达式${admin.username}或${sessionScope.admin.username}。如果要遍历列表用 JSTL 的c:forEach% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % table c:forEach items${studentList} varstu tr td${stu.name}/td td${stu.roomId}/td td${stu.phone}/td /tr /c:forEach /tableitems是 Servlet 里request.setAttribute(studentList, list)放进去的集合var是每次循环的变量名。JSTL 标签需要jstl.jar和standard.jar在WEB-INF/lib下否则标签不解析页面会直接把c:forEach当文本输出。权限控制通常靠session判断。比如学生页面顶部只显示「我的信息」和「报修申请」管理员页面显示「宿舍管理」「学生管理」「入住登记」。做法是在 JSP 开头加c:if test${sessionScope.admin null} c:redirect urllogin.jsp/ /c:if这段代码放在每个需要登录才能访问的 JSP 顶部防止用户直接输 URL 绕过登录。更规范的做法是写一个LoginFilter在web.xml里配置拦截所有.jsp请求但源码里不一定有手动加也不复杂。3.3 个人信息展示页面的字段映射与图片坐标定位热词里提到的「jsp个人信息展示页面」和「jsp图片如何对坐标定位」在这个项目里对应的是学生详情页和宿舍楼平面图。学生详情页一般从student表按id查一条记录字段包括学号、姓名、性别、班级、宿舍楼、房间号、床位号、联系电话、入住时间。Servlet 里request.setAttribute(student, student)JSP 里用${student.name}逐个展示。图片坐标定位常见于「宿舍楼房间分布图」这种功能一张楼栋平面图上面标注每个房间的入住状态点击某个房间跳转到该房间详情。实现方式是用 HTMLmap和area标签或者用绝对定位的div覆盖在图片上。img srcimages/building1.png usemap#roomMap width800 height600 map nameroomMap area shaperect coords120,80,200,160 hrefroomDetail?roomId101 alt101 area shaperect coords220,80,300,160 hrefroomDetail?roomId102 alt102 /mapcoords里的四个数字是矩形左上角和右下角的像素坐标相对于图片左上角。要精确标注先用画图工具打开图片鼠标移到房间左上角记下坐标再移到右下角记下坐标。如果房间是不规则形状用shapepoly加多边形顶点坐标。这个功能不是每个宿舍管理系统都有但如果源码里带了改坐标就是改coords数值改完刷新页面就能看到效果。注意usemap的值前面必须加#对应map的name属性。图片路径用相对路径时基准是当前 JSP 所在目录不是项目根目录放错位置图片不显示但也不报错容易翻车。4. 避坑与排查源码跑不起来时先看这五条4.1 启动报 ClassNotFoundException: com.mysql.jdbc.Driver现象是 Tomcat 启动后访问任何页面都 500日志里明确写ClassNotFoundException。原因是 MySQL 驱动 jar 没放进WEB-INF/lib或者 IDEA 的 Artifact 里没包含这个 jar。解决方法是把mysql-connector-java-x.x.x.jar复制到web/WEB-INF/lib目录然后在 IDEA 的Project Structure - Artifacts里确认WEB-INF/lib下的 jar 都在输出布局中。如果用的是 Maven检查pom.xml里依赖的scope是不是provided改成默认的compile才会打包进去。4.2 中文乱码表单提交后数据库里是问号现象是 JSP 页面输入中文提交后数据库里显示???或者乱码。原因有三个层面JSP 页面编码、请求编码、数据库连接编码。解决要三处都改。JSP 顶部加% page contentTypetext/html;charsetUTF-8 languagejava %Servlet 里doPost第一行加request.setCharacterEncoding(UTF-8)JDBC URL 里加useUnicodetruecharacterEncodingutf8。数据库和表的字符集也要是utf8mb4用SHOW CREATE TABLE student;确认。Tomcat 的server.xml里 Connector 加URIEncodingUTF-8能解决 GET 请求乱码。4.3 登录后 session 丢失每个页面都要重新登录现象是登录成功跳转到 main.jsp点任何一个菜单又跳回登录页。原因是浏览器禁用了 Cookie或者sendRedirect跳转时session没保持。先检查浏览器设置允许localhost的 Cookie。如果代码里用了response.sendRedirect且路径写错比如少了request.getContextPath()跳转后 session 域变了也会丢。还有一种情况是 Tomcat 的context.xml里配了sessionCookiePath不对默认不用改但如果项目部署在非根路径且手动改过要确认路径匹配。4.4 数据库连接池报 Too many connections现象是项目跑一段时间后报Too many connections或者页面加载越来越慢。原因是每次请求都DriverManager.getConnection()新建连接用完没关。源码里如果用的是这种原始方式要改成连接池比如 Druid 或 C3P0。简单做法是在src下加druid.properties用DruidDataSourceFactory创建DataSourceDAO 里从池里拿连接。如果不想引入新依赖至少确保每个Connection、Statement、ResultSet都在finally块里close()。MySQL 默认最大连接数是 151超过就拒绝新连接。4.5 JSP 页面修改后刷新没变化现象是改了 JSP 里的文字或样式浏览器刷新还是旧的。原因是 Tomcat 对 JSP 有编译缓存或者浏览器缓存了静态资源。先强制刷新CtrlF5如果还不行去 Tomcat 的work目录删掉对应项目的编译输出重启 Tomcat。IDEA 里如果配的是On Update action: Update resources改 JSP 不用重启但改 Java 代码需要Update classes and resources或者重启。另外确认改的是部署目录下的文件不是源码目录——IDEA Artifact 是 Exploded 模式时改源码后要重新 Build 才会同步到部署目录。5. 二次开发与验证把默认密码改成 MD5 并加一个入住统计5.1 用 MD5 替换明文密码并验证登录链路源码里密码字段大概率是明文这在课程设计里能跑但稍微改一下就能体现你对安全的理解。做法是加一个MD5Util工具类登录时把用户输入的密码转成 MD5 再和数据库比对注册或改密码时也存 MD5。import java.security.MessageDigest; public class MD5Util { public static String md5(String str) { try { MessageDigest md MessageDigest.getInstance(MD5); byte[] bytes md.digest(str.getBytes(UTF-8)); StringBuilder sb new StringBuilder(); for (byte b : bytes) { sb.append(String.format(%02x, b)); } return sb.toString(); } catch (Exception e) { throw new RuntimeException(e); } } }登录 Servlet 里把dao.findByUsernameAndPassword(username, password)改成dao.findByUsernameAndPassword(username, MD5Util.md5(password))。数据库里已有的明文密码要批量更新UPDATE admin SET password MD5(password);。改完后用admin/123456登录能进就说明链路通了。验证方法是故意输错密码看是否提示错误再查数据库确认存的是 32 位十六进制字符串。5.2 加一个「各楼栋入住人数统计」Servlet 和 JSP 页面这个功能能验证你对GROUP BY查询和 JSP 展示的掌握。先在 DAO 里加方法public ListMapString, Object countByBuilding() { ListMapString, Object list new ArrayList(); String sql SELECT b.building_name, COUNT(s.id) AS num FROM dorm_building b LEFT JOIN student s ON b.id s.building_id GROUP BY b.id, b.building_name; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { MapString, Object map new HashMap(); map.put(buildingName, rs.getString(building_name)); map.put(num, rs.getInt(num)); list.add(map); } } catch (Exception e) { e.printStackTrace(); } return list; }Servlet 里调这个方法request.setAttribute(stats, list)forward 到stats.jsp。JSP 里用c:forEach遍历把楼栋名和人数显示成表格。LEFT JOIN保证没有学生的楼栋也显示 0GROUP BY同时写b.id和b.building_name是为了兼容ONLY_FULL_GROUP_BY模式只写building_name在 MySQL 8.0 默认配置下会报错。验证时先往student表插几条不同楼栋的数据访问/statsServlet看数字对不对。再删掉某个楼栋的所有学生刷新页面确认该楼栋显示 0 而不是消失。这个功能加完你对这套系统的数据流就有了完整的掌控。5.3 我踩过的坑和现在养成的习惯我最早跑这类项目时最常翻车的地方不是代码逻辑而是环境。MySQL 装了两个版本、端口冲突、驱动 jar 版本和数据库版本不匹配每一个都能耗掉半天。后来我养成了一个习惯拿到任何 JavaWeb 源码先不看业务代码先把数据库导入、Tomcat 跑通、登录页能打开这三步过了再去看功能。因为环境问题占排查时间的七成环境通了剩下的都是可定位的代码问题。另一个习惯是改任何配置前先备份。web.xml、pom.xml、JDBC 配置改之前复制一份加.bak。有次改serverTimezone手滑删了个引号Tomcat 启动直接报 XML 解析错误没备份就得从头翻。现在改配置都是小步改、立刻重启验证不攒一堆改动一起试。这套 ServletJSPMySQL 的宿舍管理系统技术不新但它是理解 JavaWeb 请求响应模型最扎实的载体。把它跑通、改通、加一两个自己的功能比看十篇理论文章都管用。希望帮到你。本文还有配套的精品资源点击获取
返回列表