ARTICLE DETAIL

资讯详情

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

Java Web学生管理系统实战包:JSP+Servlet+MySQL完整部署指南

Java Web学生管理系统实战包:JSP+Servlet+MySQL完整部署指南 简介这是一套基于JavaJSPMySQL开发的Web版学生信息管理系统完整工程专为高校计算机类专业学生设计适用于Java Web课程设计、期末大作业及初级项目实训帮助学习者掌握MVC分层架构、数据库交互、前后端协同开发等核心实践能力。资源包共241个文件包含109个Java业务逻辑与Servlet类、56个JSP页面含登录、学籍管理、成绩录入等模块、23个JS交互脚本、15个依赖JAR包以及SQL建库脚本、LayUI前端样式资源CSS/图标/动画和配置文件整体压缩后仅9.17MB轻量易部署。已有247人学习下载所有源码均经本地编译验证可直接运行评审得分98分配套文档详述环境搭建、功能说明与数据库设计目录结构规范模块划分清晰便于理解系统整体架构与代码组织逻辑。1. 这不是“又一个学生管理系统”它是一份能过答辩、改得动、跑得稳的 Java Web 课程设计实战包你手头正赶着期末大作业 deadline老师要求用 JavaJSPMySQL 做个 Web 系统但网上搜到的源码要么缺数据库脚本、要么 Tomcat 8.5 跑不起来、要么登录页 CSS 全炸、要么连web.xml都写错 servlet-mapping——更糟的是文档里写着“已测试通过”结果你本地一部署控制台刷满ClassNotFoundException: com.mysql.cj.jdbc.Driver连登录框都出不来。别急这份资源不是“看起来能跑”而是真正在 Windows IntelliJ IDEA Tomcat 9.0 MySQL 8.0 环境下完整编译、启动、增删查改全链路验证过的实战包。它包含可直接导入的 Eclipse/IDEA 工程结构、带注释的建库 SQL、LayUI 前端样式非 Bootstrap 套壳、清晰分层的 Servlet-MVC 架构没用 Spring纯 JSPJavaBean以及一份手写版《部署避坑 checklist》文档。适合零基础刚学完 JDBC 和 JSP 的同学快速上手也适合需要交差但不想被助教问住“为什么这里没加事务”“这个 SQL 注入怎么防”的课程设计者——它不炫技但每处代码都经得起课堂提问。2. 从零部署三步走通整个系统不靠玄学靠日志2.1 环境准备版本对齐是第一道生死线这不是“装个 JDK 就行”的项目。我反复验证过以下组合是唯一稳定运行路径其他组合大概率翻车组件推荐版本关键原因JDKJDK 1.8.0_291非 JDK 11JSP 编译器jasper在 JDK 9 中默认禁用需额外配置--add-opens新手极易卡死IDEIntelliJ IDEA 2021.3 或 Eclipse 2021-09新版 IDEA 默认禁用内置 Tomcat JSP 支持需手动勾选 “Add framework support → Web Application” 并指定webapp目录TomcatApache Tomcat 9.0.65非 10.xTomcat 10 强制使用 Jakarta EE namespacejakarta.servlet.*而本项目所有import javax.servlet.*会直接编译失败MySQLMySQL 8.0.33非 5.7驱动类名从com.mysql.jdbc.Driver升级为com.mysql.cj.jdbc.Driver且必须启用allowPublicKeyRetrievaltrueuseSSLfalse参数提示不要用 MySQL 官网最新版如 8.4.x其默认开启caching_sha2_password认证插件而本项目db.properties中的 JDBC URL 未适配会导致Access denied for user。用 8.0.33 可跳过认证插件兼容问题。2.2 数据库初始化执行 SQL 前先看三件事解压后找到sql/student_db.sql文件不是student.sql或init.sql用 Navicat 或命令行执行前请确认先创建数据库并指定编码CREATE DATABASE student_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE student_db;注意utf8mb4是必须项。若用utf8MySQL 中实际为utf8mb3中文姓名字段如“范冰”插入时会截断或报错Incorrect string value。检查 SQL 文件头部是否有SET NAMES utf8mb4;打开student_db.sql首行应为SET NAMES utf8mb4;若缺失手动添加。否则即使数据库编码正确客户端连接仍按latin1解析导致乱码。确认表引擎为 InnoDB文件中每张表CREATE TABLE末尾必须含ENGINEInnoDB DEFAULT CHARSETutf8mb4;。若为MyISAM后续事务回滚如删除学生时关联清空成绩将失效。执行成功后应有 5 张表student主表、course、score、teacher、admin。其中student表id字段为BIGINT AUTO_INCREMENT而非INT——这是为防止未来数据量超 2147483647 时主键溢出属于课程设计里少有人提但评审老师会点头的细节。2.3 项目导入与配置IDEA 中 4 个关键勾选项以 IntelliJ IDEA 为例Eclipse 步骤见文档IDEA_ECLIPSE_DEPLOY_GUIDE.mdFile → Open → 选择解压后的根目录含src、WebContent、lib文件夹右键项目 → Add Framework Support → 勾选 Web Application → 点击 OK此时 IDEA 会自动生成web.xml模板但本项目已自带完整版无需覆盖。配置 Artifacts重中之重File → Project Structure → Artifacts → → Web Application: Archive → 选择项目名在右侧Output Layout中手动拖拽WebContent下所有文件含WEB-INF、css、js到WEB-INF同级目录lib文件夹下的mysql-connector-java-8.0.33.jar必须出现在WEB-INF/lib下IDEA 默认不会自动复制需右键lib→Put into Output RootTomcat Server 配置Run → Edit Configurations → → Tomcat Server → LocalDeployment → → Artifact → 选择刚创建的 war explodedApplication context填/student非/或/web否则访问http://localhost:8080/会 404VM options添加-Dfile.encodingUTF-8解决 GET 请求中文参数乱码完成上述步骤后点击绿色三角形启动。若控制台输出INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [xxx] ms且无SEVERE错误则服务已就绪。3. 代码结构拆解为什么它比“百度下载的”更能过答辩3.1 分层逻辑Servlet JavaBean DAO 的经典 MVC 实现本项目未用 Spring但严格遵循分层思想每层职责清晰方便老师现场提问src/com/student/servlet/所有请求入口如LoginServlet.java、StudentListServlet.javadoPost()中只做三件事接收参数 → 调用 Service → 转发/重定向无任何 SQL 或 HTML 拼接杜绝注入风险如request.getParameter(id)直接传给 Service不拼WHERE ididsrc/com/student/service/业务逻辑中枢如StudentService.java包含事务控制updateStudent()方法内用Connection.setAutoCommit(false)conn.commit()/rollback()所有方法抛出自定义异常ServiceException上层 Servlet 统一捕获并跳转错误页src/com/student/dao/数据访问层如StudentDao.java使用PreparedStatement预编译非Statement参数占位符?严格对应queryAll()返回ListStudentfindById()返回单个Student对象符合 DAO 规范src/com/student/bean/纯 POJO如Student.java字段与student表完全一致id,name,gender,birth_date,class_name含标准 getter/setter toString()方便调试打印逻辑说明这种分层不是为了“看起来高级”而是让答辩时你能准确回答“登录校验在哪一层答在LoginServlet接收参数后调用AdminService.checkLogin()该方法再委托AdminDao.findByUsername()查询数据库。”——老师要的不是功能而是你理解数据流向。3.2 前端交互LayUI 而非 Bootstrap 的真实考量项目 CSS 文件列表layui.css,layer.css,style.css...看似杂乱实则分工明确layui.cssLayUI 框架核心样式按钮、表格、表单layer.css弹窗组件样式登录失败提示、删除成功 toaststyle.css自定义覆盖样式关键修复 LayUI 默认表格列宽自适应 bug.layui-table td { word-break: break-all; }重置表单输入框边框.layui-input { border: 1px solid #d2d2d2 !important; }避免 IE 兼容模式下边框消失login.css仅作用于/login.jsp独立于全局样式防止登录页布局污染后台参数说明laydate.css用于日期选择器学生生日字段iconfont.eot是字体图标文件非 SVG确保低版本 IE 也能显示 ✅ 图标。这些细节在答辩 PPT 里展示“前端适配方案”时比空谈“响应式”更有说服力。3.3 安全加固三个被忽略但评审必问的点SQL 注入防护所有 DAO 方法均使用PreparedStatement例如StudentDao.java中String sql SELECT * FROM student WHERE name LIKE ?; // ❌ 不是 WHERE name LIKE % name % PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, % name %); // ✅ 参数化绑定XSS 过滤StudentServlet.java中新增学生时String name request.getParameter(name); name StringEscapeUtils.escapeHtml4(name); // 来自 commons-text-1.10.0.jar student.setName(name);说明commons-text库已打包进lib/escapeHtml4()将script转为lt;scriptgt;防止存储型 XSS。密码明文存储不是 SHA-256 加盐哈希AdminDao.java中注册逻辑String salt UUID.randomUUID().toString().replace(-, ); // 生成随机盐 String hashedPwd DigestUtils.sha256Hex(password salt); // Apache Commons Codec // 存库INSERT INTO admin (username, password, salt) VALUES (?, ?, ?)登录时再用相同盐值重新哈希比对。这比 MD5时间戳更安全且代码行数可控适合课程设计深度。4. 避坑指南那些让你凌晨三点还在查日志的典型问题4.1 现象启动后访问http://localhost:8080/student/login.jsp显示 404但http://localhost:8080/student/能看到 Tomcat 默认页原因IDEA 中Artifacts配置未将login.jsp放入webapp目录或web.xml中welcome-file-list未指向login.jsp解决检查Project Structure → Artifacts → Output Layout确认login.jsp在WEB-INF同级即student/根目录下打开WebContent/WEB-INF/web.xml确认存在welcome-file-list welcome-filelogin.jsp/welcome-file /welcome-file-list4.2 现象登录成功后跳转index.jsp页面空白浏览器控制台报Uncaught ReferenceError: layui is not defined原因index.jsp中script srclayui/layui.js/script路径错误实际layui.js在WebContent/layui/下但 JSP 中相对路径解析失败解决将index.jsp中 script 标签改为绝对路径script src${pageContext.request.contextPath}/layui/layui.js/script说明${pageContext.request.contextPath}动态获取应用上下文如/student避免硬编码路径。4.3 现象新增学生时中文姓名存入数据库变成??但数据库和表编码确认是utf8mb4原因JDBC URL 缺少characterEncodingutf8mb4参数MySQL 驱动默认用latin1解析解决修改src/db.propertiesurljdbc:mysql://localhost:3306/student_db?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueuseSSLfalse注意useUnicodetrue和characterEncodingutf8mb4必须同时存在缺一不可。4.4 现象修改学生信息后页面显示“操作成功”但数据库未更新且无任何错误日志原因StudentService.updateStudent()中事务未提交conn.commit()被注释或遗漏解决检查StudentService.java末尾try { conn.setAutoCommit(false); // ... update logic conn.commit(); // ✅ 必须存在且不能被 try-catch 吞掉 } catch (SQLException e) { conn.rollback(); // ✅ 回滚 throw new ServiceException(更新失败, e); }4.5 现象用 Chrome 访问正常Edge 浏览器登录页 CSS 全乱输入框重叠原因style.css中使用了display: flex但未加-ms-前缀IE/Edge 旧版不兼容解决在style.css中为关键 flex 容器添加兼容声明.login-container { display: -ms-flexbox; /* IE 10 */ display: flex; -ms-flex-align: center; align-items: center; }5. 进阶技巧让课程设计从“能跑”升级为“值得讲”5.1 用 JUnit 为 DAO 层写单元测试答辩加分项很多同学只测页面但老师更想看到你懂“如何验证代码正确性”。本项目lib/中已含junit-4.13.2.jar和hamcrest-core-1.3.jar可立即编写测试// src/test/com/student/dao/StudentDaoTest.java public class StudentDaoTest { private StudentDao dao; Before public void setUp() { dao new StudentDao(); // 清空测试表插入一条测试数据 JdbcUtil.executeUpdate(DELETE FROM student); JdbcUtil.executeUpdate(INSERT INTO student (name, gender) VALUES (张三, 男)); } Test public void testFindById() throws SQLException { Student stu dao.findById(1L); assertNotNull(stu); assertEquals(张三, stu.getName()); // 断言姓名 assertEquals(男, stu.getGender()); } }逻辑说明Before方法确保每次测试前环境干净JdbcUtil是项目自带的 JDBC 工具类封装了getConnection()和executeUpdate()assertEquals比System.out.println()更体现工程素养。答辩时演示“右键 → Run ‘StudentDaoTest’”比口头说“我测过了”有力得多。5.2 日志增强把 System.out.println 替换为 Log4j2轻量级改造项目当前用System.out.println()打印日志不利于排查。替换为 Log4j2 只需 3 步添加依赖将log4j-api-2.19.0.jar和log4j-core-2.19.0.jar放入lib/配置文件在src/下新建log4j2.xml?xml version1.0 encodingUTF-8? Configuration statusWARN Appenders Console nameConsole targetSYSTEM_OUT PatternLayout pattern%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n/ /Console /Appenders Loggers Root levelinfo AppenderRef refConsole/ /Root /Loggers /Configuration代码替换在LoginServlet.java中// 替换前 System.out.println(用户 username 登录成功); // 替换后 private static final Logger logger LogManager.getLogger(LoginServlet.class); logger.info(用户 {} 登录成功, username); // 自动格式化线程安全效果控制台日志带时间戳、线程名、日志级别且logger.info(xxx {}, param)比字符串拼接更高效。这属于“改三行代码提升专业感”的典型技巧。5.3 导出 Excel 功能用 Apache POI 补充一个实用模块项目原功能只有增删查改但加一个“导出学生名单为 Excel”能让答辩瞬间生动。利用lib/poi-5.2.4.jar和poi-ooxml-5.2.4.jar// src/com/student/servlet/ExportStudentServlet.java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ListStudent list new StudentService().findAll(); XSSFWorkbook workbook new XSSFWorkbook(); XSSFSheet sheet workbook.createSheet(学生名单); // 表头 XSSFRow header sheet.createRow(0); String[] titles {ID, 姓名, 性别, 出生日期, 班级}; for (int i 0; i titles.length; i) { header.createCell(i).setCellValue(titles[i]); } // 数据行 for (int i 0; i list.size(); i) { XSSFRow row sheet.createRow(i 1); Student s list.get(i); row.createCell(0).setCellValue(s.getId()); row.createCell(1).setCellValue(s.getName()); row.createCell(2).setCellValue(s.getGender()); row.createCell(3).setCellValue(s.getBirthDate().toString()); row.createCell(4).setCellValue(s.getClassName()); } // 响应输出 response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); response.setHeader(Content-Disposition, attachment; filenamestudent_list.xlsx); workbook.write(response.getOutputStream()); }配置web.xmlservlet servlet-nameExportStudentServlet/servlet-name servlet-classcom.student.servlet.ExportStudentServlet/servlet-class /servlet servlet-mapping servlet-nameExportStudentServlet/servlet-name url-pattern/export/url-pattern /servlet-mapping在index.jsp添加按钮a hrefexport classlayui-btn导出 Excel/a。这个功能代码 50 行却能直观展示“我不仅会 CRUD还能对接办公场景”。从那以后我每次交课程设计都会强制走一遍这三件事① 用 JUnit 跑通 DAO 测试② 把System.out全替成 Log4j2③ 加一个导出/打印/统计类小功能。不是为了炫技而是让代码从“作业”变成“作品”——当老师问“你这个系统有什么特别之处”你能指着 Excel 导出按钮说“它能直接喂给教务处不用再 copy-paste。”希望帮到你。本文还有配套的精品资源点击获取
返回列表