简介:面向Java毕业设计的班主任学生宿舍管理系统完整资料包,包含SSM框架项目源码、数据库设计说明书、需求分析说明书、详细设计说明书、项目计划书与答辩PPT模板,适合计算机相关专业学生完成毕业设计或课程设计参考。资源共44个文件,以JSP页面、Java源码、Word文档、PPT模板、数据库文件为主,压缩包约16.35MB,目录结构清晰,便于分类查找与复用。系统实现学生基本信息管理(学号、姓名、性别、班级等信息的查询与增删改)、班级与个人积分考核、辅导员日常事务登记、家长信息维护、消息发布与留言板、用户权限设置等功能,并支持数据导入导出和远程访问;配套文档覆盖需求分析、数据库设计、详细设计与项目计划,可导入Eclipse或IntelliJ IDEA配合JDK1.8及Maven运行,便于理解整体设计思路并在基础上进行二次开发。已有50人学习下载,适合用作班主任宿舍管理类毕业设计项目的完整参考。
1. 毕业设计选它值不值:班主任学生宿舍管理系统到底在解决什么问题
每到毕业设计季,都有一大批人打开这个压缩包:班主任学生宿舍管理系统,里面是源代码、论文和 PPT 模板。一批 java 文件、一堆 XML 配置和一个 .sql 脚本,新手第一眼往往是「从哪开始」。
这套系统本质是一个标准的 Java Web 毕业设计:用 JSP/Servlet 或 SSM 做后台,让班主任管理本班学生的宿舍分配、查寝归寝、卫生评分和违纪记录,学生端再给一个报修和查询入口。
它最值得做的不是「用得多好」,而是「跑通 + 改造成自己的」。拿到源代码只是起点,真正要交付的是能演示的系统、能讲清的论文、不像照抄的 PPT。下面按我带这类项目的经验,从部署、改功能到躲坑、答辩逐段拆开讲,适合做 Java 毕设的人,也适合拿完整案例练手的初学者。
2. 先拆功能再选技术栈:三种角色、六个模块和 5 张核心表怎么定
拿到压缩包,我不会急着解压跑代码,而是先花十几分钟把需求文档和数据库脚本过一遍。班主任学生宿舍管理系统听起来功能不少,实际业务边界很清楚:围绕「宿舍」这个资源、「学生」这批人,以及查寝、卫生、违纪、报修这几类过程数据。把它们拆清楚,后面改代码、写论文都不容易散。
2.1 三种角色与六个核心模块:班主任到底能管什么
「班主任」三个字决定了它跟普通宿管系统不一样:不是全校一盘棋,而是按班级划数据权限。登录进去一般有三种角色:
| 角色 | 能做什么 | 不能做什么 |
|---|---|---|
| 班主任 | 查本班学生档案、分配宿舍、看查寝和卫生评分、登记违纪、导出报表 | 看其他班级数据 |
| 宿管员 | 整楼查寝登记、卫生检查、处理报修 | 改学生关键档案 |
| 学生 | 看自己的宿舍号床位、提交报修、查违纪记录 | 进后台管理 |
六个核心模块分别是学生档案、宿舍分配、查寝归寝、卫生评分、违纪记录、报修处理。查寝和卫生评分是班主任日常用得最多的两个,也是论文需求分析里最好写的部分:它们都有明确的状态流转,能画业务流程图,能列用例表。
这里提醒一句:如果源码里权限只做了菜单显示控制,后台 Controller 没有按班级过滤,就会出现 A 班班主任查到 B 班学生的问题。这种 bug 演示时不容易暴露,但答辩时老师翻代码很容易看出来。常见修法是在 Service 层统一拼一个 classId 条件,而不是在每个 Mapper XML 里各写各的。
2.2 SSM 还是 JSP+Servlet:毕业设计技术栈怎么选不翻车
打开源码第一步,先看根目录有没有 pom.xml。有 pom.xml,是 Maven 工程,大概率是 SSM(Spring + SpringMVC + MyBatis)或 Spring Boot;没有,则是一堆 src 目录加 jar 包,通常是 JSP + Servlet + JDBC 的老写法。这两种在很多 java 课程设计案例源码里都常见。
| 对比项 | JSP + Servlet + JDBC | SSM |
|---|---|---|
| 上手成本 | 低,代码直白 | 中,配置文件多 |
| 分层 | 容易堆在 Servlet 里 | Controller/Service/Mapper 清晰 |
| 答辩风险 | 会被追问 JDBC 连接、SQL 注入 | 会被问 IOC/AOP/事务,都是 java 面试八股文常客 |
| 扩展 | 加功能要复制代码 | 加表、加接口顺手 |
我的建议:论文还没定的,优先选 SSM 版本。它不是更高级,而是把面向对象编程 java 的分层思想落得完整。论文写「系统设计」时,Controller 对应表示层、Service 对应业务层、Mapper 对应数据访问层,一章就成型了。答辩被问「为什么用 MyBatis」,也能答出解耦 SQL、参数映射、动态 SQL 这些点,比「别人都这么写」强得多。
如果压缩包里是 Spring Boot 版本,更省事,IDEA 里直接运行带 @SpringBootApplication 的主类,不用单独配 Tomcat。但 Spring Boot 的包结构和配置方式跟 SSM 差别很大,别拿 SSM 的思路硬套,后面第 3 章我会专门说差异。
2.3 核心表结构设计:用 5 张表把宿舍业务串起来
数据库脚本是这个项目最值得读的文件,因为不管框架怎么换,表结构基本通用。核心一般是这 5 张:班级表、学生表、宿舍房间表、查寝记录表、报修表,卫生评分和违纪记录可能会并进查寝表或单独成表。
-- 学生表:宿舍业务的绝对主体 CREATE TABLE t_student ( student_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '学号', student_name VARCHAR(32) NOT NULL COMMENT '姓名', gender TINYINT NOT NULL DEFAULT 0 COMMENT '0男 1女', class_id INT NOT NULL COMMENT '班级ID,外键指向班级表', dorm_id INT COMMENT '宿舍ID,没分配时为空', bed_no VARCHAR(8) COMMENT '床位号,如A区301-02', phone VARCHAR(16) COMMENT '联系电话', create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生档案';学生表用 dorm_id 关联宿舍房间表,而不是直接存「301」这种字符串。理由是床位是否住满要靠宿舍表的 occupied 和 capacity 两个数字来算,存字符串的话,统计空床位数得写一堆 LIKE,性能差还容易错。
-- 宿舍房间表:占用数要能被 UPDATE 原子修改 CREATE TABLE t_dorm_room ( room_id INT PRIMARY KEY AUTO_INCREMENT, room_no VARCHAR(16) NOT NULL COMMENT '房间号', building VARCHAR(16) COMMENT '楼栋', gender TINYINT NOT NULL DEFAULT 0 COMMENT '0男寝 1女寝', capacity INT NOT NULL DEFAULT 6 COMMENT '可住人数', occupied INT NOT NULL DEFAULT 0 COMMENT '已住人数', is_public TINYINT DEFAULT 1 COMMENT '1启用 0停用' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍房间';-- 查寝记录表:一天一人一条,靠唯一键挡重复 CREATE TABLE t_checkin ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL COMMENT '学生ID', checkin_date DATE NOT NULL COMMENT '查寝日期', status TINYINT NOT NULL DEFAULT 0 COMMENT '0未归 1正常 2晚归', remark VARCHAR(128) COMMENT '备注', recorder VARCHAR(32) COMMENT '登记人姓名', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_stu_date (student_id, checkin_date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='查寝登记';查寝表上那个唯一键 (student_id, checkin_date) 是我反复强调的设计。没有它,连点两次「登记正常」就会插两条记录,「实到人数」统计直接翻倍。第 4 章的 upsert 写法依赖这个键。
-- 报修表:过程数据单独成表,状态由宿管员推进 CREATE TABLE t_repair ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL COMMENT '报修学生', content VARCHAR(255) NOT NULL COMMENT '报修内容', status TINYINT DEFAULT 0 COMMENT '0待处理 1处理中 2已完成', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, finish_time DATETIME COMMENT '完成时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报修工单';报修是典型的过程数据,一个学生可以报修多次,每次有自己的状态流转,必须单独成表。我最早改这类项目时偷懒,在学生表里塞了 repair_content 字段,一个学生报修两次就把旧记录覆盖了,数据全乱,后来才老老实实拆出来。
3. 把源代码跑起来:JDK、MySQL、Tomcat 与 IDEA 部署全流程
这一章的目标是让项目在本地 30 分钟内跑起来,不要求先理解每一行代码。我见过太多人卡在第一步:环境版本对不上,启动日志报错看不懂,最后怀疑源码有问题。其实绝大多数翻车都是版本和配置问题,跟代码本身没关系。
3.1 环境版本搭配:JDK 8 + MySQL 5.7 + Tomcat 8.5 为什么最稳
先给出一套我验证过很多次的搭配,能不动就不动:
| 组件 | 推荐版本 | 为什么不推荐更高 |
|---|---|---|
| JDK | 1.8(8u 系列) | 绝大多数毕设源码按 Java 8 编译,JDK 17 会踩 javax 包缺失、反射受限的坑 |
| MySQL | 5.7 | 8.0 要换驱动、要配时区,新手容易在这踩坑 |
| Tomcat | 8.5 或 9.0 | Tomcat 10 起包名改成 jakarta.servlet,老项目直接 NoClassDefFoundError |
| IDEA | 2021 及以上 | 自带 Tomcat 集成,配置路径好找 |
| Maven | 3.6 以上 | 选带 pom.xml 的源码需要它 |
先检查本机三个命令的输出:
java -version mvn -v mysql --version如果 java 版本是 17 或更高,别急着继续,先装一个 JDK 8 并把 JAVA_HOME 指过去。IDEA 里「Project Structure → SDK」可以同时装多个 JDK 在项目里切换,不影响其他项目。MySQL 8.0 不是不能用,但要同时满足「驱动升到 8.x + 连接串带 serverTimezone」两个条件,新手没必要在这个环节增加变量。
3.2 导入数据库脚本并改连接配置:启动前的必做三步
第一步,建库并导入 .sql 文件。用命令行或 Navicat 都行,命令行的执行逻辑最透明:
CREATE DATABASE dormitory DEFAULT CHARACTER SET utf8mb4; USE dormitory; SOURCE D:/dorm.sql;SOURCE 后面写你解压出来的脚本路径,注意 Windows 路径分隔符用正斜杠。导入完成后用 SHOW TABLES; 数一下表数量,跟你论文里数据表设计章节对得上,说明脚本没问题。
提示:MySQL 5.7 里 utf8mb4 是首选字符集,别用 utf8。utf8 在 MySQL 里实际是 utf8mb3,存不下部分生僻字和特殊符号,后期改表很麻烦。
第二步,改数据库连接配置。SSM 项目一般在 src/main/resources 下的 jdbc.properties;Spring Boot 在 application.properties 或 application.yml。核心就四项:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/dormitory?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai jdbc.username=root jdbc.password=你的密码url 里的 characterEncoding=utf8 管数据库读写中文,serverTimezone=Asia/Shanghai 管日期时间类型的时区偏差。这两个参数不加,后面第 5 章的乱码和日期错位坑基本必踩。
第三步,确认连接池配置生效。有些项目把数据源写死在 spring-context.xml 里,而不是 properties 文件。搜「dataSource」看它引用的是哪个文件,别改了一处发现另一处还写着旧密码。XML 里 url 的 & 符要写成 &,这也是老项目最常见的低级报错源之一。
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/dormitory?characterEncoding=utf8&serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean>3.3 在 IDEA 里配置 Tomcat 并成功启动:war exploded 怎么选
这是整套流程最容易卡住的一步,按顺序做:
- IDEA 打开项目:有 pom.xml 选它打开,右下角等 Maven 依赖下载完,别在依赖还在转圈时继续操作。
- 点 Run → Edit Configurations → 左上角 + → Tomcat Server → Local。
- Server 标签页里 Application server 选你本机 Tomcat 目录;没显示就点 Configure 手动选。
- Deployment 标签页 → 点 + → Artifact → 选择 xxx:war exploded。
- 下面 Application context 填 /dorm,或者留空表示根路径。
- 点启动,看 Console 出现 Server startup in [xxx] milliseconds 才算成功。
- 浏览器访问,默认登录页出得来就通了。
重点说下第 4 步的 war exploded。它跟 war 的区别是:war 是打包后整体部署,改一个 JSP 页面要重新 build;war exploded 是解包目录形式,JSP 和静态资源改了直接刷新浏览器就能看到,调试毕设项目省太多时间。这是我从带过的项目里总结出来的习惯,凡是需要反复调页面的,一律选 exploded。
启动后如果日志停在「信息: Deploying web application archive」不动,多半是数据库连不上,回 3.2 改配置。如果直接报端口占用,跳到第 5 章看 5.3。
4. 把功能改出自己的味道:宿舍分配、查寝登记和报表导出的代码改造
答辩最怕被问「哪个功能是你自己写的」。答案最好是有三个:一个算法、一个状态处理、一个报表导出。这三样改完,代码风格跟原版有明显区别,介绍起来也自然。
4.1 自动分配宿舍:用流式写法替换手动指定
原项目常见的做法是班主任在页面上拉框选房间、再填床位号,数据录入慢,而且容易把两三个学生分到同一张床。改成自动分配,代码量不大,但能讲出点名堂。核心逻辑用 java 基础里的 Stream 就能写:
/** * 自动分配:按性别过滤出可用房间,再按已住人数升序取第一个。 * rooms 来自 t_dorm_room,occupied 表示已住人数,capacity 表示可住人数。 */ public AssignResult autoAssign(Student stu, List<DormRoom> rooms) { List<DormRoom> available = rooms.stream() .filter(r -> r.getGender().equals(stu.getGender())) // 性别匹配 .filter(r -> r.getOccupied() < r.getCapacity()) // 还有空床 .sorted(Comparator.comparingInt(DormRoom::getOccupied)) // 人少的优先 .collect(Collectors.toList()); if (available.isEmpty()) { return AssignResult.fail("该性别宿舍已满,请先扩容"); } DormRoom target = available.get(0); // 关键的一步:让数据库原子地占用一个床位,防止并发超员 int rows = dormRoomMapper.increaseOccupiedIfEnough(target.getId()); if (rows == 0) { return AssignResult.fail("床位刚刚被占满,请重新分配"); } // 重新查一次,拿到最新的占用数来生成床位号 DormRoom latest = dormRoomMapper.selectById(target.getId()); return AssignResult.ok(latest.getRoomNo(), latest.getBedPrefix() + latest.getOccupied()); }filter 两次和 sorted 一次,把「选房」这件偏操作的事变成了一段可读的声明式逻辑。最后那个 increaseOccupiedIfEnough 是精髓,它对应的是面试里常问的「java 怎么保证数据一致性」:两个班主任同时给不同学生分配同一间房,JVM 里 if 判断挡不住并发,得让数据库来扛。
对应的 Mapper XML 用条件更新:
<update id="increaseOccupiedIfEnough"> UPDATE t_dorm_room SET occupied = occupied + 1 WHERE room_id = #{roomId} AND occupied < capacity </update>affected rows 返回 1 说明床位占成功了,返回 0 说明这条 UPDATE 被条件挡住,房间已经在并发下满了。这套写法比「先查再改」靠谱,也是我后来写生产代码一直在用的习惯。
提示:autoAssign 里 increaseOccupiedIfEnough 之后,别忘了在 Service 层加 @Transactional。分配宿舍涉及「房间占用数 + 学生 dorm_id + 床位号」三个写入,任何一个失败都要整体回滚,否则会出现房间说住了 5 人但只有 4 个学生挂着这个房间的脏数据。
4.2 查寝登记的状态流转:当天记录怎么做到不重复
查寝业务的边界是:同一学生同一天只能有一条状态,重复提交应该变成更新而不是新增。这正是 t_checkin 表唯一键发挥作用的地方。
/** * 登记查寝:存在当天记录就更新状态,不存在就插入。 * 依赖 t_checkin 表的唯一键 (student_id, checkin_date) 兜底。 */ public void recordCheckin(Integer studentId, Integer status, String remark) { CheckinRecord record = checkinMapper.selectByStudentAndDate(studentId, LocalDate.now()); if (record == null) { checkinMapper.insert(new CheckinRecord(studentId, LocalDate.now(), status, remark)); } else { CheckinRecord update = new CheckinRecord(); update.setId(record.getId()); update.setStatus(status); update.setRemark(remark); checkinMapper.update(update); } }select 一次再决定 insert 还是 update,叫 upsert 的朴素实现。它有个小窗口期:极端并发下两次都 select 到 null,两次都 insert,第二次会被唯一键拦下来报异常。对毕业设计来说,异常比脏数据好接受,只要给这个异常加个友好提示就行,你可以故意点两次提交看提示,这也算一个能演示的细节。
顺带说一句,事务别忘了。recordCheckin 里如果有多个 Mapper 操作,建议在 Service 层加 @Transactional。要是用 JSP+Servlet 的老代码,没有注解可用,就手动在 try 里 connection.setAutoCommit(false),catch 里 rollback。查寝登记算写操作,一致性比性能重要。
4.3 查寝报表导出:用 POI 生成 Excel 统计表
很多同学会搜「java poi word 能生成图表吗」这类问题,实际毕业设计里导出最多的是 Excel。给班主任加一个「按班级按日期」导出一张查寝汇总表的功能,用 Apache POI 的 XSSFWorkbook 就好。
/** * 导出某班级某天的查寝统计 Excel。 * stats 是 Mapper 里 group by 后查出来的对象列表。 */ public void exportCheckinReport(Integer classId, LocalDate date, HttpServletResponse response) { List<CheckinStat> stats = checkinMapper.statByClassAndDate(classId, date); try (XSSFWorkbook workbook = new XSSFWorkbook()) { XSSFSheet sheet = workbook.createSheet("查寝统计-" + date); // 第一行是表头 Row header = sheet.createRow(0); header.createCell(0).setCellValue("班级"); header.createCell(1).setCellValue("应到人数"); header.createCell(2).setCellValue("实到人数"); header.createCell(3).setCellValue("未归人数"); header.createCell(4).setCellValue("晚归人数"); // 从第二行开始写数据 int rowIndex = 1; for (CheckinStat stat : stats) { Row row = sheet.createRow(rowIndex++); row.createCell(0).setCellValue(stat.getClassName()); row.createCell(1).setCellValue(stat.getTotal()); row.createCell(2).setCellValue(stat.getNormal()); row.createCell(3).setCellValue(stat.getAbsent()); row.createCell(4).setCellValue(stat.getLate()); } // 告诉浏览器这是一个要下载的 .xlsx 附件 response.setContentType( "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-Disposition", "attachment;filename=checkin_" + date + ".xlsx"); workbook.write(response.getOutputStream()); } catch (IOException e) { log.error("导出查寝报表失败", e); } }POI 里最绕的是行和列都是 0 开始的数字坐标,createRow(0) + createCell(0) 就是 A1 单元格,这个对应关系搞清楚,其他都是体力活。文件名如果有中文,记得对文件名做 URLEncoder.encode,否则部分浏览器下载会乱码。这套写法同样适用于导出学生名单、违纪汇总,护着一张模板改字段就行。
5. 避坑手册:部署 Java 宿舍管理系统的 5 个典型报错与排查
这一章全部来自真实翻车现场,每一条我都按「现象 → 原因 → 解决」写。
5.1 MySQL 8.0 认证方式导致数据库连接失败
现象:Tomcat 启动后日志报 Access denied for user 'root'@'localhost' (using password: YES),或者报 ClassNotFoundException: com.mysql.jdbc.Driver。
原因:MySQL 8.0 默认用 caching_sha2_password 认证,而老项目自带的 mysql-connector-java 5.x 驱动只认 mysql_native_password;如果驱动是 8.x 但没配置 serverTimezone,又会报 "The server time zone value 'xxx' is unrecognized" 这种时区错。
解决:二选一。一是把驱动 jar 换成 8.x,并把 jdbc.url 改成 jdbc:mysql://localhost:3306/dormitory?serverTimezone=Asia/Shanghai&useSSL=false,驱动类改 com.mysql.cj.jdbc.Driver。二是保持 5.7 数据库,在控制台把用户认证切回去:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;我一般推荐先查 MySQL 版本再决定,别上来就改数据库。5.7 环境就不用折腾。
5.2 页面中文乱码:改了三处编码才消停
现象:登录后页面上的中文全是问号或「锟斤拷」,往数据库插中文也变成 ???。
原因:这不是单点问题。JSP 页面响应用了 GBK、Servlet 没调 request.setCharacterEncoding、数据库表建成了 latin1、JDBC 连接串没有 characterEncoding,任何一环掉了都乱码。
解决:按顺序统一成 UTF-8。第一步,JSP 头部确认 <%@ page pageEncoding="UTF-8" %>;第二步,web.xml 里加 Spring 的 CharacterEncodingFilter,forceEncoding 设为 true;第三步,数据库连接串加 characterEncoding=utf8;第四步,检查已有表是不是 utf8mb4,用 SHOW CREATE TABLE t_student \G 看 DEFAULT CHARSET,不是的话 ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4。四步做完重启,基本消停。乱码是最玄学的问题,现象一样但原因往往不一样,排查时按这个顺序从上到下查,别瞎改。
5.3 Tomcat 启动秒退:端口占用与日志排查
现象:IDEA 里点完启动,控制台滚几行然后报 Port 8080 was already in use,或者没有任何报错但浏览器死活打不开。
原因:之前调试的 Tomcat 实例没关,或者本机有别的进程占了 8080。Windows 上还有一些软件喜欢占 8080,比如某些视频服务。
解决:先看谁占的端口:
netstat -ano | findstr 8080 taskkill /F /PID 这里填进程号不想杀进程就直接改 Tomcat 的端口,在 conf/server.xml 里把 Connector 的 port 改成 8081。改完记得浏览器访问地址也换成 8081,这俩不一致是低级的翻车点。
5.4 JDK 版本过高或 Tomcat 10 换了包名导致编译失败
现象:代码编译时报 java: error: invalid source release: 17,或者程序包 javax.servlet 不存在,运行时报 NoClassDefFoundError: javax/servlet/...。
原因:老毕设项目按 Java 8 写的,你本机默认 JDK 是 17,编译器级别对不上;Tomcat 10 开始把 servlet API 包名从 javax.servlet 改成 jakarta.servlet,用 8/9 写的项目在 10 上启动必然找不到类。
解决:有条件就装 JDK 8,在 IDEA 的 Project Structure 里把 Project SDK 和 Module language level 都指到 8。用 Maven 的在 pom.xml 里加:
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>Tomcat 就换回 8.5 或 9.0。判断标准很简单:源码里 import javax.servlet 就用老 Tomcat,import jakarta.servlet 才是配套 10+ 的新代码。
5.5 启动成功但页面 404:Application Context 没对上
现象:Tomcat 明明显示 started,IDEA 也跳出了浏览器,但页面是 404。
原因:Deployment 里没添加 Artifact,或 Application context 填了 /dorm 但访问的是 http://localhost:8080/,又或者 JSP 里的路径写死了绝对路径、没带 contextPath。
解决:打开 Edit Configurations 的 Deployment 标签页,确认有 xxx:war exploded,Application context 和浏览器地址保持一致。如果项目里页面跳转用 /login.jsp 这种斜杠开头路径,改成 ${pageContext.request.contextPath}/login.jsp,否则部署到带 context 路径时跳转全部丢失。
6. 答辩前怎么验证和演示:三个让系统不翻车的检查习惯
到答辩前一周,功能通常已经能跑。但「能跑」和「能演示」是两回事,我吃过亏,所以这章讲验证方法。
6.1 演示前必过的冒烟检查清单
按下面这张表走一遍,每项通过再进下一项:
| 检查项 | 怎么操作 | 通过标准 |
|---|---|---|
| 三种角色登录 | 班主任、宿管员、学生账号各登录一次再退出 | 菜单权限肉眼可见不同 |
| 查寝登记闭环 | 造 3 个学生,分别登记正常、未归、晚归 | 列表状态正确,统计数字对得上 |
| 宿舍分配 | 用一个满员性别的房间做自动分配 | 出现「宿舍已满」友好提示 |
| 报修闭环 | 学生端提交一条,宿管员端改状态 | 状态流转到已完成 |
| Excel 导出 | 点导出并打开文件 | 表头和数据无乱码 |
检查时用真实感的演示数据,别用 abc 这种测试数据。答辩现场老师会盯屏幕,看到「张三 2024 级计算机 1 班」比看到「test1」可信得多。建议插入至少 20 个学生、3 天的查寝记录、几条报修记录。演示时先讲「解决什么问题」,再实操一个完整流程,最后展示导出的 Excel。
6.2 给答辩加分的一处小改造
如果时间只够改一处,我建议改登录密码的存储方式。原项目多半是明文存数据库,你把它改成摘要存储:
// 注册时:不存明文,存摘要 String digest = DigestUtils.md5DigestAsHex( rawPassword.getBytes(StandardCharsets.UTF_8));登录时对输入的密码做同样的摘要再比对。这不是让系统变多安全,MD5 本身也不够强,但它展示了一个关键意识:密码不能明文落库。答辩时老师问「安全上做了什么」,你有具体代码可以指给他看,比背概念强。
临近答辩那几天,我最深的教训是:前一天晚上一定把整个流程在演示库里完整跑一遍,包括导出文件和退出登录。因为答辩那天的紧张会在你身上放大各种小失误,机器不会骗人,但你得提前确认机器状态。数据备好了、路径想清楚了、关键代码能指出来,心里就有底。希望帮到你。
本文还有配套的精品资源,点击获取