☰
JSP人事管理系统源码解析:从环境搭建到二次开发实战
2026/10/9 10:53:30 网站建设 项目流程

简介:这是一套面向计算机专业毕业设计与期末大作业场景的Java Web人事人力资源管理系统完整资料包,采用JSP技术基于B/S结构开发,开发环境为MyEclipse,服务器使用Tomcat,通过JDBC与数据库无缝连接,适合需要快速搭建可运行项目、撰写开题报告与答辩演示的学生参考。系统覆盖管理员后台核心业务,包括部门信息、员工信息、合同信息、绩效管理(含员工工资与奖惩记录)以及考勤管理等多个功能模块,结构完整、逻辑清晰。压缩包共116个文件,约3.02MB,以69个jsp页面为主体,辅以gif、jpg等界面素材,css样式文件,以及jar依赖、js脚本、sql数据库脚本和开题报告docx文档,另附演示视频,便于对照理解运行效果与设计思路。目前已有65人学习下载,可作为毕业设计选题、课程设计参考或Java Web入门练手项目,帮助读者快速掌握系统分层设计、数据库连接与后台功能实现方法。

1. 从一份 JSP 毕设压缩包说起:这套人事系统到底能跑通什么

如果你正在搜「Java 人事人力资源管理系统 源码」,大概率是三种人之一:要交课程设计的学生、想拿一套能跑通的 CRUD 项目练手的转行者、或者带毕设的老师想找个参考模板。我拆的这份压缩包,标题写得很直白——源码、开题报告、数据库文件、演示视频四件套齐全,技术栈是 JSP + JavaBean + JDBC + MySQL,开发环境 MyEclipse,服务器 Tomcat,典型的 B/S 结构。它覆盖的模块不算花哨但很完整:管理员登录、部门信息、员工信息、合同管理、绩效管理(含工资和奖惩记录)、考勤管理。换句话说,一个中小型企业人事部门日常要用的增删改查和统计,它基本都占上了。这份资源适合谁?适合需要一套结构清晰、能本地跑起来、还能对着改的 JavaWeb 入门级项目的人。不适合谁?不适合想找 Spring Boot + Vue 前后端分离架构的人,这套是纯 JSP 时代的写法,你得接受它的技术年代感。

2. 环境搭建与数据库还原:让项目在本地跑起来的第一步

2.1 技术选型为什么是 JSP + JDBC 而不是框架

拿到这份源码,第一反应可能是「怎么还在用 JSP」。但站在毕设和课程设计的场景看,这个选型其实有它的道理。JSP + JavaBean + JDBC 是最贴近 JavaWeb 教学大纲的组合,没有 Spring 的依赖注入、没有 MyBatis 的映射文件,所有 SQL 都写在 DAO 层里,逻辑链路短,出错了你能一眼看到是哪一行 JDBC 代码抛的异常。对于要理解「一个请求从浏览器到数据库再回来」完整流程的人来说,这种「裸写」反而比框架更容易建立直觉。

从压缩包的文件列表也能看出端倪:db.class、.classpath、style.css、CssAdmin.css、css.css、StyleSheet.css、开题.docx,还有一堆.gif图片资源。.classpath是 Eclipse/MyEclipse 的工程配置文件,说明这个项目是直接以 IDE 工程形式打包的,导入后不需要手动配构建路径。db.class这个文件值得注意——它很可能是数据库连接配置编译后的产物,也可能是某个数据库操作工具类,还原数据库时要重点看它对应的源码。

选型上没有绝对的对错,只有场景匹配。你要交的是 JSP 课程设计,用框架反而可能被质疑「这不是你自己写的」。你要做的是企业级项目,那这套代码只能当参考,不能直接上生产。

2.2 数据库还原的完整操作步骤

数据库文件是这套资源的核心之一。通常这类毕设项目会带一个.sql文件,用 Navicat 或命令行导入即可。但实际操作中,导入失败是高频问题。下面是我一般会走的流程。

