拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Java Web学生信息管理系统:源码部署与Servlet+JDBC实战

Java Web学生信息管理系统:源码部署与Servlet+JDBC实战

简介:面向高校计算机专业学生的一份基于Java Web的学生信息管理系统课程设计资源包,可用于完成课程设计、毕业设计或项目实训。系统以学生信息管理为主线,覆盖登录、系统主界面、添加学生、信息维护、按学号查找、更新与删除学生信息、管理员密码修改、退出系统等完整功能;配套设计说明涵盖功能结构、项目架构、包及Java类说明和数据库设计,便于从需求到实现系统化梳理。资源共78个文件,主要包含JSP页面、Java源码、SQL脚本和DOCX说明文档,另有CSS、JavaScript、jar包及项目配置文件,整体仅2.53MB,目录结构清晰,按说明即可完成部署。目前已有922人学习。通过该资源可获得可运行源码和数据库脚本,参考其分层组织与业务实现后,可直接用于答辩演示、二次改造或学习借鉴。

1. 这套基于 Java Web 的学生信息管理系统:为什么值得下载并复现

做课设最怕的不是不会写代码,而是写完发现项目根本跑不起来。这套基于 Java Web 的学生信息管理系统是一个标准的三层架构课设工程,压缩包里把源码、数据库脚本和说明文档一次给全:StudentManagerWeb 工程目录、student.sql 与 t_manager.sql 两个建表脚本,外加一份可以直接交的说明文档 docx。它解决的是最基础也最常考的那件事——登录鉴权、学生信息增删改查、按学号定位学生、管理员改密码和退出系统。适合两类人:一是要交课设但还没完整跑通一个项目的学生,二是想快速过一遍 Servlet + JDBC 完整链路的初级开发者。下面从工程结构、数据库设计讲到部署运行和排错技巧,把这套资源值不值得下、怎么用、坑在哪一次说透。

2. 先看懂项目结构:包分层、两张表和配置文件的关系

拿到压缩包别急着双击进 IDE。这套资源的文件组织方式是 Eclipse Web 工程的标准形态:Java 代码全在 src,页面和静态资源在 WebRoot,.project 和 .classpath 记录工程元信息,.mymetadata 是 MyEclipse 的 Web 工程专用配置。花十分钟把这些文件的对应关系摸清,后面改需求、查报错都会顺手很多。

2.1 包及 Java 类说明:从 src 目录反推系统的三层设计

打开压缩包里的 src 目录,先看一遍包的命名。这类课设项目几乎都是三层结构:entity 放学生和管理员对象,dao 负责写 SQL 读取数据库,servlet 接收 HTTP 请求并完成页面跳转。具体到这份 StudentManagerWeb 工程,常见的目录结构是这样的:

src/ com/example/entity/ # 实体层 Student.java # 学生实体,字段对应 student 表 Manager.java # 管理员实体,字段对应 t_manager 表 com/example/dao/ # 数据访问层 StudentDao.java # 学生表增删改查的 SQL 全部封装在这 ManagerDao.java # 管理员登录校验与密码修改 com/example/servlet/ # 控制层 LoginServlet.java # 登录入口,成功后写入 Session StudentServlet.java # 学生信息维护的统一入口 com/example/util/ DBUtil.java # JDBC 连接与资源关闭

当然,不同老师给的模板包名会换,具体类的名称以说明文档 docx 里“包及 Java 类说明”那一页为准。重点是先把 Dao 和 Servlet 的边界刻在脑子里:Servlet 只处理请求参数,不直接执行 SQL;SQL 统一放 Dao,这样添加、修改、删除三个功能能复用同一套方法。答辩时老师大概率会追问“为什么不用一个 Servlet 包所有功能”,你能答出“每类功能单独一个类,改动互不影响,SQL 可以复用”,这题就过了。

如果打开源码发现所有类都堆在同一个包里,也不要慌,把同名类按职责区分就行。判断依据很简单:哪个类名带 Dao 就是做数据库操作的,哪个类名带 Servlet 就是做页面控制的。课设项目规模小,包结构乱一点不影响跑通,但答辩印象分会受一点影响。

2.2 数据库设计:student.sql 与 t_manager.sql 里的字段逻辑

这套资源把两张表单独拆成了两个 SQL 脚本,名字很直白:student.sql 建学生表,t_manager.sql 建管理员表。课设里常见的设计如下,直接对照脚本看即可:

-- 学生信息表 DROP TABLE IF EXISTS student; CREATE TABLE student ( student_id VARCHAR(20) NOT NULL COMMENT '学号,业务主键', name VARCHAR(50) NOT NULL COMMENT '姓名', gender VARCHAR(4) DEFAULT '男' COMMENT '性别', age INT DEFAULT 0 COMMENT '年龄', college VARCHAR(100) DEFAULT '' COMMENT '学院', major VARCHAR(100) DEFAULT '' COMMENT '专业', class_name VARCHAR(50) DEFAULT '' COMMENT '班级', PRIMARY KEY (student_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表'; -- 管理员表 DROP TABLE IF EXISTS t_manager; CREATE TABLE t_manager ( id INT NOT NULL AUTO_INCREMENT COMMENT '自增主键', username VARCHAR(30) NOT NULL COMMENT '登录名', password VARCHAR(50) NOT NULL COMMENT '登录密码', PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员表';

这里有几个设计点值得留意。第一,student_id 用 VARCHAR(20) 而不是 INT,因为学号是业务主键,真正的学号可能带字母或前导零,按字符串处理才不会丢精度。第二,两张表之间没有外键约束,这是刻意的:管理员跟学生没有强业务关联,加外键反而让删除学生时还要先管关联记录,课设场景不划算。第三,字符集统一用 utf8mb4 而不是 utf8,utf8mb4 是 MySQL 里真正的四字节 UTF-8,中文和生僻字都不会乱码。

如果说明文档 docx 里的数据字典和你本机脚本不一致,以脚本为准。想加字段比如“籍贯”,需要同步改四处:SQL 脚本、Student.java 实体、StudentDao.java 的 INSERT 和 UPDATE 语句、JSP 表单。漏一处就会出现“数据添加成功但列表看不到”的怪现象,这个坑我改课设时踩过不止一次。

# 两个脚本要按顺序导入,先建学生表再建管理员表 mysql -u root -p mysql> source /path/to/student.sql; mysql> source /path/to/t_manager.sql; mysql> show tables;

2.3 工程配置文件:.mymetadata、.classpath、.project 各管什么

压缩包里能看到 .project、.settings、.classpath、.mymetadata 这些点开头的文件,很多人导入不成功就是因为忽略了它们。它们的分工很明确:

文件作用常见的坑
.projectEclipse 工程描述,记录工程名和构建器工程名被 IDE 自动改名时,部署路径跟着变
.classpathJava 构建路径,列出 src 目录和引用的 jarIDEA 导入后可能漏了 WEB-INF/lib 下的驱动
.mymetadataMyEclipse 的 Web 工程元数据,含 context-root访问路径和这里配置不一致就会 404
.settingsEclipse 插件级配置目录一般不用手动改

其中最重要的是 .mymetadata,里面有一行定义了部署后的根路径,格式类似下面这样:

<project-module type="web" context-root="/StudentManagerWeb"/>

浏览器里访问http://localhost:8080/StudentManagerWeb/login.jsp,后半段路径就是这里定义的。如果你改成 student 或者系统自动生成了一串乱码路径,访问时就必须用对应的名字。导入工程后在 IDE 的 Web 部署配置里也能看到 context root,改完记得重新发布。如果费了半天劲 IDE 还是不认 MyEclipse 老格式,就别跟 .mymetadata 较劲了,新建一个 Dynamic Web Project,把 src 和 WebRoot 整个复制进去,十分钟就能解决。

3. 环境搭建与项目导入:版本配对、部署操作和 DBUtil 参数

这章直接对照下载包的场景来,目标是让 login.jsp 能在浏览器里正常打开。版本配对这一步非常关键,很多课设源码跑不起来根本不是代码问题,是 JDK 版本太新把老写法卡住了。

3.1 版本选型:JDK 8、Tomcat 8.5、MySQL 5.7 的兼容性理由

常见的课设源码都是基于 JDK 1.8 写的,建议环境照下面这套配,全程不折腾:

组件推荐版本为什么不推荐更高级的版本
JDK1.8JDK 17+ 编译老代码偶尔会出现过时 API 报错,课设阶段没必要给编译器找麻烦
Tomcat8.5 或 9.0Tomcat 10 换了 Jakarta EE 包名,部分旧 Servlet 代码直接编译不过
MySQL5.7MySQL 8.0+ 需要换新版驱动和时区参数,多一层配置就多一个报错点
mysql-connector-java5.1.x对应 MySQL 5.7,驱动类名是 com.mysql.jdbc.Driver

如果你本机已经装了 MySQL 8.0,也不用重装,第 3.3 节会单独讲怎么改配置。Tomcat 建议用免安装版,解压后配置一个 CATALINA_HOME 环境变量就行。JDK 和 Tomcat 位数要一致,32 位 JDK 配 64 位 Tomcat 会直接起不来,这是最容易被忽略的环境问题。

3.2 把 StudentManagerWeb 导入 IDE:两条路线和一条保底方案

MyEclipse 导入这套工程是最顺的,因为 .mymetadata 就是它的原生格式。步骤是:File > Import > General > Existing Projects into Workspace,然后 Select root directory 选中 StudentManagerWeb 文件夹,确认工程名前有勾选,Finish。导入后在 Servers 视图里右键 Tomcat 8.5,选择 Add and Remove Projects,把 StudentManagerWeb 加进去,启动 Tomcat。

如果用的是 IDEA 2020 以后的版本,File > Open 直接选中 StudentManagerWeb 目录,IDEA 会识别 .classpath 并以 Eclipse 项目方式打开。打开后要手动配一下 Artifacts:Project Structure > Artifacts > Add > Web Application: Exploded,然后检查 WEB-INF/lib 下有没有数据库驱动。有些版本的 IDEA 不会自动把 lib 下的 jar 带进打包,这一步漏了就会在上线后遇到 ClassNotFoundException。

保底方案最省心:不管你用什么 IDE,新建一个空白的 Dynamic Web Project / Maven Web 项目,然后把原工程 src 下的 .java 文件复制到新工程的 src,把 WebRoot 下的整个内容复制到新工程的 WebRoot(IDEA 对应 webapp),再把维护 WEB-INF/lib 里的 jar。这个方法绕开了所有老工程格式兼容问题,适合在 IDE 反复识别失败时救急。

# 数据库脚本先导入,避免 Deploy 之后第一次访问才报连接失败 mysql -u root -p Enter password: ****** mysql> source /path/to/student.sql; mysql> source /path/to/t_manager.sql; mysql> show tables;

导入脚本这一步放在启动前做有个好处:能把数据库类报错和编译类报错分开排查。如果 MySQL 里查不到表,后面即使工程部署成功,登录页面也会在点击登录后报 SQL 语法错误。

3.3 数据库连接配置:DBUtil 里的 URL、用户名和密码怎么改

这套课设的连接代码一般集中在 util 包下的 DBUtil.java,核心就是一段 DriverManager 连接逻辑:

package com.example.util; import java.sql.*; public class DBUtil { // 连接串里的数据库名要和 student.sql 里建库的名字一致 private static final String URL = "jdbc:mysql://localhost:3306/studentdb?useUnicode=true&characterEncoding=utf8"; private static final String USER = "root"; private static final String PASSWORD = "123456"; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(ResultSet rs, Statement stmt, Connection conn) { // 关闭顺序固定:rs -> stmt -> conn,反了会先断开连接导致结果集读不出来 if (rs != null) { try { rs.close(); } catch (SQLException ignored) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException ignored) {} } if (conn != null) { try { conn.close(); } catch (SQLException ignored) {} } } }

连接串里最常改的三个参数:第一个是 3306 端口,如果你 MySQL 装完改过端口,这里必须同步;第二个是 studentdb 这个库名,你得看 student.sql 里面 CREATE DATABASE 用的是哪个名字,不叫 studentdb 就改成实际的;第三个是 PASSWORD,改成你本地 MySQL 的 root 密码。注意 PASSWORD 只能配当前 MySQL 实际密码,不是你想设的密码,连接失败时先怀疑这一行。

如果你用的是 MySQL 8.0+,上面的配置要对应调整:驱动类改成 com.mysql.cj.jdbc.Driver,URL 末尾加 serverTimezone=Asia/Shanghai 和 allowPublicKeyRetrieval=true,否则会报 Communications link failure 或 Public Key Retrieval is not allowed。不建议为了跑课设在 MySQL 5.7 和 8.0 之间反复横跳,选定一种环境后把 DBUtil 和驱动 jar 配好即可。

提示:mysql-connector-java 那个 jar 一定要放在 WebRoot/WEB-INF/lib 目录下,不是放 src。放错位置时编译能通过,但 Tomcat 运行期找不到类,报错会比编译期晚很多。

4. 核心功能实现:登录鉴权、学生信息增删改查的代码链路

说明文档 docx 里把功能实现拆成了九个点:登录、系统主界面、添加学生、学生信息维护、按学号查找、更新、删除、改密码、退出。这一章挑其中最关键的三段代码链路讲透,其余功能都是在这三段基础上的变体。

4.1 登录与 Session:管理员权限是怎么控住的

登录功能在 LoginServlet 里做。先取请求参数,再调用 ManagerDao 查 t_manager 表,查到就把管理员对象放进 Session,查不到则回到登录页并给出错误提示。简化后的代码模式:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); ManagerDao dao = new ManagerDao(); Manager m = dao.findByUsernameAndPassword(username, password); if (m != null) { request.getSession().setAttribute("loginUser", m); response.sendRedirect("main.jsp"); } else { request.setAttribute("error", "用户名或密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); } }

这里的两个细节答辩常问。第一个:登录成功用 sendRedirect 做重定向,而不是 forward。sendRedirect 会让浏览器重新发一次请求,地址栏变成 main.jsp,用户刷新页面时不会重复提交表单;如果用 forward,地址栏还停在 login.jsp,按 F5 会再次执行一次登录逻辑。第二个:Session 的 key 统一叫 loginUser,JSP 页面对这个 key 的判断要保持一致,一个页面用 loginUser,另一个页面用 loginUserInfo,就会导致明明登录了还被踢回登录页。

有保护需求的主界面 JSP 顶部通常会有一段 Session 判断,逻辑是这样的:

<%@ page import="com.example.entity.Manager" %> <% Manager loginUser = (Manager) session.getAttribute("loginUser"); if (loginUser == null) { response.sendRedirect("login.jsp"); return; } %>

把这段放在 main.jsp、学生管理页面顶部,没有登录就直接重定向回登录页,属于最粗暴但有效的页面保护方式。如果系统里页面多,更正规的做法是写一个 Filter 统一拦,但课设阶段用顶部判断完全够,答辩问起来也能说出原理。

4.2 学生信息维护:添加、按学号查找、更新、删除的 SQL 与参数处理

学生模块的核心在 StudentDao,四个功能对应四条 SQL:添加走 INSERT,查找走 SELECT WHERE student_id,更新走 UPDATE,删除走 DELETE。代码骨架:

public boolean addStudent(Student s) throws SQLException { String sql = "INSERT INTO student(student_id, name, gender, age, " + "college, major, class_name) VALUES(?,?,?,?,?,?,?)"; try (Connection conn = DBUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, s.getStudentId()); ps.setString(2, s.getName()); ps.setString(3, s.getGender()); ps.setInt(4, s.getAge()); ps.setString(5, s.getCollege()); ps.setString(6, s.getMajor()); ps.setString(7, s.getClassName()); return ps.executeUpdate() == 1; } } public Student findByStudentId(String studentId) throws SQLException { String sql = "SELECT * FROM student WHERE student_id = ?"; // 用 PreparedStatement 传参,避免字符串拼接出现 SQL 注入 } public boolean updateStudent(Student s) throws SQLException { String sql = "UPDATE student SET name=?, gender=?, age=?, " + "college=?, major=?, class_name=? WHERE student_id=?"; } public boolean deleteStudent(String studentId) throws SQLException { String sql = "DELETE FROM student WHERE student_id=?"; }

注意一个参数类型的细节:学号 student_id 是 VARCHAR 类型,所以 setString;年龄 age 是 INT 类型,必须 setInt。如果表单里 age 字段空着没填,传到 setInt 时就会触发 NumberFormatException 或 SQLException。常见做法是在 Servlet 里先判断字符串是否为空,再转 int,空值给 0 或者给一个默认年龄。

按学号查找这里默认是精确匹配,也就是 WHERE student_id = ?。如果要支持模糊查询,把 SQL 改成 WHERE student_id LIKE ?,参数传入 "%" + keyword + "%"。课设里这两者都可以,但答辩时最好能说清楚区别:精确匹配走主键索引,速度快;LIKE 查询在数据量大的时候可能全表扫描,性能玄学,学生管理系统这个数据规模基本没差别。

删除操作的细节要点是确认参数是 String 类型,前端表单传的学号可能带首尾空格,查不到时先 trim 再传给 DAO。我见过一个案例,Excel 导入的学号带了一个不可见空格,导致删除接口一直报“不存在”,折腾好久才定位到是参数空格的问题。

4.3 退出系统与修改密码:容易被忽略但总被答辩问到的两个点

退出逻辑很简短,但有两个容易错的地方:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if (session != null) { session.invalidate(); } response.sendRedirect("login.jsp"); }

注意用的是 getSession(false),意思是“有会话就返回,没有就返回 null”,不要用 getSession(true) 或 getSession(),否则退出接口被直接访问时反而会创建一个新会话,退出就失去了意义。退出完一定要 redirect 到 login.jsp,让浏览器和服务器都清掉当前上下文,按后退按钮时也不要重新生成页面。如果没有做重定向而是直接 forward,浏览器地址栏还会显示旧页面,按刷新就会遇到登录态残留的问题。

修改密码的逻辑核心是把原密码和新密码放在同一段逻辑里校验,典型代码:

String oldPwd = request.getParameter("oldPassword"); String newPwd = request.getParameter("newPassword"); Manager loginUser = (Manager) session.getAttribute("loginUser"); if (!loginUser.getPassword().equals(oldPwd)) { request.setAttribute("msg", "原密码不正确"); } else { boolean ok = new ManagerDao().updatePassword(loginUser.getUsername(), newPwd); if (ok) { request.setAttribute("msg", "密码修改成功,请重新登录"); session.invalidate(); } }

这里有个演示项目常见的隐患:t_manager 表里的密码是明文存储。课程设计可以接受,但如果答辩老师提出“为什么密码不加密”,你要能接上话。最简单的应对是把明文密码改成 MD5 加盐后再入库,改 Dao 里的 UPDATE 语句,在 setPassword 时调用工具类哈希一次,顺便把登录时的校验也改成同样的哈希逻辑。这样改的代码量很小,答辩会好看很多。

5. 避坑合集:导入、运行和连库最常翻车的五个问题

这一章把实际下载这套资源后最容易遇到的五个问题按“现象 → 原因 → 解决”拆开,全部是真实操作中会翻车的点。血泪经验,建议逐条对照排查。

5.1 部署后访问 404:context root 与访问路径不一致

现象:Tomcat 正常启动,输入http://localhost:8080/StudentManagerWeb/login.jsp却返回 404,而 Tomcat 首页能打开。

原因:部署名和 .mymetadata 里的 context-root 对不上。手动复制 WebRoot 到 webapps 目录时,目录名是你起的名字;IDE Deploy 时可能用了 .mymetadata 里另一个名字。还有一种是项目根本没有发布到 Tomcat,只用了 Run As > Java Application 启动了一个普通 Java 进程,Servlet 容器没跟着起来。

解决:先看 Tomcat 的 webapps 目录下有没有你的工程文件夹,再看文件夹名和你访问的路径是否一致。用 IDE 部署时,右键项目确认 Deploy 的目标是 Tomcat,启动 Server 后在 Server 视图里检查 Modules 列表。改完 .mymetadata 里的 context-root 之后记得重新发布,Tomcat 有时候不会自动拾取项目元数据的变更。

5.2 添加学生中文乱码:三处字符集必须一致

现象:登录页面和主界面中文都正常,但添加学生后,数据库里存的姓名是乱码或问号,页面显示也是乱码。

原因:字符集在三个位置各自独立配置,漏掉任何一个都会出问题——数据库表默认字符集、JDBC URL 里的 characterEncoding、JSP 页面本身的 pageEncoding。最常见的情况是数据库表是 latin1,或者 JDBC URL 没带字符编码参数。

解决:建表语句统一用 utf8mb4,例如CREATE TABLE student ... DEFAULT CHARSET=utf8mb4。DBUtil 的 URL 里加?useUnicode=true&characterEncoding=utf8。JSP 页面最顶上加:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

然后在所有 Servlet 的 doPost 开头加一句request.setCharacterEncoding("UTF-8"),三处对齐后中文就不会再乱。这三个地方缺一不可,改完记得重启 Tomcat 和重连 MySQL,不要只刷新浏览器。

5.3 MySQL 8.0 连接失败:驱动类名和时区参数不对

现象:Tomcat 日志报Communications link failure或Public Key Retrieval is not allowed,直接连接数据库时提示Unable to connect。

原因:项目里自带的驱动 jar 是 mysql-connector-java 5.x,驱动类名是 com.mysql.jdbc.Driver,而 MySQL 8.0 的默认认证插件是 caching_sha2_password,老驱动不认识。时区参数缺失也会让 JDBC 在建立连接时尝试读取服务器时区失败。

解决:去下载 mysql-connector-java 8.0.x 的 jar,替换 WEB-INF/lib 下的旧驱动。DBUtil 里改两个地方:

private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/studentdb?useUnicode=true" + "&characterEncoding=utf8&serverTimezone=Asia/Shanghai" + "&allowPublicKeyRetrieval=true";

改完驱动类名后,原有的 Class.forName 字符串也要跟着换,不要只换 jar 文件。线段里 serverTimezone 的值最好写 Asia/Shanghai 而不是 GMT+8,有些版本不识别简称会报错。

5.4 运行期 ClassNotFoundException: com.mysql.jdbc.Driver

现象:项目能部署,Tomcat 启动时不报事,但第一次访问登录接口或学生列表时,后台抛出java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。

原因:数据库驱动 jar 放的位置不对。放在 src 下或者普通 Java 构建路径里,编译期能找到,但运行期 Tomcat 的 Web 应用类加载器不加载这些路径;必须把 jar 放到 WebRoot/WEB-INF/lib 下才会被自动扫描。

解决:确认 WEB-INF/lib 目录下存在 mysql-connector-java-x.x.x.jar。IDEA 用户要检查 Project Structure > Artifacts 里的 Output Layout,看 lib 下 jar 是否被打进了构建产物。改完重新构建并重新部署,不要只 Build 不 Redeploy。

5.5 Tomcat 启动端口被占用:8080 被残留进程占住

现象:启动 Tomcat 时控制台报Port 8080 required by Tomcat v8.5 Server at localhost is already in use,服务起不来或卡在初始化。

原因:上一次运行的 Tomcat 进程没有正常关闭,javaw.exe 残留占住了 8080。有时候不是 Tomcat 本身,而是别的 Java Web 服务器或数据库工具占用了端口。

解决:命令行定位占用进程并结束。

# Windows netstat -ano | findstr :8080 taskkill /PID <进程号> /F # macOS / Linux lsof -i:8080 kill -9 <进程号>

如果觉得杀进程太粗暴,也可以把 Tomcat 端口改为 8081,打开 conf/server.xml,找到<Connector port="8080"改掉。改端口后记得所有访问链接、书签、后续代码里的路径都要跟着改,尤其是如果说明文档里写死了 8080 的例子,按文档生改容易对准不齐。

6. 验证课设能不能交差:全功能验收清单与三个可以讲的改进点

6.1 一张验收清单把九个功能跑一遍

下载这套资源后,建议按下面这张表从头到尾走一遍:

操作预期结果容易出错点
输入错误账号密码登录提示用户名或密码错误,不跳转提示信息为空或直接跳转
输入正确账号密码登录跳转到主界面Session 未写入导致循环回登录页
添加学生并保存列表刷新后能看到新记录添加成功后列表不刷新
按学号查找存在的学生返回对应的一条记录学号前后带空格,精确匹配失败
按学号查找不存在的学生提示无记录或返回空列表空列表页报 NullPointerException
更新学生信息再查学号时显示新值UPDATE 的 WHERE 条件少了 student_id
删除学生列表中记录消失删除后列表页未刷新
修改管理员密码退出后用新密码能登录旧密码校验没做
退出系统回到 login.jsp,直接访问 main.jsp 被弹回没有 invalidate,Session 残留

这张表走完,答辩基本不会被意外卡住。边操作边给说明文档 docx 里的功能截图配套拍照,交作业的文档也对得上。

6.2 三个低成本改进点,改完答辩能加印象分

第一个是把 t_manager 的密码改成 MD5 加盐存储。说句实在话,明文密码在课设里不会挂,但答辩十次里有三次会被老师问,与其现场支支吾吾,不如直接加一个密码工具类,改动量不超过二十行。

第二个是把 JSP 里的 Java 脚本片段替换成 JSTL 和 EL。现在的 JSP 页面里如果有大段<% ... %>,老师看一眼就知道是老写法。加一行<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>,把 for 循环改成<c:forEach>,页面就清爽了。

第三个是给 DAO 的写操作包一个事务。现在大部分课设的增删改都是单条 SQL,不用事务也看不出问题,但如果你把“添加学生”和“写入日志表”放在同一个方法里,第二条失败会让第一条成功,数据就对不齐了。改成在 Service 层conn.setAutoCommit(false),全部成功再 commit,失败就 rollback。代码量不大,但能让整个项目从“学生管理系统”变成“像个管理系统”。

我自己的习惯是验收之后,再换一台干净环境的机器按同一个顺序重新走一遍,原因是课设代码的环境相关性太强,依赖你本机的 MySQL、Tomcat 配置,换台机器就翻车的情况太常见了。从那以后我每次交课设之前都强制走一遍全功能验收表,而不是启动一次截个图就完事,希望帮到你。

本文还有配套的精品资源,点击获取

返回列表