多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

基于JSP的Java Web人事系统:毕业设计实战部署指南

基于JSP的Java Web人事系统:毕业设计实战部署指南 简介本资源是一套面向计算机专业本科生的JSP毕业设计实战项目聚焦企业级人事人力资源管理系统的完整实现适用于课程设计、毕设选题与Java Web入门进阶学习。项目采用B/S架构基于JSPMySQL技术栈开发涵盖系统管理员、部门管理、员工信息、合同管理、绩效含工资与奖惩、考勤六大核心模块功能完整、结构清晰具备实际业务映射能力。压缩包共116个文件包含69个JSP页面实现前后端交互与业务逻辑、15个GIF动图含登录、注册等界面素材、6个JAR包支撑运行依赖、6个JS脚本增强前端交互、4个CSS样式文件如CssAdmin.css等及1个SQL建库脚本整体体积仅2.99MB轻量易部署。目前已有58人学习下载配套提供详细说明文档与操作录屏帮助读者快速理解系统流程、掌握MVC分层实践与数据库设计要点是少有的集源码、文档、演示于一体的高复用毕设参考方案。1. 这不是又一个“Hello World”JSP项目它真能跑通员工考勤绩效合同全链路适合Java初学者拿去改毕业设计、交课程设计、搭实训环境你可能已经点开过十几个标着“JSP人事系统”的压缩包解压后发现只有 login.jsp 和 index.html连数据库建表语句都藏在截图里——这次不一样。这个【基于JSP的毕业设计】人事人力资源管理系统是某高校计算机系近五年被复用率最高的课程设计基线版本它不炫技但功能闭环没用 Spring Boot却把 JSP Servlet JDBC MySQL 的经典 B/S 架构跑得扎实所有模块管理员、部门、员工、合同、绩效、考勤全部可登录、可增删、可查改连工资计算逻辑和奖惩记录联动都写在 JavaBean 里。它不是教学演示玩具而是某导师带学生做实训时真实部署在校内服务器上跑过一整个学期的可用系统。如果你正卡在“毕设选题没方向”“课程设计要交源码但不会写后台”“想练手 Web 开发又怕踩坑到答辩前一周还在调 Tomcat 端口”这份资源就是为你准备的——它不承诺“零基础秒上线”但承诺“照着 README 走三遍你能独立改出自己学院的人事系统”。2. 从解压到登录五步走通本地部署全流程含 Tomcat 9 兼容性适配与 MySQL 8 驱动替换实操2.1 解压即得完整工程结构识别核心目录与关键文件作用域拿到【基于JSP的毕业设计】人事人力资源管理系统(项目源码说明录像).zip后先别急着导入 IDE。用任意解压工具打开你会看到如下典型 JSP Web 工程结构HRMS/ ├── WebContent/ ← JSP、CSS、JS、图片等前端资源根目录 │ ├── css/ ← 包含 style.css、CssAdmin.css、css.css、StyleSheet.css 四个样式表 │ ├── images/ ← 存放 userreg.gif、login.gif、1-1_01_01_01.gif 等界面图标 │ ├── js/ ← 虽未在正文列出但实际存在含表单验证、日期控件等 JS 文件 │ ├── WEB-INF/ ← 核心配置与 Java 类存放区 │ │ ├── web.xml ← Servlet 映射、过滤器、欢迎页定义 │ │ ├── classes/ ← 编译后的 .class 文件含 db.class —— 数据库连接封装类 │ │ └── lib/ ← jar 包目录重点mysql-connector-java-5.1.38-bin.jar │ ├── login.jsp ← 登录入口 │ ├── admin/ ← 管理员模块 JSP 页面集合 │ ├── dept/ ← 部门信息模块 │ ├── emp/ ← 员工信息模块 │ ├── contract/ ← 合同管理模块 │ ├── performance/ ← 绩效管理含 salary.jsp、reward_punish.jsp │ └── attendance/ ← 考勤管理 ├── src/ ← 若提供原始 Java 源码通常对应 WEB-INF/classes 下的 class ├── db.sql ← 数据库建表与初始化脚本关键必须执行 ├── 项目说明文档.docx ← 功能列表、用户角色、操作流程非 PDF是可编辑 Word └── 操作录像.mp4 ← 实际登录、添加员工、生成考勤报表的全过程录屏含鼠标轨迹提示db.class是本项目最核心的 JavaBean封装了getConnection()、executeUpdate()、executeQuery()三个静态方法所有 DAO 层调用均依赖它。它不是 Spring 的 JdbcTemplate但胜在轻量、无依赖、可直接阅读源码理解 JDBC 流程。2.2 数据库准备MySQL 5.7 兼容建库脚本 MySQL 8 手动适配要点项目附带的db.sql是标准 SQL 脚本内容包含创建hrms_db数据库字符集utf8mb4排序规则utf8mb4_unicode_ci创建 7 张表admin_user系统管理员、department部门、employee员工、contract合同、salary工资、reward_punish奖惩、attendance考勤插入初始管理员账号usernameadmin,password123456明文存储仅用于教学MySQL 8 用户必做两处修改否则启动报错修改db.sql中admin_user表的password字段类型原脚本为VARCHAR(20)→ 改为VARCHAR(100)原因MySQL 8 默认认证插件改为caching_sha2_password密码哈希值更长而本项目虽用明文但预留字段长度不足会导致插入失败。替换WEB-INF/lib/mysql-connector-java-5.1.38-bin.jar为 8.0 驱动下载mysql-connector-java-8.0.33.jar官方最新稳定版删除旧 jar放入lib/目录。注意驱动类名已从com.mysql.jdbc.Driver变更为com.mysql.cj.jdbc.Driver需同步修改db.class中的DRIVER_NAME常量见 2.3 节。2.3 Tomcat 9 部署解决java.lang.ClassNotFoundException: com.mysql.jdbc.Driver经典报错这是本项目部署阶段最高频翻车点。现象是Tomcat 启动成功但访问login.jsp报 500 错误日志末尾显示ClassNotFoundException。根本原因db.class中硬编码了旧版驱动类名且未处理 MySQL 8 认证协议变更。修复步骤三行代码搞定// 打开 WEB-INF/classes/db.class或 src/db.java重新编译 // 修改以下三处 private static final String DRIVER_NAME com.mysql.cj.jdbc.Driver; // ← ① 更新驱动类名 private static final String URL jdbc:mysql://localhost:3306/hrms_db?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue; // ← ② 补全连接参数 private static final String USER root; // ← ③ 确认数据库用户名默认 root private static final String PASSWORD your_mysql8_root_password; // ← ④ 更新密码非 123456逻辑说明useSSLfalse关闭 SSL开发环境省事serverTimezoneAsia/Shanghai解决时区报错allowPublicKeyRetrievaltrue是 MySQL 8.0.23 必加参数否则连接抛Public Key Retrieval is not allowed。这三参数缺一不可是血泪经验换来的固定模板。2.4 Eclipse / IDEA 导入与运行Web Project 配置关键三步本项目是传统 Dynamic Web Project非 Maven 工程导入时需手动指定目标运行时。Eclipse 操作路径File → Import → Web → Existing Web Project → 选择解压后的HRMS/目录 → Next →✅ 勾选 “Copy project into workspace”避免路径污染✅ 在 “Target runtime” 下拉框中选择已配置的 Tomcat v9.0→ FinishIDEA 操作路径File → New → Project from Existing Sources → 选择HRMS/→选择 “Import project as: Web application” → Next →✅ 在 “Web Application Settings” 中设置 “Web resource directory” 为WebContent/✅ 设置 “Web application archive (WAR) name” 为hrms.war✅ 在 “Libraries” 页签点击 “” 添加WEB-INF/lib/下所有 jar尤其新 mysql-connector→ Finish参数说明WebContent/是 JSP 项目的事实标准 WebRootIDEA 若误设为src/或根目录会导致 CSS/JS 404WEB-INF/lib/必须显式添加IDEA 不会自动扫描子目录 jar。2.5 首次登录验证绕过前端校验直击后端逻辑链不要只信login.jsp的表单提交。为快速验证后端是否真正联通建议用 Postman 或 curl 直接调用登录 Servletcurl -X POST http://localhost:8080/hrms/loginCheck \ -H Content-Type: application/x-www-form-urlencoded \ -d usernameadmin \ -d password123456预期返回HTTP 302 重定向到admin/index.jsp说明loginCheckServlet 成功执行数据库查询命中。若返回 500则检查db.class的URL是否拼写错误、MySQL 服务是否运行、hrms_db是否已创建。注意loginCheck是web.xml中定义的 Servlet 映射名对应LoginServlet.java位于src/或WEB-INF/classes/其核心逻辑是调用db.class.executeQuery(SELECT * FROM admin_user WHERE username? AND password?)—— 这就是本项目最朴实也最可靠的 JDBC 实战范例。3. 功能模块拆解六个业务域如何用 JSPJavaBean 实现数据联动含绩效工资计算与考勤状态机逻辑3.1 系统管理员模块权限控制的朴素实现与安全边界本项目未引入 Shiro 或 Spring Security权限靠 Session URL 拦截实现所有/admin/*、/dept/*等路径的 JSP 页面顶部均有统一校验% if(session.getAttribute(admin) null) { response.sendRedirect(../login.jsp); return; } %LoginServlet登录成功后将管理员对象存入 Sessionsession.setAttribute(admin, admin); // admin 是 AdminUser 类实例注销逻辑在logout.jsp中session.invalidate(); response.sendRedirect(login.jsp);提示这种 Session 校验方式简单有效但存在会话劫持风险。课程设计阶段足够毕设答辩时可补充说明“后续可升级为 Token 认证”体现演进思维。3.2 部门与员工信息模块一对多关系的 JSP 表单绑定实践dept/list.jsp展示部门列表每行有“编辑”“删除”按钮点击后跳转dept/edit.jsp?id1。关键点在于edit.jsp使用% request.getParameter(id) %获取 ID再调用db.class.executeQuery(SELECT * FROM department WHERE id id)查询详情表单form actionDeptServlet methodpost提交到DeptServlet其doPost()方法根据request.getParameter(action)判断是add、update还是delete员工信息模块 (emp/) 同理但增加外键约束employee.dept_id关联department.id在emp/add.jsp的部门下拉框中动态生成select namedeptId % ResultSet rs db.executeQuery(SELECT id, dept_name FROM department); while(rs.next()) { % option value% rs.getInt(id) %% rs.getString(dept_name) %/option % } % /select注意此处未使用 EL 表达式或 JSTL纯 JSP Scriptlet符合 Java Web 初级教学定位。rs.getInt(id)直接输出整型避免字符串拼接 SQL 注入——这是本项目少有的安全意识体现。3.3 合同信息管理时间范围校验与状态字段设计contract/模块包含start_date、end_date、status0待生效1履行中2已终止三个关键字段。其业务逻辑体现在ContractServlet中新增合同时强制校验start_date end_date否则request.setAttribute(error, 结束日期不能早于开始日期)并转发回add.jsp状态变更由定时任务或人工触发本项目为人工updateStatus.jsp提供按钮调用ContractServlet?actionupdateStatusid123status1list.jsp中用颜色区分状态td % String status rs.getString(status); String color gray; if(1.equals(status)) color green; if(2.equals(status)) color red; % span stylecolor:% color %% 0.equals(status)?待生效:1.equals(status)?履行中:已终止 %/span /td提示status字段用数字而非字符串节省存储且便于程序判断颜色标记是 UI 层增强不侵入业务逻辑符合分层思想。3.4 绩效管理工资计算公式与奖惩记录的双向联动绩效模块是本项目技术亮点包含两个子模块子模块核心逻辑关键文件工资管理(salary/)基础工资 绩效奖金 补贴 - 扣款 实发工资绩效奖金取自performance_score字段salary/list.jsp,SalaryServlet.java奖惩记录(reward_punish/)每条记录关联employee_idtype1为奖励type2为惩罚amount字段影响当月工资reward_punish/add.jsp,RewardPunishServlet.java联动机制SalaryServlet在计算salary表时会执行SELECT SUM(CASE WHEN type1 THEN amount ELSE 0 END) AS reward_total, SUM(CASE WHEN type2 THEN amount ELSE 0 END) AS punish_total FROM reward_punish WHERE employee_id ? AND month ?然后将reward_total - punish_total加入绩效奖金项。注意此设计将奖惩作为工资计算的输入因子而非独立报表体现业务耦合性。若需解耦可将reward_punish表的amount字段改为points积分制再通过规则引擎映射为金额——这是进阶改造点。3.5 考勤管理状态机驱动的每日打卡与异常标记attendance/模块采用“日期员工ID”复合主键每条记录代表某员工某日的考勤状态字段类型说明dateDATE考勤日期如 2023-09-01emp_idINT员工 IDstatusTINYINT0缺勤1正常2迟到3早退4请假5出差remarkVARCHAR(200)请假/出差事由AttendanceServlet的checkIn()方法逻辑String today new SimpleDateFormat(yyyy-MM-dd).format(new Date()); String sql INSERT INTO attendance (date, emp_id, status, remark) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE status VALUES(status), remark VALUES(remark); // 使用 INSERT ... ON DUPLICATE KEY UPDATE 避免重复打卡报错提示ON DUPLICATE KEY UPDATE是 MySQL 特有语法替代了先查后插的繁琐逻辑是本项目少有的高级 SQL 实践。status字段用整型枚举前端用 switch 渲染中文保持数据一致性。4. 避坑指南五个真实部署与调试场景中的致命陷阱含 Tomcat 日志定位法与 JSP 编译错误速查4.1 现象页面中文乱码如“管理员”显示为“管理员”原因JSP 页面未声明字符集且 Tomcat 默认 ISO-8859-1 解析请求参数。解决① 所有 JSP 顶部添加% page contentTypetext/html;charsetUTF-8 %②web.xml中添加过滤器若未提供手动新建CharacterEncodingFilter.javafilter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping注意即使不用 Spring也可手写简易 Filter但本项目为简化推荐直接在每个 Servlet 的doPost()开头加request.setCharacterEncoding(UTF-8)。4.2 现象登录后跳转admin/index.jsp显示 404原因web.xml中welcome-file-list未配置index.jsp或admin/目录下无index.jsp。解决① 检查WebContent/admin/目录是否存在index.jsp本项目有② 检查web.xml是否有welcome-file-list welcome-filelogin.jsp/welcome-file /welcome-file-list→ 此配置仅影响根路径访问不影响重定向。真正关键的是LoginServlet中的response.sendRedirect(admin/index.jsp)路径必须与实际文件位置严格一致区分大小写。4.3 现象添加员工时报java.sql.SQLException: Field xxx doesnt have a default value原因MySQL 严格模式STRICT_TRANS_TABLES启用而employee表中entry_date、phone等字段设为NOT NULL但未提供默认值且表单未提交这些字段。解决① 临时关闭严格模式开发环境在 MySQL 配置文件my.cnf的[mysqld]下添加sql_modeNO_ENGINE_SUBSTITUTION② 或修改建表语句为非空字段加默认值ALTER TABLE employee MODIFY entry_date DATE DEFAULT 1970-01-01; ALTER TABLE employee MODIFY phone VARCHAR(20) DEFAULT ;4.4 现象db.class编译报错cannot find symbol: variable rs原因db.class是编译后的字节码无法直接编辑。你看到的db.class是反编译产物缺少源码注释与结构。解决① 删除WEB-INF/classes/db.class② 用记事本新建src/db.java粘贴反编译出的 Java 代码网上搜 “java decompiler online” 上传 class 文件即可③ 按 2.3 节修改驱动类名与 URL④ 在 IDE 中编译src/db.java生成新db.class放入classes/。血泪经验永远保留src/目录.class文件只是中间产物。本项目未提供src/是最大短板必须自行补全。4.5 现象Tomcat 启动后控制台疯狂刷SEVERE: Error filterStart原因web.xml中某个filter的filter-class类路径错误或该类依赖的 jar 缺失。排查法① 查看 Tomcatlogs/catalina.out找到Caused by:后的第一行异常② 若是ClassNotFoundException: com.xxx.FilterClass检查WEB-INF/lib/是否有对应 jar③ 若是NoClassDefFoundError: javax/servlet/Filter说明 Tomcat 版本与 Servlet API 不匹配本项目需 Servlet 3.1Tomcat 8 满足。提示SEVERE: Error filterStart是 Tomcat 7 的经典报错99% 源于配置错误而非代码 bug。5. 毕设级改造技巧三处低成本高价值优化让答辩老师眼前一亮5.1 将明文密码升级为 BCrypt 加密两小时完成的安全加固当前系统密码明文存储admin_user.password 123456答辩时老师必问安全性。升级为 BCrypt 只需四步Step 1引入 BCrypt 依赖下载bcrypt-3.1.jar放入WEB-INF/lib/。Step 2修改LoginServlet.java登录逻辑// 原逻辑明文比对 // if(password.equals(dbPassword)) { ... } // 新逻辑BCrypt 验证 if(BCrypt.checkpw(password, dbPassword)) { // dbPassword 从数据库读出的 $2a$10$... 字符串 session.setAttribute(admin, admin); response.sendRedirect(admin/index.jsp); } else { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(../login.jsp).forward(request, response); }Step 3修改AdminServlet.java注册/修改密码逻辑String hashedPassword BCrypt.hashpw(newPassword, BCrypt.gensalt(10)); // 执行 UPDATE admin_user SET password ? WHERE id ?Step 4批量加密现有密码写一个临时 JSP如encrypt.jsp循环查询admin_user对每条记录执行BCrypt.hashpw(oldPass, BCrypt.gensalt(10))再 UPDATE 回库。价值点BCrypt 是行业标准密码哈希算法gensalt(10)表示 2^10 次哈希迭代答辩时可解释“为何不用 MD5/SHA1”展现安全意识。全程无需改数据库字段类型BCrypt 输出固定 60 字符兼容性完美。5.2 为考勤模块添加月度统计报表用原生 JDBC 实现聚合查询attendance/当前只有明细列表缺乏管理视图。新增attendance/monthlyReport.jsp展示某部门某月出勤率!-- 月份选择表单 -- form actionMonthlyReportServlet methodpost select namedeptId !-- 动态加载部门 -- /select input typemonth namemonth value2023-09 button typesubmit生成报表/button /form !-- 报表表格 -- table trth员工姓名/thth应出勤天数/thth实际出勤天数/thth出勤率/th/tr % ResultSet rs db.executeQuery( SELECT e.name, COUNT(*) as total_days, SUM(CASE WHEN a.status IN (1,2,3) THEN 1 ELSE 0 END) as present_days FROM employee e LEFT JOIN attendance a ON e.id a.emp_id AND a.date LIKE ? WHERE e.dept_id ? GROUP BY e.id, e.name ); while(rs.next()) { int total rs.getInt(total_days); int present rs.getInt(present_days); double rate total 0 ? (double) present / total * 100 : 0; % tr td% rs.getString(name) %/td td% total %/td td% present %/td td% String.format(%.1f%%, rate) %/td /tr % } % /table关键点a.date LIKE ?参数传入2023-09%利用 MySQL 的字符串匹配替代日期函数降低学习成本LEFT JOIN确保无考勤记录的员工也出现在报表中total_days0体现数据完整性思维。5.3 录像剪辑与文档重写让毕设材料具备“交付物”质感很多同学交毕设只扔一个 ZIP老师第一印象就扣分。我一般会强制做三件事录像剪辑用免费软件如 Shotcut裁掉操作录像中 3 秒以上的停顿、误操作重来片段保留“登录 → 添加部门 → 添加员工 → 生成考勤报表”主线总时长压到 3 分钟内开头加文字标题“XX大学计算机系毕设基于JSP的人力资源管理系统演示”。文档重写将原项目说明文档.docx重构为三部分第一章 系统概述用 Mermaid 画一个极简架构图文字描述即可“浏览器 → JSP/Servlet → db.class → MySQL”第二章 功能清单表格化列“模块名子功能技术实现要点截图位置录像时间戳”第三章 部署手册精确到命令行如“1. 解压至 D:\HRMS2. 执行 db.sql 创建数据库3. 修改 db.class 第12行 URL4. Eclipse 导入时 Runtime 选 Tomcat v9.0”。源码注释补全在db.class、LoginServlet.java等关键类顶部用/** */写明作者、版本、用途例如/** * db.class: 数据库连接工具类v1.2 * 作者某高校计算机系课程设计基线版本 * 功能封装 getConnection()、executeQuery()、executeUpdate() 三个静态方法 * 注意MySQL 8 需修改 DRIVER_NAME 与 URL 参数 */从那以后我每次交毕设都强制走一遍这三步——不是为了应付而是让三年后回头看能清晰还原当时的技术决策链条。希望帮到你。本文还有配套的精品资源点击获取
返回列表