尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

JSP+Servlet学生管理系统课设拆解:环境配置、核心代码与答辩改法

JSP+Servlet学生管理系统课设拆解:环境配置、核心代码与答辩改法 简介一份基于Java Web的学生信息管理系统使用JSP与Servlet搭配MySQL数据库并借助layui及jQuery构建前端交互。系统面向高校课程设计与初学者实战学生可自行注册登记教师登录后可对学生信息进行增删改查与分类管理覆盖了会话保持、参数传递、数据校验、数据库读写等典型Web开发环节能够帮助理解前后端数据交互与分层设计思想。资源包共2个文件包含可运行的工程压缩包和网页格式的说明文档总体积约2.13MB工程内已集成运行所需的全部依赖库数据库脚本经网盘另行提供按文档指引即可完成部署。目前已有6433人学习下载。项目代码采用分层写法将页面展示、业务处理与数据访问分离命名与注释较为规范可直接用作课程设计参考也适合在其上扩展权限管理、分页查询和统计图表等高级功能。1. 这款 JSPServlet 学生管理系统课程设计的“标准答案”还是“弃坑陷阱”先说结论如果你正卡在 Java Web 课程设计上这个基于 JSPServletMySQL 的学生信息管理系统大概率是你见过的代码里最“规矩”的一套。它不是 Spring Boot 那种全家桶而是回归 Servlet 本身——正因为如此它才适合拿来交作业、应付答辩也适合新手看清一次 HTTP 请求从浏览器到数据库的完整链路。网上关于这个项目的源码包五花八门但能跑通、能讲清楚、能改得动的其实不多。这套系统解决的问题非常具体学生信息的增删改查、按学号或姓名检索、以及一个简单的登录鉴权。适合谁两类人——一类是 Java Web 课设还没着落的学生另一类是刚学完 JSP/Servlet 想找一个“轻量但五脏俱全”的参考项目的自学者。如果你已经在用 Spring Boot 写 CRUD那这份资源对你来说就太基础了看目录结构就够了。这份课设资源的价值不在于代码量而在于它的结构非常典型——严格分了 entity、dao、service、servlet、jsp 五层这是很多培训机构和院校的标准分层方式。你能从里面学到的不只是“怎么跑起来”还有“为什么这么写”。下面我按自己拆过的实际项目带你把这份资源的每一块掰开看一遍。2. 环境准备与工程结构先把这套课设跑在 Tomcat 上2.1 环境版本怎么选JDK 8 Tomcat 8.5 是最稳的组合接手任何 Java Web 课设包第一件事不是读代码而是先把环境对齐。否则你会在第一步就翻车。这份资源基于 JSPServlet 2.5 的写法理论上 Servlet 3.0 以后的容器都能跑但我强烈建议你装 JDK 8不要用 JDK 11后面会解释原因搭配 Tomcat 8.5。为什么这么选JSP 本身就是老技术JDK 9 之后 JSP 编译依赖的 JSTL 和 javax.servlet 包经常要额外引而课设包一般不会帮你配 Maven 依赖。JDK 8 是这套技术栈的“舒适区”Tomcat 8.5 自带 JSP 编译器不需要额外配置。如果强行用 Tomcat 10你会发现 javax.servlet 全部变成了 jakarta.servlet——整个项目的 import 全挂。常见的做法是用 Eclipse 的 Enterprise Java 版本或者 IDEA 的社区版都行。关键是确认你的项目能识别 web.xml。IDEA 用户注意导入的时候选“Import Project”不要直接打开根目录否则 out 目录会被当成源码目录编译直接报错。我一般会先在本地跑通再讲别的。先用命令验证环境是否可用java -version # 期望输出java version 1.8.0_xxx # 千万别出现 openjdk version 17 之类后面 JSP 编译会出幺蛾子 $CATALINA_HOME/bin/version.sh # 期望输出Server version: Apache Tomcat/8.5.xx这里解释一下参数选择JDK 8 是因为 JSP 2.3 规范在 JDK 8 上编译最稳定Tomcat 8.5 对 javax.servlet 包的支持最完整。如果你手头只有 JDK 11也不是不能跑但要额外下载 javax.servlet-api-3.1.0.jar 扔到 WEB-INF/lib 下否则 HttpServlet 这个类直接找不到。2.2 项目目录结构先看清包名再下手拆任何课设包第一步先把目录结构打印出来看。这份资源的结构通常长这样StudentManager/ ├── src/ │ └── com/ │ └── student/ │ ├── dao/ # 数据访问层JDBC 写在这里 │ │ ├── StudentDao.java │ │ └── UserDao.java │ ├── entity/ # 实体类对应数据库表 │ │ ├── Student.java │ │ └── User.java │ ├── service/ # 业务层事务和逻辑判断在这里 │ │ ├── StudentService.java │ │ └── UserService.java │ └── servlet/ # Controller 层 │ ├── LoginServlet.java │ ├── StudentAddServlet.java │ ├── StudentDeleteServlet.java │ ├── StudentUpdateServlet.java │ └── StudentListServlet.java ├── WebContent/ │ ├── WEB-INF/ │ │ ├── web.xml # Servlet 映射和欢迎页配置 │ │ └── lib/ │ └── jsp/ │ ├── login.jsp │ ├── list.jsp │ ├── add.jsp │ └── update.jsp └── sql/ └── student_manager.sql # 数据库初始化脚本这套结构是标准的“分层模式”。dao 只干一件事——操作数据库service 管业务逻辑和事务servlet 接收请求、调用 service、跳转 JSPJSP 只负责展示。为什么要分这么多层课程设计答辩时老师最爱问的一句话就是“为什么不用一个 Servlet 全干完”——你答“职责单一、便于维护、事务控制在 service 层完成”这 20 章就稳了。2.3 部署到 Tomcat 的完整步骤在 IDEA 或 Eclipse 里配置好 Tomcat 后按这个顺序部署# 1. 编译整个项目确认没有编译错误 # IDEA 菜单 Build - Build Project # 2. 把项目 artifact 部署到 Tomcat # 打开 Run/Debug Configurations - Tomcat Server # Deployment 选项卡 - 点 号 - Artifact - StudentManager:war exploded # 3. 启动 Tomcat观察日志输出 # 看到 Deployment of web application archive ... has finished 才算部署成功 # 4. 浏览器访问 # 访问 http://localhost:8080/StudentManager/login.jsp参数说明这里的 context 路径默认是/StudentManager如果 404 了检查 IDEA 的 Application context 配置改成/就直接访问http://localhost:8080/login.jsp。我习惯把 Application context 设为/这样访问路径短调试方便但注意 web.xml 里的 welcome-file 配置不能丢。有一个坑必须提前告诉你如果你把项目导出成 war 包扔到 Tomcat 的 webapps 下把原来的 IDEA 部署方式停掉不然端口占用直接报错。很多新手死在这里Tomcat 启动日志提示Port 8080 is already in use其实就是 IDEA 的 Tomcat 实例没关干净。Windows 下netstat -ano | findstr :8080能查到是谁占的端口把它结束掉就行。3. 核心代码解读登录、分页、增删改查的写法与改法3.1 登录模块从 HttpServlet 到 session 的一套完整链路这个系统的登录部分是学习价值最高的代码之一因为它囊括了 Servlet 的完整生命周期。我先把核心代码拉出来看// LoginServlet.java 核心逻辑已省略 import WebServlet(/login) public class LoginServlet extends HttpServlet { private UserService userService new UserService(); Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置请求编码不然中文乱码 request.setCharacterEncoding(UTF-8); String username request.getParameter(username); String password request.getParameter(password); // 业务层校验 User user userService.login(username, password); if (user ! null) { // 登录成功把用户信息放进 session HttpSession session request.getSession(); session.setAttribute(currentUser, user); // 重定向到列表页避免刷新重复提交表单 response.sendRedirect(request.getContextPath() /student/list); } else { // 登录失败回登录页并携带错误消息 request.setAttribute(errorMsg, 用户名或密码错误); request.getRequestDispatcher(/jsp/login.jsp).forward(request, response); } } }这段代码里有两个关键点是答辩老师必问的。第一为什么用sendRedirect而不是forward因为forward是服务器内部跳转浏览器地址栏不变用户刷新时会重复提交表单redirect是告诉浏览器重新发起一次 GET 请求刷新不会重复提交。第二request.getSession()会自动创建 sessionsession.setAttribute把登录状态存在服务器内存里——这就是 HTTP 无状态协议下“记住你是谁”的机制。3.2 列表展示与分页LIMIT 参数和页面导航的对应关系学生列表页是系统里最复杂的 JSP分页逻辑就藏在这里。先看 Servlet 侧的代码// StudentListServlet.java 分页核心 WebServlet(/student/list) public class StudentListServlet extends HttpServlet { private StudentService studentService new StudentService(); Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int page 1; // 默认第 1 页 int pageSize 10; // 每页 10 条 // 从请求参数取页码非数字就归为 1 String pageStr request.getParameter(page); if (pageStr ! null !.equals(pageStr.trim())) { try { page Integer.parseInt(pageStr); } catch (NumberFormatException e) { page 1; } } // 调用 service 层获取分页对象 PageResultStudent pageResult studentService.findStudentsByPage(page, pageSize); // 把分页数据塞进 request 域forward 给 JSP request.setAttribute(pageResult, pageResult); request.getRequestDispatcher(/jsp/list.jsp).forward(request, response); } }关键的 SQL 在 DAO 层-- StudentDao.java 里对应的 SQL结合 JDBC 参数占位符 SELECT * FROM t_student ORDER BY student_id LIMIT ?, ?; -- 第一个 ? 是偏移量 (page-1)*pageSize -- 第二个 ? 是每页条数 pageSize结合/WebContent/jsp/list.jsp里的分页导航代码%-- 分页导航条 --% nav a href${pageContext.request.contextPath}/student/list?page1首页/a c:if test${pageResult.currentPage 1} a href${pageContext.request.contextPath}/student/list?page${pageResult.currentPage - 1}上一页/a /c:if span第 ${pageResult.currentPage} / ${pageResult.totalPages} 页/span c:if test${pageResult.currentPage pageResult.totalPages} a href${pageContext.request.contextPath}/student/list?page${pageResult.currentPage 1}下一页/a /c:if a href${pageContext.request.contextPath}/student/list?page${pageResult.totalPages}末页/a /nav这里$是 EL 表达式需要 JSTL 库支持。我提醒一句很多课设包里漏掉了 jstl-1.2.jar 和 standard.jar如果 JSP 里用了c:if却报The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved直接去 WEB-INF/lib 下看有没有这两个 jar。没有就补上这是运行这个包最常见的“缺少依赖”问题之一。分页的边界情况你要留意当数据库没有数据时totalPages可能为 0此时 JSP 里pageResult.totalPages 1的判断会兜底。如果代码里没做这个处理导航条会出现“第 1 / 0 页”这种尴尬情况——这也常是答辩老师故意挑刺的点没处理的建议自己补上。3.3 新增与编辑表单请求参数到 DAO 插入的参数映射新增和编辑的业务流程基本一致区别就在于一个走INSERT一个走UPDATE。看新增的代码// StudentAddServlet.java WebServlet(/student/add) public class StudentAddServlet extends HttpServlet { private StudentService studentService new StudentService(); Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String studentId request.getParameter(studentId); String studentName request.getParameter(studentName); String gender request.getParameter(gender); String major request.getParameter(major); // 前端 form 表单的 name 属性要和这里对应 Student student new Student(); student.setStudentId(studentId); student.setStudentName(studentName); student.setGender(gender); student.setMajor(major); boolean success studentService.addStudent(student); if (success) { // 新增成功后重定向回列表页能看到新数据 response.sendRedirect(request.getContextPath() /student/list); } else { // 失败则回新增页给出提示 request.setAttribute(errorMsg, 添加失败请检查学生学号是否重复); request.getRequestDispatcher(/jsp/add.jsp).forward(request, response); } } }这段代码对应的 DAO 层常用PreparedStatement// StudentDao.java 新增方法内部逻辑 String sql INSERT INTO t_student(student_id, student_name, gender, major) VALUES(?, ?, ?, ?); try (PreparedStatement pstmt connection.prepareStatement(sql)) { pstmt.setString(1, student.getStudentId()); pstmt.setString(2, student.getStudentName()); pstmt.setString(3, student.getGender()); pstmt.setString(4, student.getMajor()); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); // 这里用日志框架更好但是课设这样写没毛病 return false; }这里有个值得注意的技术点为什么用PreparedStatement而不是Statement 字符串拼接两个原因——第一防 SQL 注入字符串拼接会被传入 OR 11 --这类参数直接给到数据库执行第二类型自动转换setString等于告诉数据库“这里传的是字符串”SQL 语句语义清晰。实际上这是 Servlet 课设里少数能体现工程意识的地方写进答辩说明里能加分。编辑操作和新增唯一的差别是 SQL 变成UPDATE t_student SET student_name ?, gender ?, major ? WHERE student_id ?但注意一个坑如果编辑页面把学号studentId也做成可编辑的就会出大问题——更新时WHERE student_id和SET student_id都改了会导致数据错乱。正确的做法是编辑页把学号做成readonly或disabled只允许修改姓名、性别、专业。这是很多课设包的共性缺陷你拿到手之后最好自己修复一下不仅代码更健壮答辩时也有亮点可讲。4. 数据库设计与初始化学号主键、外键约束和字符集选择4.1 表结构和技术选型为什么不用自增主键这份资源对应的数据库脚本一般长这样CREATE DATABASE IF NOT EXISTS student_manager DEFAULT CHARSET utf8 COLLATE utf8_general_ci; USE student_manager; CREATE TABLE t_user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8; CREATE TABLE t_student ( student_id VARCHAR(20) PRIMARY KEY, -- 学号作为主键而不是自增 id student_name VARCHAR(50) NOT NULL, gender CHAR(2) DEFAULT 男, major VARCHAR(100), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8; INSERT INTO t_user (username, password) VALUES (admin, 123456);为什么t_student的主键是student_id而不是AUTO_INCREMENT这涉及到“业务主键和逻辑主键的选择”——学号在业务里天然唯一用它当主键避免了一个学生对应多条记录的问题但代价是如果你输错了一个字符改起来很麻烦且学号如果变动所有关联外键都要更新。如果你的系统还需要做选课、成绩表那t_student这个设计就牵扯出外键问题——子表的student_id必须和主表完全一致否则FOREIGN KEY约束直接报错。4.2 字符集设置UTF-8 不是写了就行数据库层面的坑主要集中在字符集。很多同学数据库初始化脚本用DEFAULT CHARSET utf8但插入中文后还是变成???原因有三层# 建库时指定字符集脚本里通常有但你自己敲命令时容易漏 CREATE DATABASE student_manager DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # JDBC 连接串也要显式声明 # 在 DBUtil.java 或 JDBC 配置文件里 jdbc:mysql://localhost:3306/student_manager?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai参数说明characterEncodingutf8告诉 MySQL 驱动“JDBC 连接使用 UTF-8 编码”serverTimezoneAsia/Shanghai是 MySQL 8 必须加的否则报时区错误。MySQL 5.7 不需要serverTimezone但 MySQL 8 不加直接抛The server time zone value йʱ is unrecognized——这个报错估计很多人都见过。JSP 页面顶部的编码声明也不能漏% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%这是三层编码请求编码、连接编码、页面编码任何一层不统一中文必乱码。经验是JSP 页面pageEncoding和contentType保持一致动态查询请求的处理 Servlet 里request.setCharacterEncoding(UTF-8)放在最上面——放在request.getParameter()之后再设就失效了这也是最容易被忽略的“编码时序坑”。4.3 初始化数据登录账号和测试数据数据库脚本里通常会预置一条管理员记录admin/123456。但注意这个密码在数据库里是明文存储的——课设可以这么干但你心里要有数这是教学项目而非生产项目。如果老师问了“密码为什么不加密”你可以说“生产系统会用 MD5/SHA-256 加盐”然后补一句“当前课设侧重点在流程”。这是一个能展示你思考深度的答辩话术。另外测试数据建议多造几条至少 20 条以上不然分页效果看不出“翻页”的感觉。有一种做法是用存储过程批量生成但对于课设来说没必要直接在脚本里把 INSERT 语句批量复制即可。5. 运行避坑指南三个高频报错和它们的根治方式5.1 现象HTTP Status 404 —— 访问 login.jsp 就 404原因几乎可以锁定项目没被 Tomcat 识别为 Web 应用。常见情形是 IDEA/Eclipse 部署时项目结构不对WebContent目录没有被标记为 Web 资源目录。查证方式打开 Tomcat 的部署目录conf/Catalina/localhost看看有没有对应的 context 配置文件。如果没有说明 IDE 根本没有把这个项目发布出去。解决手动重新配置 Artifact。IDEA 里打开File - Project Structure - Artifacts点加号选 Web Application: Exploded然后指定WebContent为 Web 资源目录输出目录选WEB-INF/classes。配置完重新部署等 Tomcat 日志打印“has finished”再访问。我一般会在这时候顺手把WEB-INF目录里的web.xml打开确认一次——有些课设包漏了welcome-file导致访问根路径不跳登录页手动在浏览器敲/login.jsp才能进去。给个提示welcome-file默认找不到是很正常的最好补成welcome-filejsp/login.jsp/welcome-file或干脆用 Servlet 跳转。5.2 现象部署成功但登录时报java.lang.ClassNotFoundException: com.mysql.jdbc.Driver原因MySQL 驱动 jar 没有放到WEB-INF/lib下。很多课设包默认不带上 mysql-connector-java因为你本机 Maven 仓库或 IDE 全局库里可能有但 Tomcat 运行时不认同学。解决# 找到你的 mysql 驱动 jar扔到项目 WEB-INF/lib 下 # 常见位置 # MySQL 5.7 用 mysql-connector-java-5.1.48.jar # MySQL 8.x 用 mysql-connector-java-8.0.30.jar cp ~/mysql-connector-java-8.0.30.jar \ StudentManager/WebContent/WEB-INF/lib/注意一个细节MySQL 8.x 的驱动类名是com.mysql.cj.jdbc.Driver不是老版本的com.mysql.jdbc.Driver。如果课设包里 DBUtil 写的是老驱动名但你用的是 MySQL 8 驱动直接报ClassNotFoundException这时候改驱动类名即可。反过来的场景也一样——代码里用了新驱动名但 jar 是老版本同样报错。你拿到资源后第一件事建议打开 DBUtil.java 看驱动类名再对照你本机 MySQL 驱动版本省得后面排查半天。5.3 现象插入中文数据时正常但列表页显示乱码原因数据库表字符集和 JDBC 连接字符集不一致。常见的是表建成了latin1或者 JDBC URL 忘了加characterEncodingutf8。解决分两步。第一步统一建库脚本ALTER TABLE t_student CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;第二步改连接串# DBUtil.java 里的连接地址补上参数 jdbc:mysql://localhost:3306/student_manager?useUnicodetruecharacterEncodingutf8顺带说一个血泪经验MySQL 5.5 之前的版本对 utf8 支持不完整某些生僻字会存不进去所以现在建库我更推荐utf8mb4它是 mysql 的完整 UTF-8 字符集一个字符最多 4 字节emoji 也能存。但注意utf8mb4 只在 MySQL 5.5.3 以上版本才支持老环境强行用会报未知字符集错误。这一套排查给到的核心思路是中文字符乱码首先查三层编码——页面、连接、数据库多数课设改完连接串和 JSP 头问题就消失。6. 答辩前的高阶改法把“能跑”变成“能讲”6.1 给系统加一个简单的 MD5 存密码原始代码是明文存储密码。答辩时这必然会被问到“密码为什么不加密”与其等问不如提前改掉。在 UserDao 的插入和查询中加一个 MD5 加密工具类。// MD5Util.java 核心方法业务场景演示够用 import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Util { public static String md5(String source) { try { MessageDigest md MessageDigest.getInstance(MD5); byte[] bytes md.digest(source.getBytes(UTF-8)); StringBuilder result new StringBuilder(); for (byte b : bytes) { // 转十六进制字符串两位对齐 result.append(String.format(%02x, b)); } return result.toString(); } catch (NoSuchAlgorithmException | java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); } } }然后在登录逻辑里改一行// LoginServlet.java 改动前后对比 // 改动前 User user userService.login(username, password); // 改动后 User user userService.login(username, MD5Util.md5(password));注意只改登录还不够注册或初始化数据时也需要存 MD5 值否则密码匹配不上。一个不彻底的改法反而会惹麻烦——我疫情那年帮人调课设就翻过一次车只改了登录校验忘了改数据库里的初始密码数据导致正确密码登录不了。从那以后我每次改安全相关功能都强制走一遍“数据生成—入库—查询校验”的完整闭环。这里的亮点在于能说出来“MD5 也不是绝对安全现代系统用 bcrypt 这种慢哈希算法”就足够了不用真的换 bcrypt但提一下就能体现视野。6.2 用 Filter 做登录拦截避免未登录直接访问列表页默认的课设包不做登录拦截意味着用户直接敲 URL 就能访问学生列表页。答辩演示的时候老师完全可能试这个操作。补一层 Filter 很简单而且是很成熟的控制方案。// AuthFilter.java 会话校验过滤器 WebFilter(/*) public class AuthFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; // 放行登录相关地址 String uri request.getRequestURI(); if (uri.endsWith(login.jsp) || uri.contains(/login) || uri.endsWith(.css) || uri.endsWith(.js)) { chain.doFilter(req, resp); return; } // 检查 session 里有没有登录标记 HttpSession session request.getSession(false); if (session ! null session.getAttribute(currentUser) ! null) { chain.doFilter(req, resp); } else { // 没有登录就踢回登录页 response.sendRedirect(request.getContextPath() /jsp/login.jsp); } } }注意request.getSession(false)的参数false——意思是“不存在就返回 null不要新创建一个”。如果不传这个参数getSession()会自动创建一个新 session那未登录用户每一次访问被拦截的页面都会被创建一个空 session拦截就失效了。这是 Filter 写法里最容易翻车的一个细节。还有WebFilter(/*)匹配全部路径所以.js、.css 这些静态资源必须放行否则样式表加载不出来页面光秃秃的很难看。加了 Filter 之后登录成功后session.setAttribute(currentUser, user)这一行就成了全系统的“通关钥匙”——它不仅帮你记住了谁登录了也是 Filter 判断“这个请求该不该放行”的唯一依据。这两个改动加起来不到 50 行代码但对答辩效果的影响是几何级数的。6.3 把连接数据库的配置外置到 properties 文件课设包里的数据库连接信息一般是硬编码在DBUtil.java里的。每次换环境都要改 Java 源码重新编译。一个更聪明的做法是抽到db.properties里# db.properties 放在 src 根目录 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/student_manager?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456对应 DBUtil 的加载方式// DBUtil.java 加载配置文件 static { try (InputStream in DBUtil.class.getClassLoader() .getResourceAsStream(db.properties)) { Properties props new Properties(); props.load(in); driver props.getProperty(jdbc.driver); url props.getProperty(jdbc.url); username props.getProperty(jdbc.username); password props.getProperty(jdbc.password); Class.forName(driver); } catch (Exception e) { throw new ExceptionInInitializerError(e); } }这里的getResourceAsStream是类路径加载方式只要db.properties在src根目录下编译后进WEB-INF/classes运行就能找到。这样做的好处是改数据库密码不用动 Java 代码答辩时候老师问“你项目的配置怎么管理”你回答“配置文件与代码分离方便环境切换”又是一个加分项。这个方法看起来简单但把它讲通需要你理解类加载器classLoader的工作原理。答不上来也正常但你能说出“这是从 classpath 加载资源比 new FileInputStream 更可靠——后者依赖启动目录在 Tomcat 里容易定位失败”老师就知道你确实理解了。说句实在话做完上面这三次改造这个“简单学生信息管理系统”已经完全不是你下载时的那个课设包了——代码量没多多少但踩坑经历、改版动机、方案选择背后的理由每一招都能在答辩时展开成一整段提问。从那以后我拿到任何课设包都会先看一遍它的登录和信息管理部分的结构再决定改动顺序强制把“新增—查询—登录—拦截”走一遍整套逻辑自己心里有数以后再上模拟答辩基本就问不倒了。希望这份拆解能帮你少走那些我已经替你踩过的弯路把你手上的这份资源真正变成自己的东西。本文还有配套的精品资源点击获取
返回列表