第一步,确认 MySQL 版本和字符集。老项目大概率用的是utf8而不是utf8mb4,如果你本地是 MySQL 8.0,默认字符集变了,导入时可能报错。

# 先看本地 MySQL 版本 mysql --version # 登录后查看默认字符集 mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set_%';"

如果默认是utf8mb4,而 SQL 文件里写的是utf8,一般兼容,但如果 SQL 文件里有utf8mb4不支持的旧排序规则,就需要在导入时指定字符集。

第二步,创建数据库并导入。

# 创建数据库,字符集跟 SQL 文件保持一致 mysql -u root -p -e "CREATE DATABASE hr_system DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;" # 导入 SQL 文件 mysql -u root -p hr_system < /path/to/database.sql

这里有个参数要留意:DEFAULT CHARACTER SET utf8。如果你不确定 SQL 文件用的什么字符集,可以用file命令先看一眼文件编码,或者直接用文本编辑器打开 SQL 文件头部,通常会有SET NAMES utf8;这样的语句。

第三步,修改项目中的数据库连接配置。找到db.class对应的源码文件(通常是DB.java或DBHelper.java),把 URL、用户名、密码改成你本地的。

// 典型的 JDBC 连接配置,参数按你本地环境改 public class DB { private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/hr_system?useUnicode=true&characterEncoding=utf8"; private static final String USER = "root"; private static final String PASSWORD = "你的密码"; public static Connection getConnection() throws Exception { Class.forName(DRIVER); return DriverManager.getConnection(URL, USER, PASSWORD); } }

逻辑说明:Class.forName(DRIVER)加载 MySQL 驱动,DriverManager.getConnection建立连接。useUnicode=true&characterEncoding=utf8这两个参数是防止中文乱码的关键,少了它们,员工姓名、部门名称存进去可能就是问号。参数怎么改:URL 里的localhost:3306换成你的数据库地址和端口,hr_system换成你实际创建的库名。如果用的是 MySQL 8.0 驱动,DRIVER要改成com.mysql.cj.jdbc.Driver,URL 还要加serverTimezone=Asia/Shanghai,否则会报时区错误。

2.3 Tomcat 部署与项目导入

MyEclipse 导入老项目有个坑:JDK 版本。这类项目大概率是 JDK 1.7 或 1.8 编译的,如果你本地是 JDK 11 以上,javax.servlet包可能找不到。常见做法是装一个 JDK 8,在 IDE 里把项目 SDK 切到 1.8。

导入步骤:File → Import → General → Existing Projects into Workspace,选中解压后的项目根目录。导入后检查 Build Path,确认 JRE 是 1.8,Tomcat 库已经加进去。然后右键项目 → Run As → Run on Server,选 Tomcat 7 或 8。Tomcat 10 不行,因为javax.servlet在 Tomcat 10 里已经改成了jakarta.servlet,包名对不上直接 404。

部署成功后访问http://localhost:8080/项目名/login.jsp,应该能看到登录页。默认账号密码通常在 SQL 文件的admin表里,或者开题报告里有写。

3. 核心模块的代码结构与二次开发切入点

3.1 部门、员工、合同三个模块的 DAO 层写法

这套系统的代码结构是典型的 JSP + Servlet + DAO + JavaBean 分层。以部门信息模块为例,DepartmentDAO.java里通常有addDepartment、deleteDepartment、updateDepartment、getAllDepartments这几个方法。员工模块类似,但多了一个外键关联——员工表里会有department_id字段指向部门表。

// 部门 DAO 的典型写法,注意 SQL 拼接和参数设置 public boolean addDepartment(Department dept) { String sql = "INSERT INTO department (dept_name, dept_desc) VALUES (?, ?)"; try (Connection conn = DB.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, dept.getDeptName()); pstmt.setString(2, dept.getDeptDesc()); return pstmt.executeUpdate() > 0; } catch (Exception e) { e.printStackTrace(); return false; } }

逻辑说明:用PreparedStatement而不是Statement拼接字符串,是为了防 SQL 注入。参数说明:setString(1, ...)对应 SQL 里第一个?,索引从 1 开始。executeUpdate()返回受影响行数,大于 0 表示插入成功。这里用了 try-with-resources,连接和语句会自动关闭,避免连接泄漏。

合同管理模块的 DAO 会多一个日期字段处理。老项目里日期类型通常用java.util.Date,存进 MySQL 的DATE或DATETIME字段时,需要用new java.sql.Date(date.getTime())转换。这个转换如果漏了,会报ClassCastException或者存进去变成 0000-00-00。

3.2 绩效与考勤模块的业务逻辑拆解

绩效管理是这套系统里逻辑最厚的部分,因为它把工资和奖惩记录揉在了一起。通常的设计是:performance表存月度绩效评分,salary表存基本工资和绩效工资,reward_punishment表存奖惩金额。三个表通过employee_id关联,计算实发工资时要把三者加总。

// 计算实发工资的典型逻辑 public double calculateRealSalary(int employeeId, String month) { double baseSalary = salaryDAO.getBaseSalary(employeeId); double performanceBonus = performanceDAO.getBonus(employeeId, month); double reward = rewardPunishmentDAO.getReward(employeeId, month); double punishment = rewardPunishmentDAO.getPunishment(employeeId, month); // 实发 = 基本工资 + 绩效奖金 + 奖励 - 惩罚 return baseSalary + performanceBonus + reward - punishment; }

参数说明:employeeId是员工主键,month是查询月份,格式通常是yyyy-MM。这个方法的坑在于:如果某个员工当月没有绩效记录,getBonus返回 0 还是抛异常?老项目里常见做法是返回 0,但你要检查 DAO 里有没有对null做处理。没处理的话,ResultSet.getDouble在字段为 NULL 时返回 0,但如果你用的是getObject再强转,就会 NPE。

考勤模块相对简单,核心是一张attendance表,字段包括employee_id、attendance_date、status(正常/迟到/早退/缺勤)。统计功能通常是按员工和月份分组,用GROUP BY加COUNT实现。

-- 按月统计每个员工的出勤情况 SELECT e.emp_name, SUM(CASE WHEN a.status = '正常' THEN 1 ELSE 0 END) AS normal_days, SUM(CASE WHEN a.status = '迟到' THEN 1 ELSE 0 END) AS late_days, SUM(CASE WHEN a.status = '缺勤' THEN 1 ELSE 0 END) AS absent_days FROM employee e LEFT JOIN attendance a ON e.emp_id = a.employee_id WHERE DATE_FORMAT(a.attendance_date, '%Y-%m') = '2024-01' GROUP BY e.emp_id, e.emp_name;

这个 SQL 用了CASE WHEN做条件计数,LEFT JOIN保证没有考勤记录的员工也会出现在结果里。参数说明:DATE_FORMAT的格式串%Y-%m对应年月,换成%Y-%m-%d就是按天统计。注意WHERE条件放在LEFT JOIN后面,如果放在ON里,过滤逻辑会不一样。

3.3 前端 JSP 页面的复用与样式调整

压缩包里那堆 CSS 文件——style.css、CssAdmin.css、css.css、StyleSheet.css——说明前端样式是分开管理的。CssAdmin.css大概率是后台管理页面的样式,style.css是公共样式。JSP 页面里通常用<jsp:include>引入公共头部和尾部,减少重复代码。

<!-- 典型的 JSP 页面结构 --> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ include file="common/header.jsp" %> <div class="main-content"> <h2>员工信息列表</h2> <table class="table-style"> <tr><th>工号</th><th>姓名</th><th>部门</th><th>操作</th></tr> <%-- 这里用 JSTL 或脚本片段遍历员工列表 --%> </table> </div> <%@ include file="common/footer.jsp" %>

逻辑说明:<%@ include file="..." %>是静态包含,编译时合并成一个文件。<%@ page contentType="text/html;charset=UTF-8" %>这行必须放在最前面,否则中文会乱码。样式调整时,优先改CssAdmin.css里的类选择器,不要直接改 JSP 里的内联样式,否则后期维护会疯。

4. 避坑与常见问题排查:那些年我踩过的 JDBC 和 Tomcat 的坑

4.1 中文乱码:从数据库到页面的全链路排查

现象:员工姓名存进去是「??」,或者页面显示「å¼ ä¸」这样的乱码。

原因:乱码可能出现在三个环节——数据库字符集、JDBC 连接字符集、JSP 页面编码。任何一个环节不一致都会导致乱码。

解决:按链路逐一排查。数据库层面,SHOW CREATE DATABASE hr_system;确认字符集是utf8。JDBC 层面,URL 里必须有useUnicode=true&characterEncoding=utf8。JSP 层面,每个页面头部都要有<%@ page contentType="text/html;charset=UTF-8" %>。如果用了request.getParameter接收中文,还要在 Servlet 里加request.setCharacterEncoding("UTF-8"),这行必须放在获取参数之前。

4.2 Tomcat 启动报 404:项目名和 web.xml 的对应关系

现象:Tomcat 启动没报错,但访问http://localhost:8080/是 404。

原因:项目部署后的上下文路径(Context Path)和你访问的 URL 不匹配。老项目在 MyEclipse 里部署时,默认上下文路径是项目名,但如果你改了项目名或者web.xml里的<display-name>,路径就变了。

解决:在 Tomcat 的conf/server.xml里找<Context>标签,或者在 IDE 的 Servers 视图里双击 Tomcat,看 Modules 选项卡里的 Path。访问时用http://localhost:8080/那个Path/login.jsp。另一个可能是web.xml里<welcome-file-list>配置的首页文件不存在,检查根目录下有没有index.jsp。

4.3 JDBC 连接报错:驱动版本和时区问题

现象:java.sql.SQLException: No suitable driver found或者The server time zone value '?D1ú±ê×?ê±??' is unrecognized。

原因:第一个是驱动类名写错或驱动 jar 没放进WEB-INF/lib。第二个是 MySQL 8.0 驱动需要指定时区。

解决:MySQL 5.x 用com.mysql.jdbc.Driver,MySQL 8.x 用com.mysql.cj.jdbc.Driver。驱动 jar 必须放在WEB-INF/lib目录下,不是项目的 Build Path 里加了就行,Tomcat 运行时只认WEB-INF/lib。时区问题在 URL 后面加?serverTimezone=Asia/Shanghai,注意如果已经有其他参数,要用&连接。

4.4 数据库导入失败:外键约束和 SQL 模式

现象:导入 SQL 文件时报Cannot add or update a child row: a foreign key constraint fails。

原因:SQL 文件里表的创建顺序不对,或者插入数据时引用了不存在的父表记录。老项目导出时可能没按依赖顺序排列。

解决:在导入前先执行SET FOREIGN_KEY_CHECKS = 0;,导入完成后再SET FOREIGN_KEY_CHECKS = 1;。这会暂时关闭外键检查,让数据先进去。但导入后要手动检查数据完整性,避免留下脏数据。另一个办法是打开 SQL 文件,把建表语句按依赖顺序重排——先建department,再建employee,最后建attendance和salary。

4.5 页面样式丢失:CSS 路径和静态资源映射

现象:JSP 页面能打开,但没有任何样式,全是裸 HTML。

原因:CSS 文件的路径不对。JSP 里引用 CSS 通常用<link href="css/style.css" rel="stylesheet">,这是相对路径。如果 JSP 页面在子目录里,相对路径就会失效。

解决:用${pageContext.request.contextPath}获取项目根路径,写成<link href="${pageContext.request.contextPath}/css/style.css" rel="stylesheet">。这样无论页面在哪个目录,路径都是对的。另外检查web.xml里有没有配defaultservlet 的映射,Tomcat 默认会处理静态资源,但如果你自己配了拦截所有请求的 servlet,CSS 和图片就会被拦截。

5. 从能跑到能改:二次开发的三个实用技巧

5.1 用开题报告反推功能边界

压缩包里的开题.docx不只是给老师看的,它是你理解这套系统设计意图的钥匙。开题报告里通常会写「研究背景」「国内外现状」「功能模块划分」「技术路线」「进度安排」。功能模块划分那一节,就是这套系统实际实现的功能清单。你二次开发时,先对着开题报告把已有功能勾一遍,再决定加什么。比如开题报告里写了「绩效管理包括员工工资和奖惩记录」,但没写「绩效考核指标自定义」,那你想加这个功能,就得从performance表开始改,加字段、改 DAO、改 JSP。

我一般会这样做:把开题报告里的功能点抄到一张纸上,每实现一个就打个勾。改到一半发现某个功能牵涉太多表,就停下来评估工作量,别硬上。

5.2 用演示视频定位交互细节

演示视频是这套资源里最容易被忽略的部分。代码能告诉你「有什么功能」,但视频能告诉你「这些功能怎么用」。比如考勤模块,视频里会展示管理员怎么选月份、怎么导出统计结果。你二次开发时,如果改了查询逻辑,可以对着视频看交互有没有变。另外,视频里的操作路径能帮你快速定位对应的 JSP 页面和 Servlet 映射,比翻代码快得多。

5.3 数据库表结构的扩展与兼容

想加新功能,大概率要动数据库。老项目的表结构通常比较紧凑,加字段时要注意默认值和兼容性。比如给employee表加一个email字段,如果直接ALTER TABLE employee ADD COLUMN email VARCHAR(100) NOT NULL,已有数据会报错,因为没给默认值。正确做法是ALTER TABLE employee ADD COLUMN email VARCHAR(100) DEFAULT NULL,或者先加字段再更新数据。

-- 安全的加字段方式 ALTER TABLE employee ADD COLUMN email VARCHAR(100) DEFAULT NULL COMMENT '员工邮箱'; -- 如果需要非空,先加默认值,再改约束 UPDATE employee SET email = 'unknown@company.com' WHERE email IS NULL; ALTER TABLE employee MODIFY COLUMN email VARCHAR(100) NOT NULL;

参数说明:DEFAULT NULL允许字段为空,COMMENT是字段注释,方便后期维护。MODIFY COLUMN改约束前,必须确保没有 NULL 值,否则会报错。

改完数据库,记得同步改 JavaBean 里的属性、DAO 里的 SQL、JSP 里的表单字段。少改一处,页面就会报错或者数据存不进去。这种「改一处漏三处」的情况,我踩过不止一次,后来养成了习惯:每次改表结构,先在纸上列出所有涉及的文件,改完一个划掉一个。

5.4 从 JSP 到前后端分离的渐进式改造思路

如果你想让这套系统看起来「现代一点」,不用推倒重来。渐进式改造的路径是:先把 JSP 里的 Java 脚本片段抽到 Servlet 里,让 JSP 只负责展示;再把 Servlet 返回的数据改成 JSON 格式;最后前端用 Ajax 请求 JSON 数据,JSP 只留一个空壳。这样改完,后端逻辑没变,但前端已经可以换成 Vue 或 React 了。

// 改造后的前端请求示例 fetch(`${contextPath}/employee/list`) .then(response => response.json()) .then(data => { // 用 data 渲染表格,不再依赖 JSP 脚本片段 renderTable(data); }) .catch(error => console.error('请求失败:', error));

逻辑说明:fetch请求后端接口,后端返回 JSON 数组。renderTable是前端渲染函数,可以用原生 JS 或者框架实现。参数说明:contextPath是项目根路径,从 JSP 里传到 JS 变量。这个改造的关键是后端 Servlet 要改成输出 JSON,而不是转发到 JSP。

从那以后我每次拿到这种老项目,都先跑一遍「数据库导入 → 连接配置 → Tomcat 部署 → 页面访问」这条链路,确认能跑通再动代码。跑不通就先排查环境,别急着改逻辑。希望帮到你。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询