资讯详情

资讯详情

数据库实验报告三:MySQL与JSP/Servlet小型MIS系统源码解析

简介数据库系统课程实验报告三聚焦小型管理信息系统开发面向高校数据库初学者与课程设计者以南京邮电大学实验要求为背景使用MySQL完成一套航班信息管理的小型MIS系统。报告完整覆盖实验目的、环境、原理与实现理解C/S或B/S结构开发思路掌握ODBC和ADO的作用学习通过界面操作数据库从建库建表到数据操纵步骤齐全。核心内容包括航班表、飞机表、乘客表、机票表四张表的创建字段涵盖航班号、起降地点与时间、机型、座位数等同时展示了唯一索引、视图和存储过程如查询航班是否满员的编写方法。整份实验报告以SQL代码为主线结合文字说明便于读者直接参考建库逻辑和实验报告格式尤其适合数据库课程设计或期末实验参考。压缩包仅含1个doc文档约359KB内容完整已有405人学习/下载。1. 数据库系统实验报告三一份能直接跑通的小型MIS源码包数据库系统这门课最劝退的不是理论考试而是实验报告三这种“小型MIS开发”的题目。它要求你用一个学期学的关系代数、范式、SQL去交付一个能点按钮、能查数据、能报错的完整系统很多同学就是在这里第一次被Tomcat、JDBC、连接池轮番折磨。这篇文章拆的正是南京邮电大学那份实验报告三的配套资源一套基于MySQL JSP/Servlet的小型管理系统理论文档和可运行代码都在里面。它解决的核心问题是让你不用从头趟一遍“为什么连不上数据库”的坑直接对着表结构设计、分层代码和验收文档把实验从及格做到优秀。适合正在做数据库课设、需要MIS参考实现、或者想补一下JDBC手工编程的从业者新手能照步骤跑通熟手也能拿它的边界设计当样板。2. 先搞懂实验报告到底要什么需求拆解与数据模型设计2.1 从实验指导书能读出什么功能清单和边界大多数学校的“小型MIS开发”题目都长得很像学生/图书/商品/订单任选一个方向做增删改查。南邮这份实验报告三用的是典型的教务管理场景核心功能是学生信息维护和课程成绩管理。拿到手别急着写代码先把报告里的需求描述拆成边界这是我拆这个资源包时做的第一件事。需求拆解的第一步是列功能清单。报告正文里会有一段“系统功能概述”通常包含管理员登录、学生信息录入与修改、课程信息维护、成绩录入、按条件查询、数据统计。这些功能并非对等登录和查询是必做项统计是加分项。我当时用表格把功能分成核心功能与扩展功能两类核心功能决定你能不能及格扩展功能决定报告有没有亮点。功能边界比功能清单更重要。实验报告里往往有一句话“本系统为教学演示用途”这句话的意思是不要去做密码找回、细粒度权限、事务回滚这类生产级需求。你做了并不会扣分但会挤占你调通核心功能的时间。我在这个实验里看到的最大的翻车是有人把时间全花在研究MD5加密和权限框架上结果基本的列表分页反而没做出来。需求拆解的产物应该是一张可以直接对着建表的清单实体学生、课程、成绩、属性学号、姓名、系别等、关系一个学生选多门课一门课被多个学生选。这张清单直接决定下一步的ER图和表结构也是实验报告里必须贴出来的核心素材。2.2 为什么是这套组合MySQL JSP/Servlet的技术选型理由这个实验报告三的配套代码用的是 JSP Servlet JDBC MySQL没有用 MyBatis更没有用 Spring Boot。很多新手拿到代码会觉得“怎么这么老”但这是数据库实验的合理选择不是资源包作者偷懒。原因在于实验考察的重点是SQL和数据库设计不是框架能力。用 JDBC 手工写连接、写PreparedStatement、遍历ResultSet每一步都强迫你面对数据库本身。你写 PreparedStatement 的时候会想参数占位符你写 ResultSet 的时候会想列名和类型映射这些是用 MyBatis 时感知不到的。这一套正好匹配南邮实验报告的评分点ER图、关系模式、范式分析、SQL语句代码只是验证设计的工具。MySQL 的选择更没有争议。MySQL 的安装包小、启动快、SQL 语法最接近教材的 SQL 标准Information_Schema 也能直接查表结构用于报告截图。相比 OracleMySQL 在课程实验里几乎不需要额外配置。如果这份资源包里你看到了 MySQL 的建表脚本直接用它别自以为是把语句改成 PostgreSQL改语法容易改驱动和方言会浪费你一下午。Tomcat 作为 Servlet 容器也是教材默认配置。用 8.5 或 9.0 版本即可Servlet 3.0 以上的注解配置就够用了不需要 XML 配置 web.xml。这里有个参数要注意Tomcat 版本和 JDK 版本要匹配Tomcat 9 需要 JDK 8 以上如果你本机是 JDK 11就不要下载 Tomcat 7。这个坑后面避坑章节会细说。2.3 表结构设计从ER图到物理建表的三步走打开资源包里的db.sql你会看到三张表student、course、sc选课成绩表。这就是经典的学生-课程-成绩模型关系模式和范式的分析也围绕它展开。我建议你拿到建表脚本之后自己动手画一遍ER图再对照脚本理解不要直接去点运行。第一步实体表和关系表分开建。student 和 course 是实体表sc 是关系表。sc 表的主键是复合主键 (sno, cno)外键分别引用 student 和 course 的主键。这么设计是第三范式的要求sc 表中只存储 sno、cno、gradegrade 依赖复合主键整体不存在传递依赖。第二步选择数据类型和长度。学号用CHAR(9)而不是INT原因有两个学号不需要数学计算保留前导零学号未来可能掺入字母。课程号同理选课的课程编号如果是“CS101”INT 没法存。成绩grade用DECIMAL(5,1)或者TINYINT看需不需要小数。我见过有人用FLOAT存成绩实验报告里被老师画了圈因为浮点存在精度问题DECIMAL 才是数据库教材认可的做法。第三步建立索引和约束。主键自带唯一索引外键在 MySQL 的 InnoDB 引擎下会自动建索引但建议显式声明。重点检查的是默认值和空值约束性别字段建议默认值‘男’成绩字段可以允许 NULL表示未考试但允许 NULL 的字段在统计函数 SUM、AVG 里会被忽略这个细节是报告的加分点。下面是资源包里建表脚本的核心部分我加了注释-- 学生表注意学号用 CHAR不是 INT保留前导零 CREATE TABLE student ( sno CHAR(9) PRIMARY KEY COMMENT 学号, sname VARCHAR(20) NOT NULL COMMENT 姓名, ssex CHAR(2) DEFAULT 男 COMMENT 性别, sage TINYINT COMMENT 年龄, sdept VARCHAR(20) COMMENT 系别 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 课程表课程号可能含字母用 VARCHAR CREATE TABLE course ( cno VARCHAR(10) PRIMARY KEY COMMENT 课程编号, cname VARCHAR(30) NOT NULL COMMENT 课程名, cpno VARCHAR(10) COMMENT 先行课编号可为空, ccredit TINYINT COMMENT 学分 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 选课表复合主键两个外键 CREATE TABLE sc ( sno CHAR(9) NOT NULL, cno VARCHAR(10) NOT NULL, grade DECIMAL(5,1) COMMENT 成绩允许空, PRIMARY KEY (sno, cno), CONSTRAINT fk_sc_student FOREIGN KEY (sno) REFERENCES student(sno), CONSTRAINT fk_sc_course FOREIGN KEY (cno) REFERENCES course(cno) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这段脚本有三点值得说明。ENGINEInnoDB必须写因为 MyISAM 不支持外键外键约束会形同虚设这直接影响实验报告里“参照完整性”的论述。CHARSETutf8mb4是解决中文乱码的前提条件后面避坑章节你会看到乱码一半以上的原因是字符集不一致。外键的命名fk_sc_student是显式的如果你不命名MySQL 会生成一个随机外键名删约束时会很难受。到这里需求、选型、表结构这三块地基已经齐了。接下来的实验报告才真正进入“开发”环节你要开始把这三张表从数据库搬到浏览器页面上。3. 把环境搭起来从安装到第一个能连库的页面3.1 环境参数怎么设JDK、Tomcat、MySQL 的版本搭配资源包里的代码是十年前左右的经典写法用今天的软件环境来跑版本搭配就得自己动点脑筋。我的建议是别追求最新版选经过验证的组合最省时间。JDK 用 8 或者 11 都行。Servlet 和 JSP 的代码用的是 javax.servlet 命名空间JDK 11 以下编译没问题如果用了 JDK 17 以上Servlet 容器就需要 Tomcat 10那个版本已经把 javax 改成了 jakarta资源包里的代码直接会编译报错。这是环境搭建里第一个隐藏的时间杀手。Tomcat 用 9.0.x 的稳定版对应 Servlet 4.0兼容 javax 包。MySQL 用 5.7 或者 8.0 都可以但要注意 8.0 的 JDBC 驱动名不再是com.mysql.jdbc.Driver而变成了com.mysql.cj.jdbc.Driver。资源包里的db.properties如果还写着旧驱动名你要手动改掉。关于 MySQL 8.0 还有一个时区参数要处理。8.0 的 JDBC 连接串要求带serverTimezone否则会报The server time zone value异常。连接串里加上?serverTimezoneAsia/ShanghaiuseSSLfalsecharacterEncodingutf8。这些不是猜的是 JDBC 驱动本身的行为约束你绕不过去。我把推荐的版本组合列成一个表格方便你直接照着配组件推荐版本关键参数说明JDK8 或 11必须低于 17否则 javax 无法使用Tomcat9.0.x对应 Servlet 4.0不要在 Tomcat 10 下跑MySQL5.7 或 8.08.0 的驱动名和时区参数需特判JDBC 驱动mysql-connector-java 5.1.4x 或 8.0.x与 MySQL 大版本匹配3.2 数据库初始化导入脚本的正确顺序和验证方法资源包里有建库脚本和示例数据脚本通常合并在一个db.sql文件里也可能拆成schema.sql和data.sql两个文件。我建议你用命令行导入而不是在 Navicat 里点“运行SQL文件”。命令行能直接看到报错Navicat 常常只提示某行有错不告诉你上下文。导入顺序是先建库再选库最后建表插数据。很多人直接 source 整个文件如果文件里没有CREATE DATABASE语句就会把表建到默认数据库里导致后面连接串的库名对不上。所以我的习惯是先手动建库mysql -u root -p CREATE DATABASE IF NOT EXISTS mis_system DEFAULT CHARSET utf8mb4; USE mis_system; SOURCE /path/to/schema.sql; SOURCE /path/to/data.sql;命令行参数说明-u root指定用户-p表示接下来会提示输入密码。SOURCE后面的路径用绝对路径比较稳妥Windows 下注意斜杠方向要正斜杠/反斜杠会被当成转义字符这是 Windows 下最容易翻车的点。导入完以后先别急着开 Web 项目先用一条查询验证一下数据是否完整SELECT COUNT(*) FROM student; SELECT COUNT(*) FROM course; SELECT COUNT(*) FROM sc;如果 student 表查询出 0 行多半是数据脚本里有INSERT语句没执行成功常见原因是唯一键冲突或者编码问题。如果中文显示成乱码先检查你终端连接 MySQL 的字符集执行SET NAMES utf8mb4;再查一次。这一步的验证非常关键数据库层不对后面 Web 项目所有的报错都是假的。3.3 Web 工程骨架与被误解的 JDBC 连接写法资源包里会有一个完整的 Web 工程结构标准的是 Eclipse/MyEclipse 的 Dynamic Web Project 布局src目录放 Java 代码WebContent目录放 JSP 页面和静态资源WEB-INF/lib放驱动 jar 包。如果你用 IDEA这个结构也能直接导入但要注意 IDEA 里 Web 工程的编译输出目录和 Tomcat 部署配置要重新指定这个不是代码问题是 IDE 配置问题。把工程导入以后第一件事不是改代码而是先确认 jar 包依赖。打开WEB-INF/lib目录看有没有mysql-connector-java的 jar 包没有的话去 Maven 仓库下载对应版本放进去。有的资源包为了减小体积会把 jar 包删掉只留代码这一步就不能跳过了。JDBC 连接写在src/db/DBUtil.java里这是整个工程的基础设施。我把它拆开看一下因为这份代码是实验报告的必答题之一你最好自己能默写出来package db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/mis_system ?useSSLfalsecharacterEncodingutf8serverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }这段代码有三个地方值得解释。Class.forName(com.mysql.cj.jdbc.Driver)是显式注册驱动MySQL 8.0 驱动在这种方式下会打印一条废弃警告但不会报错可以忽略MySQL 5.7 环境要用com.mysql.jdbc.Driver。static块的作用是类加载时只执行一次驱动注册避免每次调连接都重复注册。URL 里的那三个参数分别解决 SSL 警告、中文乱码、时区异常缺一个都会出幺蛾子。配好工程后启动 Tomcat浏览器访问http://localhost:8080/工程名/index.jsp能看到登录页面就算环境通了。这里有一个很容易翻车的细节工程名的大小写和部署时的 Context Path 大小写要保持一致Linux 系统严格区分大小写。Windows 不区分但你要是以后在两个系统之间切这个坑迟早踩一次。4. 核心功能落代码登录鉴权、增删改查与分页的工程实现4.1 登录鉴权第一个安全点也是第一个扣分点小型MIS的登录逻辑并不复杂但它是这个实验报告里分数权重最高的一环因为老师会在报告审核时专门看两个东西你有没有做输入校验你有没有做 Session 控制。资源包里这两块都有但实现方式有几个细节值得学习。登录表单提交到LoginServletServlet 里取出username和password拼接 SQL 查询用户表。关键点在于这里必须用PreparedStatement不能直接字符串拼接 SQL。理由不需要上升到 SQL 注入层面就说一个最直接的字符串拼接时密码里有单引号SQL 直接报语法错误。资源包的写法一般是这样的String sql SELECT * FROM admin WHERE username ? AND password ?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { session.setAttribute(admin, username); response.sendRedirect(main.jsp); } else { response.sendRedirect(login.jsp?error1); }这段代码的逻辑很直白?占位符配合setString传参JVM 会处理掉特殊字符的转义问题你不用自己拼 SQL 引号。我个人建议拿到代码后把password的校验改成先查用户存在性再单独比对密码字段因为实验报告里如果出现“密码明文存储”部分评阅老师会扣设计分。但如果你不想改数据库至少要在报告中提一句“明文密码仅为实验演示生产环境应加盐哈希”这是个成本极低但收益明显的报告话术。登录成功后session.setAttribute(admin, username)是必须的一行没有它登录就是假的。你需要在每个需要登录的 JSP 页面顶部加上身份校验代码这是很多版本资源包的隐藏坑页面能打开但刷新后不需要登录也能访问。4.2 列表与分页SQL 的 LIMIT 和页面上的“上一页/下一页”列表页是 MIS 系统的门面。学生列表、成绩列表都要从数据库查出多行数据渲染到 HTML 表格。实验报告要求里通常有一条“支持分页显示”这是评分细则里的高频考点。资源包的实现一般是写一个PageBean类来封装页码、每页条数、总记录数和当前页数据。分页的核心逻辑其实就在两条 SQL 语句里。第一条是统计总记录数第二条是查当前页数据int pageNum Integer.parseInt(request.getParameter(page) null ? 1 : request.getParameter(page)); int pageSize 5; String countSql SELECT COUNT(*) FROM student; PreparedStatement ps1 conn.prepareStatement(countSql); ResultSet rs1 ps1.executeQuery(); int totalCount 0; if (rs1.next()) { totalCount rs1.getInt(1); } int totalPage (totalCount % pageSize 0) ? (totalCount / pageSize) : (totalCount / pageSize 1); String dataSql SELECT * FROM student LIMIT ?, ?; PreparedStatement ps2 conn.prepareStatement(dataSql); ps2.setInt(1, (pageNum - 1) * pageSize); ps2.setInt(2, pageSize); ResultSet rs2 ps2.executeQuery();逻辑说明LIMIT ?, ?的第一个参数是偏移量第二个参数是返回行数。偏移量的计算公式是(pageNum - 1) * pageSize这个公式容易出错的地方是字符串和整数之间的转换前端传过来的page参数是字符串必须Integer.parseInt转一次。页码越界的情况也要处理比如page传 999 时应该强制把它重置为最后一页否则页面会出现空白数据。这里有个容易被忽略的细节totalCount % pageSize判断的是是否有余数。有余数说明最后一页是不满的需要额外加一页。我在不少同学的代码里看到过用Math.ceil代替这个判断的写法效果一样但在实验报告里手写这个条件表达式的直观性比调用函数更能向老师展示你对分页逻辑的理解。页面上需要渲染总共几页、当前是第几页、上一页和下一页的超链接。这里的链接写法也是一个有讲究的点a hrefStudentListServlet?page% currentPage - 1 %上一页/a a hrefStudentListServlet?page% currentPage 1 %下一页/a参数说明如果当前页是第一页上一页链接应该置灰条件是currentPage 1时才输出同理当前页是最后一页时下一页要置灰。有的版本资源包没有处理这个边界访问第一页时的上一页会跳到第 0 页这是个低级但常见的 bug你在跑通这个实验后顺手修一修报告里还能多写一条“对边界条件的处理”。4.3 增删改操作三种表单提交方式的取舍MIS 系统的增删改在技术上没有难度真正的问题是一个 Servlet 接口处理多种请求时路径和方法怎么组织。南邮这个配套代码的做法清晰直接新增和修改各用一个 Servlet删除用GET请求带参数。新增和修改本质上是同一张表单的两个状态。新增表单提交时 action 指向AddStudentServlet修改表单提交时 action 指向UpdateStudentServlet。如果你不想多写一个 Servlet也可以用同一个StudentSaveServlet内部靠判断id是否为空来区分新增还是修改String id request.getParameter(id); if (id null || id.isEmpty()) { // 新增 } else { // 修改先按 id 更新 }这种做法的逻辑集中在同一个类里实验报告里可以少贴一段代码但可读性会略差。我个人更推荐分开写让代码结构对老师更友好。删除操作建议单独用一个 Servlet 处理因为删除链接通常是a标签不是表单提交a hrefDeleteStudentServlet?sno% rs.getString(sno) % onclickreturn confirm(确定删除该学生吗)删除/a这段代码里最容易被忽略的是confirm函数。实验报告要求你展示 “思考过删除操作的影响”一个确认框就是最直白的证据。如果资源包里漏了自己补上只有一行。删除操作在数据库层面就是DELETE FROM student WHERE sno ?但你要在报告中写清楚级联问题如果这个学生已经有成绩记录在 sc 表里直接删 student 会违反外键约束需要先删 sc 里的记录。这是外键约束在工程里的第一次真实体现也是报告里值得大写特写的一段。新增和修改表单里还有一个经典难点下拉框回显。修改学生信息页面里的系别下拉框需要把原值与值列表匹配selected属性正确落位。这个不是技术问题是细节问题但就是这种细节决定报告能不能让老师觉得你“做完了系统”还是“只是把代码跑通了”。5. 避坑排查这些报错和乱码实验周里几乎必然遇到5.1 中文乱码三层原因一次排查现象页面显示学生姓名全是?????或者数据库里插入的中文变成问号。原因这是连锁问题。第一层是数据表字符集不是 UTF-8第二层是 JDBC 连接串没带characterEncodingutf8第三层是 JSP 页面编码不是 UTF-8。最底层的根因通常是建表时没写DEFAULT CHARSETutf8mb4导致表用了 MySQL 默认的 latin1。解决按三层逐个排查。先检查建表语句SHOW CREATE TABLE student看到字符集不对就ALTER TABLE student CONVERT TO CHARACTER SET utf8mb4。再检查连接串确实带characterEncodingutf8但还乱码的话加一个useUnicodetrue。最后检查 JSP 头部的contentTypetext/html; charsetUTF-8。我处理这个问题的习惯是在 JSP 页面顶部写一个测试查询直接输出中文字段先定位乱码发生在存储层还是传输层能省很多时间。5.2 ClassNotFoundException驱动加载失败的隐藏原因现象Tomcat 启动后访问页面报java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。原因驱动 jar 包没有放到正确的目录。Tomcat 的 Web 应用查找类路径的顺序是从WEB-INF/lib读取如果你把 jar 包放在了项目根目录Tomcat 根本不认识它。此外驱动类名写错也会报这个错MySQL 5.7 用com.mysql.jdbc.Driver8.0 必须用com.mysql.cj.jdbc.Driver。解决先确认 jar 包在WEB-INF/lib下再确认驱动类名和 MySQL 大版本匹配。如果两个都没问题执行jar tf mysql-connector-java.jar查看压缩包里的实际类路径版本不同类路径确实有差异。还有一种情况是 jar 包损坏重新下载一个覆盖放进去。这个报错很直接排查优先级从高到低是目录、类名、jar 完整性。5.3 Tomcat 端口被占用现象启动 Tomcat 时立刻报SEVERE: Failed to initialize end point associated with ProtocolHandler或者是Address already in use: JVM_Bind。原因8080 端口已经被另一个程序占用了。常见占用者有三个之前没关干净的 Tomcat 实例、被其它开发工具占用的端口、恶意软件的监听端口。解决Windows 下先执行netstat -ano | findstr 8080找到占用进程的 PID再在任务管理器里结束它。第二选择是改 Tomcat 端口去conf/server.xml里把 Connector 的 port 改成 8081。我一般直接用第二个方案因为可以一劳永逸避开被占用的端口同时也能验证资源包里的 JSP 页面是否用绝对 URL 写死了端口。如果代码里写死了 8080改端口后记得全局替换。5.4 连接池耗尽Too many connections现象系统用几次后卡住日志有Connection is not available, request timed out或者数据库报Too many connections。原因代码里获取的连接没有被关闭。注意DBUtil.getConnection()之后必须在finally块里关闭Connection、PreparedStatement、ResultSet这三件套。很多新手只关闭了连接对象忽略了结果集和语句对象这些资源虽然随着连接关闭会释放但如果你在使用连接池池里的连接不会真正关闭结果就是池被慢慢耗尽。解决检查所有 DAO 类里的资源管理代码最稳妥的写法是 Java 7 以后支持的 try-with-resources。在实验报告里你可以在文档中展示一段用finally手动关闭的代码并在结论处写“使用 try-with-resources 进一步简化”这会展示你对比过两种写法的思考过程。磁盘上如果 MySQL 本身连接数已经满了执行SHOW PROCESSLIST查看哪些连接卡住了然后重启 MySQL 临时解决。5.5 SQL 保留字和 MySQL 语法差异现象建表或插入语句报You have an error in your SQL syntax仔细核对语法却看不出问题。原因表名或字段名与 MySQL 保留字冲突。最常见的是字段名用了name、order、group。order如果不做处理在任何 SQL 里都会被当成关键字解析看到混乱的语法报错是必然的。解决两个方案二选一。一是表名和字段名全部用反引号包起来这是 MySQL 的答案二是改字段名比如把order改成order_no把name改成username。方案二更彻底因为你不可能在每个 SQL 语句里都记得加反引号。我在检查这个资源的表结构时会刻意把所有的字段名与 MySQL 保留字表做一遍对照这比报错后再去排查节省时间。5.6 Servlet 类编译后不生效的玄学现象改了 Servlet 的 Java 代码重启 Tomcat 后行为不变甚至出现404或500。原因Eclipse/MyEclipse 项目里Tomcat 部署时用的是编译输出目录不是源码目录。如果你只在 src 里改了 .java 文件Tomcat 又没触发自动编译跑的还是旧的 class 文件。更隐蔽的是有些 IDEA 的 Web 项目里classes 输出目录被配置到了WEB-INF/classes但你新加的 jar 包没有同步过去。解决先Project - Clean再重启 Tomcat。这在大多数时候能解决因为 Clean 会把旧的 class 文件删掉重新编译。如果你看到 Tomcat 的日志里Reloading Context更新了但页面依旧老行为就去WEB-INF/classes目录看一眼 class 文件的修改时间基本能确认是不是没编译新代码。这个问题像玄学本质是构建工具和容器的配合问题。6. 拿到这份资源后先做一遍完整的端到端验证验证一份实验报告能不能放心下载复用不能只看代码能不能部署我的习惯是走一条固定的验收路径。首先在数据库层做一次数据完整性检查确认三个表的数据量对得上。我一般会跑下面这条 SQL 做最关键的参照完整性验证SELECT COUNT(*) FROM sc s LEFT JOIN student stu ON s.sno stu.sno WHERE stu.sno IS NULL;结果应该是 0 行。如果查出孤儿数据说明外键约束没有真正生效或者导入的示例数据本身就有问题。这一步先做因为数据问题会污染后面所有的功能测试。然后启动系统按用户路径走一遍登录 → 学生列表 → 新增一个学生 → 修改他的系别 → 删除一条成绩记录 → 查询某个系的学生。每走一步要下意识地打开数据库客户端看对应表的变化。很多同学只在页面看到成功提示就算通过我的建议是登录后去 admin 表里核对 session 的写入删除后再去 sc 表里看级联记录。数据库是最终真相页面只是表象。最后一步我会做的验证很少有人提到把代码里所有的system.out.println删掉或者改成日志输出。实验报告如果准备打印提交作业满屏的控制台输出在评阅老师的印象分里是负反馈。同时把 JSP 里的 Java 代码块尽量挪到 Servlet 或者 JavaBean 中让 JSP 页面只做视图展示这一点评阅标准里常常明写为“代码分层合理”。这份资源包给我的最大感受是“小型MIS开发”这个实验的核心从来不是功能多华丽而是你把 ER 图、关系模式、SQL、Web 代码串成一条完整链路的能力。从那以后我每一次拿到课程设计类资源都不会直接跑起来而是先拿数据库脚本建库再拿需求说明书对表结构最后才是代码部署——这套习惯让我少踩了不知道多少重复的坑。这次的实验报告三你也按这条路走一遍吧希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →