ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

JavaWeb新生报到系统实战:JSP+Servlet+SQL从设计到部署

JavaWeb新生报到系统实战:JSP+Servlet+SQL从设计到部署 简介基于JavaJSPSQL技术栈的新生报到系统毕业设计项目源码面向计算机相关专业需完成Web开发课题的学生覆盖新生信息录入、报到确认、宿舍分配、课程安排等典型业务流程可用于课程设计或毕业设计参考。压缩包共161个文件大小2.36MB包含29个JSP页面、6个Java源文件及对应class编译文件、8个JS与4个CSS前端脚本58个GIF和18个JPG图形素材用于界面展示另含4个db及mdf/ldf数据库文件便于导入SQL数据库查看表结构与初始数据。已有158人学习下载适合需要完整可运行代码、快速理解Java Web分层开发与数据库交互的读者。系统通过Servlet接收请求并控制页面跳转JSP负责动态渲染JavaBean封装学生、课程等业务对象JDBC完成数据持久化并配有基础防御措施。通过阅读源码可了解MVC分层、会话管理、文件上传等核心实现也可在此基础上修改扩展为实验预约、学籍管理等相似系统。1. 新生报到系统为什么值钱一个迎新现场的混乱场景与这套技术栈的本质每到九月初学校迎新现场最忙的不是搬行李的志愿者而是守着几台电脑录入报到信息的老师。新生排成长队学号、姓名、专业、宿舍楼层全靠口头确认Excel 表格开着三份一不小心就把两个同名同姓的新生报到记录写串了。这时候你会发现一个基于 JavaJSPSQL 的新生报到系统解决的不是技术问题而是把“报到”这件事从纸质记录变成一条能查询、能统计、能打印报到单的固定流程。这套东西放到别的业务里叫进销存放到迎新现场就叫报到系统。做毕业设计选它的价值在于业务够具体功能边界清晰又能把 JSP、Servlet、SQL 这几门课的知识点全部串起来从建表到发布的过程也就是一次完整的 JavaWeb 练兵。2. 业务拆解与数据库设计先把新生报到系统的表结构立住很多同学拿到这类题第一反应是写页面界面弄得花里胡哨最后卡在数据存不进去。我一般建议反过来先把业务拆清楚把表建好再动 JSP。因为这个系统的核心不是漂亮页面而是“报到状态”这一条主线的流转。一台电脑录入学号判断这个学生是哪个学院哪个班的是否已经报到宿舍还剩几个床位打印报到单这些动作背后全是对数据库的增删改查。表结构设计对了后面写代码就是顺水推舟表结构错了后面每加一个功能都要改表返工成本极高。2.1 系统角色与功能边界管理员、辅导员、新生各干什么先明确角色报到系统不是 OA不需要几十个菜单。常见的切法是三类用户系统管理员负责基础数据维护包括学院、专业、班级、宿舍楼和账号管理还要能看全校的报到进度。院系用户也就是辅导员负责录入本学院新生报到信息、修改报到状态、分配宿舍、打印报到单。新生本人一般不直接登录系统而是到现场由工作人员代录入。功能边界要刻意收住。报到系统最核心的状态流就是未报到 → 已报到同时记录报到时间→ 已分配宿舍 → 已领取物资。缴费可以做成一个字段或者一个状态但不要往财务系统方向做否则你还要做退款、作废、对账工作量直接翻倍。把下面这几张表的字段设计好系统的骨架就立住了。2.2 核心数据表设计学生表、报到表、宿舍表的关系与字段学生表是主表一个学生一条记录。学号建议单独建一个student_no字段并加唯一索引不要拿自增主键当学号因为学号有业务含义比如年份加学院编号加流水号。身份证号用VARCHAR(18)存不需要计算就永远不要用数值类型。报到状态status用TINYINT0 表示未报到1 表示已报到2 表示缓报到。用数字比用字符串好排序、省空间但一定要在代码里或者注释里写清楚含义不然半年后你自己都看不懂。宿舍表和班级表分别是学生表的“从属”信息。宿舍表里要存楼号、房间号、总床位数、已用床位数、性别限制。这里有个老手习惯床位余量不要每次现算而是在分配宿舍时对used_count字段做加一操作查询宿舍列表时直接比较used_count bed_count效率高很多。班级表里存学院和班级名后面统计报到率就靠它做分组。下面用表格把最常用的几张表列出来字段只列核心项不是完整设计稿但要覆盖主要业务。表名关键字段用途student_infoid, student_no, name, gender, id_card, class_id, dorm_id, status, report_time学生基础信息 报到状态class_infoid, dept_name, class_name学院/班级用于分班与统计dormitoryid, building, room_no, bed_count, used_count, gender宿舍床位管理report_logid, student_id, action, operator_id, create_time报到操作流水sys_userid, username, password, role管理员/辅导员账号report_log这张表容易被忽视但它是答辩时的亮点。每次报到、改专业、换宿舍都往里面写一条日志老师问“你怎么追溯数据变更”的时候直接拿这张表回答。只有一张学生表的话改完数据就找不回现场了。2.3 初始化 SQL 脚本从业务表到可运行数据库的落地写法表结构设计好之后按下面的脚本建库建表。这里选 MySQL 做演示原因是毕业设计里遇到最多的是 MySQL如果你学校机房统一用 SQL Server注意把AUTO_INCREMENT换成IDENTITY(1,1)把反引号去掉其余差别不大。CREATE DATABASE IF NOT EXISTS enrollment DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE enrollment; CREATE TABLE student_info ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 主键, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT 学号唯一, name VARCHAR(50) NOT NULL COMMENT 姓名, gender TINYINT NOT NULL DEFAULT 1 COMMENT 1男 2女, id_card VARCHAR(18) DEFAULT NULL COMMENT 身份证号, class_id INT DEFAULT NULL COMMENT 班级ID, dorm_id INT DEFAULT NULL COMMENT 宿舍ID, status TINYINT NOT NULL DEFAULT 0 COMMENT 报到状态 0未报到 1已报到 2缓报到, report_time DATETIME DEFAULT NULL COMMENT 报到时间, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) ENGINEInnoDB COMMENT新生报到信息表; CREATE TABLE class_info ( id INT AUTO_INCREMENT PRIMARY KEY, dept_name VARCHAR(50) NOT NULL COMMENT 学院名称, class_name VARCHAR(50) NOT NULL COMMENT 班级名称 ) ENGINEInnoDB COMMENT班级表; CREATE TABLE dormitory ( id INT AUTO_INCREMENT PRIMARY KEY, building VARCHAR(50) NOT NULL COMMENT 楼号, room_no VARCHAR(20) NOT NULL COMMENT 房间号, bed_count INT NOT NULL COMMENT 总床位数, used_count INT NOT NULL DEFAULT 0 COMMENT 已用床位数, gender TINYINT NOT NULL DEFAULT 1 COMMENT 1男 2女 ) ENGINEInnoDB COMMENT宿舍表;建表时字符集统一用utf8mb4不要用utf8。utf8在 MySQL 里最多存 3 字节遇到生僻字或者表情符号会报错或变成问号。学号加UNIQUE约束是防止重复报到最底层的一道防线这个索引在后面并发场景里能救命。表建完后还要往里塞基础数据。班级、宿舍、管理员账号都需要初始化。管理员密码字段强烈建议存哈希不要存明文。由于这个阶段还没写代码可以用下面这种安全哈希写法的变通形式只作演示定位。提示下面的密码字段用占位字符串演示。正式项目里密码必须做加盐哈希常见的做法是用 BCrypt不要用 MD5 裸存。INSERT INTO class_info (dept_name, class_name) VALUES (计算机学院, 计算机2301班); INSERT INTO class_info (dept_name, class_name) VALUES (计算机学院, 软件2301班); INSERT INTO class_info (dept_name, class_name) VALUES (外国语学院, 英语2301班); INSERT INTO dormitory (building, room_no, bed_count, used_count, gender) VALUES (1号楼, 101, 6, 0, 1); INSERT INTO dormitory (building, room_no, bed_count, used_count, gender) VALUES (2号楼, 201, 4, 0, 2); INSERT INTO sys_user (username, password, role) VALUES (admin, 这里存哈希值, ADMIN);这段脚本的作用是把项目从“零表”状态变成可运行状态。gender字段在宿舍分配时很关键男生不能分到女生楼。这个校验可以在代码里做但更稳妥的做法是查询宿舍时直接把gender条件拼进 SQL让数据库把不可能的数据直接过滤掉。3. 环境搭建与项目骨架JDKTomcatMySQL 组合的版本玄学JSP 项目跑不起来一半以上不是代码问题是环境问题。尤其是版本搭配充满了玄学。很多教程是五六年前写的照着做 JDK 17 Tomcat 10结果 Tomcat 把javax.servlet换成了jakarta.servlet老代码全部编译报错。你说代码错了吗代码没问题是教材没跟上版本。3.1 JDKTomcatMySQL 版本搭配为什么卡在 JDK8 最不容易翻车如果你去问教学班的老师十个有九个会告诉你“用 JDK 8 就行”。这不是守旧是 JSP 生态的老项目确实在 JDK 8 上最稳定。Tomcat 8.5 和 Tomcat 9 都支持 JDK 8而且 API 还是javax.servlet这一套网上随便搜出来的代码片段基本都能直接用。MySQL 这边5.7 和 8.0 都行。用 8.0 的话注意两点JDBC 驱动要用 8.x驱动类名是com.mysql.cj.jdbc.Driver连接串里要加serverTimezone否则报时区错误。用 5.7 也有它的好处占用内存小机房老机器跑得动。组合是否推荐理由JDK 8 Tomcat 8.5 MySQL 5.7推荐教程范例最多javax API踩坑成本最低JDK 8 Tomcat 9 MySQL 8.0推荐Tomcat 9 比 8.5 新一些驱动换 8.x 即可JDK 17 Tomcat 10 MySQL 8.0谨慎servlet API 包名由 javax 变 jakarta老代码要改导入这个表格建议直接截图存着。遇到“代码没错但启动就报 NoClassDefFoundError”这类问题时第一反应不是去查代码而是看 Tomcat 版本和代码里 import 的包名一不一致。3.2 最小可运行步骤在 IDEA 里建 Web 项目并跑通第一个 JSP 页面环境确认后先不要急着写报到功能用五分钟跑通一个最小页面确认 Servlet 能转发、JSP 能渲染、数据库能连上。这一步通过的标志是浏览器里能看到当前时间说明三层通了后面写业务才有底。新建一个 Maven 项目打包方式改成 war。pom.xml里只需要三个依赖多了反而容易冲突。dependencies !-- Servlet API编译时需要部署时 Tomcat 自带 -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency !-- JSP API -- dependency groupIdjavax.servlet.jsp/groupId artifactIdjavax.servlet.jsp-api/artifactId version2.3.3/version scopeprovided/scope /dependency !-- MySQL 驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependenciesscope设置成provided意味着打包时不会把 Servlet 和 JSP 的 jar 塞进 war 包里因为这些 jar 在 Tomcat 的 lib 目录里已经有了。如果写compile带上也没大问题但可能和 Tomcat 自带的版本冲突出现两个 Servlet API 的诡异报错所以这里用provided是习惯操作。然后写一个最简单的 Servlet专门用来验证请求能不能转发到 JSP。import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; WebServlet(/index) public class IndexServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute(serverTime, new java.util.Date()); request.getRequestDispatcher(/index.jsp).forward(request, response); } }用WebServlet(/index)注解配置映射效果等同于在 web.xml 里写一大段servlet配置。课设阶段用注解能少写很多 XML但如果你们学校要求看传统配置建议还是保留 web.xml。index.jsp页面里只做一件事把 Servlet 传过来的时间显示出来。% page contentTypetext/html;charsetUTF-8 languagejava % html headtitle新生报到系统 - 环境验证/title/head body h2当前服务器时间/h2 p% request.getAttribute(serverTime) %/p /body /html这里用% %输出属性是 JSP 最基础的表达式语法。跑通之后在 IDEA 里配置 TomcatDeployment 添加当前项目的 war exploded 模式Application context 填/enroll。启动后访问http://localhost:8080/enroll/index能看到时间就说明环境链路完整。接着再写一个 JDBC 测试类连接刚建好的库能查出版本号环境就算彻底通了。注意Application context 的值决定访问路径如果它被配置成/那就是直接访问http://localhost:8080/index。这个值建议保持和项目名一致减少后面部署时的路径混乱。4. 核心模块实现报到登记、宿舍分配与统计的落地思路环境通了数据库表也建好了接下来就是写业务。新生报到系统最核心的两段代码一是报到登记入口接收页面提交的数据经过校验后写库二是统计报表把全校报到进度用一条 SQL 拉出来。这两段我分开讲因为它们一写一读代表了 JavaWeb 里最典型的两个方向。4.1 基于 MVC 分层用 Servlet 接收报到表单并写库报到登记页面提交的字段大概是学号、姓名、性别、班级、宿舍ID。Servlet 收到这些参数后不能直接操作数据库而是调 Service 层由 Service 层管理事务。这样做的原因是“报到”不是一次单表插入它至少要同时更新两张表学生表写入报到状态和宿舍ID宿舍表把used_count加一。两步操作必须在一个事务里要么都成功要么都回滚否则就出现“学生显示已报到但宿舍床位没扣”的脏数据。WebServlet(/report/add) public class ReportServlet extends HttpServlet { Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String studentNo request.getParameter(studentNo); int dormId Integer.parseInt(request.getParameter(dormId)); int operatorId Integer.parseInt(request.getParameter(operatorId)); ReportService service new ReportService(); try { service.report(studentNo, dormId, operatorId); request.setAttribute(msg, 报到成功); } catch (Exception e) { request.setAttribute(msg, 报到失败 e.getMessage()); } request.getRequestDispatcher(/report/result.jsp).forward(request, response); } }request.setCharacterEncoding(UTF-8)这一行必须放在读取任何参数之前。它的作用是告诉 Tomcat 用 UTF-8 解码请求体解决 POST 提交的中文乱码。Integer.parseInt在这里没有做异常处理真实项目里要加 try-catch否则非法参数会让页面直接 500。Service 层里的事务控制是这段代码的精华写出来大概长这样public void report(String studentNo, int dormId, int operatorId) throws Exception { Connection conn DBUtil.getConnection(); try { conn.setAutoCommit(false); // 1. 检查学生是否存在且未报到 StudentDao studentDao new StudentDao(); int studentId studentDao.checkUnreported(conn, studentNo); if (studentId -1) { throw new RuntimeException(学号不存在或已完成报到); } // 2. 更新学生表和宿舍表 studentDao.updateReportStatus(conn, studentId, dormId); // 3. 写入操作日志 ReportLogDao logDao new ReportLogDao(); logDao.insert(conn, studentId, 报到, operatorId); conn.commit(); } catch (Exception e) { conn.rollback(); throw e; } finally { DBUtil.close(conn); } }setAutoCommit(false)是事务的开始commit()和rollback()分别对应成功与失败。关键点是同一个Connection要在三个 DAO 方法之间传递保证它们用的是同一个数据库连接事务才有效。很多新手在每个 DAO 里各自getConnection()结果事务控制形同虚设。宿舍分配的核心 SQL 同样放在这里说。分配时不是先查再改而是用一条 UPDATE 语句原子地完成“占用一个床位”UPDATE dormitory SET used_count used_count 1 WHERE id ? AND used_count bed_count这个 WHERE 条件里带上used_count bed_count数据库会在更新时自动判断。如果影响行数为 0说明床位已满或宿舍不存在代码里直接抛异常触发回滚。这就是你说的防并发、防超卖比先 SELECT 再 UPDATE 靠谱得多。4.2 报到单打印与按学院统计JSP 页面与报表 SQL报到登记完成后要打印一张报到单上面有学生基本信息、报到时间、分配的宿舍。很多毕设源码喜欢把这个逻辑全塞在 JSP 里页面里套一堆% %能跑但没法维护。常见做法是 Servlet 里查出数据放到 request 域JSP 里只负责展示。% page contentTypetext/html;charsetUTF-8 languagejava % html headtitle新生报到单/title/head body h3新生报到单/h3 p学号${student.studentNo}/p p姓名${student.name}/p p报到时间% new java.text.SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(new java.util.Date()) %/p p宿舍${student.building} - ${student.roomNo}/p /body /html页面里直接调用new java.util.Date()虽然不推荐但在打印报到单这种一次性页面上能接受。如果你想稳妥一点就在 Servlet 里把report_time格式化好再放进 requestJSP 就纯粹做显示。这套系统的核心追求是能跑通、能答辩不是要做一个企业级框架。统计报表这里给出一条万能 SQL效果是把每个学院的报到人数、报到率一次性算出来SELECT c.dept_name AS 学院, COUNT(*) AS 新生人数, SUM(CASE WHEN s.status 1 THEN 1 ELSE 0 END) AS 已报到人数, ROUND(SUM(CASE WHEN s.status 1 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) AS 报到率 FROM student_info s JOIN class_info c ON s.class_id c.id GROUP BY c.dept_name ORDER BY 报到率 DESC;SUM(CASE WHEN ... THEN 1 ELSE 0 END)是条件计数的经典写法把“统计已报到人数”这个需求在一条 SQL 里完成不需要在 Java 里循环查库。GROUP BY按学院分组后COUNT(*)是每个学院的总人数比值再乘 100 就是报到率。这段 SQL 建议单独放在StatsDao里页面用 JSTL 的c:forEach遍历结果集就可以生成报表表格。如果导师要求报表导出可以在 Servlet 里用 POI 生成 Excel但这属于加分项排期不够就先把页面里的表格做漂亮。5. JSPSQL 开发避坑5 个常见问题与一个固定排查顺序JSPSQL 这套老技术栈的坑非常固定几乎每个人都会踩一遍。我把这几年最常见的五类问题按现象、原因、解决的格式整理出来每个都是血泪经验。你照着项目对号入座能省下一整周的排查时间。5.1 中文乱码JSP 页面、Servlet 和数据库三层都要管现象页面上输入中文姓名提交后数据库里变成问号或者数据库里正常页面上显示乱码。原因编码链路断了一环。JSP 页面用 UTF-8到了 Servlet 读取参数时没设置请求编码数据库连接串里没指定字符集建表时字符集用了默认的 latin1这三处有一处不对就乱码。解决统一做三件事。第一JSP 文件头部写pageEncodingUTF-8第二Servlet 里在读取第一个参数之前调用request.setCharacterEncoding(UTF-8)第三JDBC 连接串带上字符集参数。jdbc:mysql://localhost:3306/enrollment?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai排查时有个固定顺序先看页面源码里 charset 是什么再在 Servlet 里打日志看参数是否正常最后直接打开 Navicat 看表数据。这三步从前往后走基本十分钟定位。最常被漏掉的是连接串里没加characterEncoding页面和 Servlet 都对数据一进库就变问号。5.2 SQL 注入与字符串拼接不要在登录功能里放松警惕现象在用户名框输入 or 11能直接登录后台。原因登录代码里把用户输入拼进了 SQL 字符串比如SELECT * FROM user WHERE usernamename。输入内容被当成了 SQL 代码执行。解决所有 SQL 一律用 PreparedStatement 参数占位符禁止拼字符串。String sql SELECT id FROM sys_user WHERE username ? AND password ?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery();setString会把输入内容真正当成字符串处理引号和分号都不会再参与 SQL 解析。这条规则不只针对登录所有接收用户输入的地方——搜索框、报到备注、班级名称——都要用参数化查询。任何SELECT * FROM xxx WHERE name name 的写法都是给自己埋雷。5.3 驱动版本与连接串不匹配Maven 依赖里的隐形翻车现象启动 Tomcat 后访问数据库相关功能控制台报ClassNotFoundException: com.mysql.jdbc.Driver或者报Communications link failure。原因MySQL 8.x 的 JDBC 驱动把驱动类从com.mysql.jdbc.Driver迁移到了com.mysql.cj.jdbc.Driver同时新增了serverTimezone参数要求。老教程里的旧驱动类在部分新版本中不适用连接串少参数直接失败。解决pom.xml 里显式写清楚驱动版本连接串一次写全。com.mysql.cj.jdbc.Driver jdbc:mysql://localhost:3306/enrollment?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueuseSSLfalse是明确不使用 SSL 加密连接本机开发环境不需要证书。allowPublicKeyRetrievaltrue解决 MySQL 8.x 连接时出现的公钥检索报错。这两个参数不加即使驱动类写对了也会连不上。遇到连接问题先查驱动 jar 是否在WEB-INF/lib下再查连接串参数最后查 MySQL 服务是否启动按这个顺序排查。5.4 上传文件路径写死重启 Tomcat 后照片消失现象新生证件照上传后能正常显示但重启 Tomcat 或者重新部署项目照片全没了。原因上传文件保存到了 Tomcat 的 webapps 部署目录里比如webapps/enroll/upload。Tomcat 重新部署时会清理工作目录文件自然被删掉。更隐蔽的是本地 IDEA 和服务器路径不一致本地能查到图服务器找到不。解决文件保存到项目外部的固定磁盘目录数据库里只存相对路径再用 Tomcat 虚拟路径映射出去。配置方式是在 server.xml 的 Host 节点下加一行 Context或者用 Spring 系的资源映射注解。常见做法是本地放在D:/enroll_upload生产环境换成一个独立挂载盘。数据库里存储的应该是2025/09/01/20250101.jpg这种相对路径页面展示时拼上访问前缀。这样项目不管部署到哪台机器只要外部目录跟着搬走数据就不会丢。以后接云存储也只需要改这个前缀。5.5 重复提交与并发报到小白最容易忽略的数据层防线现象迎新当天两个老师在同一台或两台电脑上对同一个学号连续点了两次“报到”数据库里出现两条报到记录或者宿舍床位被重复扣减。原因前端没有防重复提交后端业务代码也没有做并发校验。两个请求同时通过查询检查都能查到“未报到”然后各自执行插入最终产生两条记录。解决数据库和业务两层同时控制。第一层student_info.student_no字段建 UNIQUE 唯一索引重复插入直接报 DuplicateKeyException这是最终防线第二层后端更新报到状态用带条件的 UPDATE影响行数为 0 就说明已被别人处理UPDATE student_info SET status 1, report_time NOW() WHERE student_no ? AND status 0前端也不是无事可做提交后立刻把按钮设成disabled配合后端的原子更新。宿舍扣床位同样用前面那种used_count bed_count的条件更新。这两个条件更新写完并发问题基本绝迹。6. 收尾技巧用一条 SQL 校验报到数据给答辩留好演示场景系统写完后验收不能只靠肉眼点页面。我习惯在最后阶段把数据库当成“唯一事实来源”用报表 SQL 验证录入的数据是否完整一致。下面的 SQL 在校验的同时就是答辩时最有力的演示素材打开页面跑一次全校报到率一览无余。SELECT c.dept_name AS 学院, COUNT(*) AS 新生人数, SUM(CASE WHEN s.status 1 THEN 1 ELSE 0 END) AS 已报到, ROUND(SUM(CASE WHEN s.status 1 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) AS 报到率 FROM student_info s INNER JOIN class_info c ON s.class_id c.id GROUP BY c.dept_name;数据校验建议对照下面这个表格逐项过一遍。每项检查对应一个常见的交付事故顺序不要颠倒否则现场演示时容易翻车。检查项操作通过标准中文数据新建一条含中文的报到记录并刷新页面、数据库均无乱码宿舍余量连续分配满一个房间的床位房间满员后不能再被分配数据持久化重启 MySQL 和 Tomcat 后重新查询数据不丢失统计报表给三个学院各造 5 条演示数据报到率计算正确换机部署换一台电脑重新部署运行不再依赖本机 IDEA 环境我自己的习惯是在把系统交给学院机房之前一定先把 Tomcat 端口从默认的 8080 改成不太容易被占用的端口再重启一次 MySQL、重启一次 Tomcat按上面表格跑一遍检查流程。最后一步是跑一次这条统计 SQL看到有数据并且数字合理才算真正收工。这样做的不只是确保功能正常更是给自己留一条“我验证过”的底气。希望帮到你。本文还有配套的精品资源点击获取
返回列表