新闻详情

新闻详情

首页 / 资讯中心 / 详情

Java人事管理系统实战:JSP+Servlet+SqlServer全栈开发与部署指南

发布时间:2026/9/30 5:22:16来源:尧图网络
Java人事管理系统实战:JSP+Servlet+SqlServer全栈开发与部署指南
简介一份基于Java的企业人事管理系统设计文档面向计算机相关专业学生、毕业设计人员及初级Java开发者在课程设计、项目起步或方案借鉴时使用。文档依托MyEclipse平台采用JSPServlet技术并结合SqlServer2008数据库围绕企业人事部门日常管理中的人事档案、培训管理、职称评定、奖惩管理、人员调动等功能模块展开设计与说明。内容覆盖系统功能要求、可行性分析、非功能性需求、总体设计、实体属性图以及各模块的详细设计流程同时包含中英文摘要和完整目录结构可帮助读者从需求分析、数据库设计到模块实现形成清晰思路也能作为同类型系统设计与论文写作的参考模板。包内含1个doc文档压缩包大小约48KB轻量便于直接下载阅读目前已有80人学习。整个文档内容紧凑、模块划分明确特别适合需要快速获取人事管理系统设计框架的学习者。1. 基于 Java 的企业人事管理系统先搞清楚这份资源能落什么地做后台开发的人对这类“人事管理系统”并不陌生但真正能跑起来、能支撑毕业设计答辩和企业二次开发的完整工程远比想象中难得。这份基于 Java 的人事管理系统是一套全栈 Web 应用技术栈是 JSP Servlet SqlServer2008开发环境放在 MyEclipse 里直接就能部署。它覆盖了人事部门最常用的六条业务线——人员档案、培训信息、职称评定、奖惩记录、人员调动和系统权限管理对应数据库表和前端页面都是配套的。对有 Java 基础但想快速拿到一套可运行 demo 的开发者来说它能当课程设计模板也能当企业信息化改造的参考底座。你不需要再从头攒需求文档、设计数据库、画流程图重点应该放在“看懂它的边界改造成自己的东西”上。下面我从模块设计、表结构、核心代码到部署排错逐层拆开讲。2. 总体设计功能模块怎么拆后续实现才不会返工2.1 六大功能模块与页面流转关系这套系统在总体设计阶段先做了功能模块划分。里面最核心的一条原则是业务模块和系统模块分开业务模块管数据流转系统模块管入口和安全性。人员档案管理属于基础数据培训、职称、奖惩、调动都依赖档案中的员工编号所以数据库设计时员工表必须最先建立其他业务表通过外键关联。登录模块作为唯一的入口验证通过后跳到主界面主界面再按角色权限分发到六个子模块。页面流转顺序大致是这样登录页校验账号密码成功后写入 session跳转到主框架页主框架左侧是功能菜单右侧是内容区菜单点击后通过 iframe 加载对应模块的 JSP。每个业务模块的页面都遵循“列表页 → 新增/编辑页 → 保存后刷新列表”的三层结构。这套设计虽然朴素但胜在直观新手拿到源码后能顺着页面之间的跳转关系反推出控制器里的请求映射不用花太多时间在“这页面从哪来”上。模块拆分的另外一个好处是方便并行开发和后期维护。档案、培训、职称、奖惩、调动五个模块代码彼此独立只共享数据库连接和工具类。改奖惩模块的页面不会影响档案模块的逻辑这对二次开发非常友好。我接手这类项目时第一件事就是把功能模块和页面文件对照表列出来对照表里标清楚每个模块对应的 JSP 文件名、Servlet 路径和数据表后面所有改动都不会迷路。2.2 实体属性与数据表结构推断实体属性图是这套系统数据库设计的依据。员工档案实体的核心属性包括员工编号、姓名、性别、出生日期、学历、毕业院校、所属部门、入职日期、联系电话、家庭住址。培训实体包含培训编号、培训主题、培训时间、培训讲师、培训地点、参与员工、培训效果评价。职称评定实体需要记录员工编号、评定级别、评定时间、评定依据和审批状态。奖惩实体分为奖励和惩罚两类属性包括奖惩类型、奖惩原因、奖惩金额、登记日期、备注。部门调动实体记录员工编号、原部门、新部门、调动原因、调动日期、审批人。这些属性对应到 SqlServer2008 里就是六张核心表加上用户表共七张。用户表单独放是因为它只承担登录认证和密码管理的职责不参与具体业务查询。设计时把用户表和员工表分开后续如果要引入多角色权限只需要在用户表里加一个 role 字段不必改动业务表结构。表之间关联关系也要提前想清楚。员工表和培训表是一对多一个员工可以参加多次培训员工表和奖惩表是一对多员工表和调动表是一对多职称评定记录表通过员工编号关联员工档案每评定一次生成一条新记录保留历史数据。这种设计保留了完整的轨迹方便事后追溯。建议拿到源码后先看数据库脚本里的外键定义再对照实体属性图看一遍这样后续写 SQL 联查时脑子里会有清晰的表结构图。2.3 可行性分析与非功能性需求里被忽略的三件事系统分析章节通常写得比较模板化但里面有三个点直接影响了实现难度。第一是技术可行性Java 成熟生态、JSP 服务端渲染快、SqlServer2008 在 Windows 环境下部署简单这条结论决定了整个项目的技术选型。第二是操作可行性界面设计要面向非技术人员所以表单要带校验提示按钮名称要用业务语言而不用技术术语。第三是经济可行性这套系统只需要一台普通 PC 装好数据库和应用服务器就能跑硬件成本几乎可以忽略。非功能性需求往往被新手跳过但恰恰是答辩和验收问得最多的地方。响应时间要求常规操作三秒内返回这限定了列表页不能用太复杂的嵌套子查询安全性要求密码不能明文存储登录状态要失效自动跳转可用性要求系统支持并发登录数据库连接不能每次请求都新建。这些需求映射到代码里就三件事连接池管理、会话超时设置、输入校验。后面章节里讲代码时我会专门提到这三个点的落地方式。3. 数据库设计从逻辑模型到 SqlServer2008 建表脚本3.1 员工表与用户表的字段设计细节数据库设计是这套系统的地基SqlServer2008 在字段类型上有很多细节要注意。员工表被其他五张业务表反复关联主键选用自增数字型比字符串型更稳定。员工编号字段如果做成 varchar(20)后续联查时每次都要做隐式转换数据量大时性能会掉得厉害。常见做法是建一个 int 类型的自增主键把“员工编号”作为业务编号字段单独存加上唯一约束保证不重复。用户表与员工表设计上有区别。用户表只存账号、密码和角色账号用 varchar(20) 足够密码字段要注意长度。当时实现时密码走的是 MD5 摘要生成结果是 32 位十六进制字符串所以密码字段长度至少设为 32。如果后续要升级为加盐哈希长度建议直接预留到 64。这里有个容易被忽略的问题SqlServer2008 的 varchar 默认单字节编码如果存中文用户名长度按字符算但排序规则会影响大小写比较建表时排序规则要注意统一。3.2 培训、职称、奖惩、调动四张业务表的外键策略培训表以培训编号为主键员工编号做外键。这里要决策的是一次培训对应一条记录还是多个员工参加一次培训需要单独建中间表。这套系统采用的是前者即每条培训记录绑定一个员工好处是页面实现简单坏处是同一场培训要为每个员工各插入一条记录统计时有冗余。对课程设计量级的系统来说可接受。职称评定表记录每次评定结果包括员工编号、申报级别、评定日期、是否通过。奖惩表用类型字段区分奖励和惩罚金额字段允许为空因为有些奖惩是通报批评没有金额。调动表记录原部门和新部门注意还要保留调动原因字段。四张表都有一个共同点员工变动时只做插入新记录不做物理删除保证历史可追溯。这一点比“更新原记录”的做法更符合人事管理实际场景。3.3 建表脚本示例与连接字符串参数拿到资源后数据库脚本是最先要看的东西。建表脚本通常包含库创建、表创建、主外键约束和初始数据插入四部分。下面这段是员工表和用户表的简化建表脚本结构上保留了原设计的主要字段字段长度和约束按常见配置补全。CREATE DATABASE PersonnelDB; GO USE PersonnelDB; GO CREATE TABLE t_employee ( emp_id INT IDENTITY(1,1) PRIMARY KEY, emp_no VARCHAR(20) NOT NULL UNIQUE, emp_name NVARCHAR(20) NOT NULL, emp_gender CHAR(1) NOT NULL DEFAULT 男, emp_birth DATETIME, emp_degree NVARCHAR(20), emp_school NVARCHAR(50), emp_dept NVARCHAR(30), emp_entry_date DATETIME, emp_phone VARCHAR(20), emp_address NVARCHAR(100) ); GO CREATE TABLE t_user ( user_id INT IDENTITY(1,1) PRIMARY KEY, user_account VARCHAR(20) NOT NULL UNIQUE, user_password VARCHAR(32) NOT NULL, user_role VARCHAR(10) NOT NULL DEFAULT admin ); GO这段脚本里emp_id 用 IDENTITY 自增做主键保证每条员工记录有唯一物理标识emp_no 加 UNIQUE 约束隔离业务编号。性别字段用 CHAR(1) 而不是 BIT是因为页面下拉框直接传中文值避免前后端类型转换的额外处理。密码字段长度定为 32对应 MD5 输出长度。如果你要改成 SHA-256记得把 user_password 长度改成 64。连接字符串方面SqlServer2008 默认端口是 1433本地部署时 JDBC 连接串写法如下注意 databaseName 参数区分大小写服务器名要跟你的实例名一致。String url jdbc:sqlserver://localhost:1433;databaseNamePersonnelDB;encryptfalse; String user sa; String password your_password;前面这段代码是 JDBC 驱动的标准连接参数。encryptfalse 这个参数在 SqlServer2008 上必传否则新版驱动可能默认开启加密导致握手失败。用户名使用 sa 还是 Windows 认证要看安装时怎么配置如果用 Windows 认证url 里还要加上 integratedSecuritytrue 并加载对应 dll。建议开发环境直接用 SQL Server 身份验证省掉一堆本地权限问题。4. 核心模块实现从登录校验到五个业务模块的具体代码4.1 登录模块Session 控制与密码摘要处理登录模块是整个系统的安全闸门。实现逻辑是登录页提交账号密码 → Servlet 接收参数 → 查询用户表 → 密码转 MD5 摘要与库中比对 → 比对成功写入 Session → 跳转主界面。这里有两个细节。第一密码不能明文存储代码里要先把用户输入的密码转成摘要再比对。第二登录成功后的用户信息要放进 Session后续页面的权限判断都从 Session 里取不能每次都查数据库。登录失败的提示信息用 request scope 带回到登录页避免刷新后重复提交。登录校验的简化写法如下重点看密码处理和 Session 写入位置。WebServlet(/login) public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String account request.getParameter(account); String password request.getParameter(password); // MD5摘要注意加盐逻辑需要额外拼接 String encrypted MD5Util.md5(password); UserDao dao new UserDao(); User user dao.findByAccountAndPassword(account, encrypted); if (user ! null) { HttpSession session request.getSession(); session.setAttribute(loginUser, user); session.setMaxInactiveInterval(1800); response.sendRedirect(main.jsp); } else { request.setAttribute(errorMsg, 账号或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } } }参数说明MD5Util.md5 是工具类中封装好的摘要生成方法入参是原始字符串返回 32 位小写十六进制串。setMaxInactiveInterval(1800) 是会话超时时间单位是秒1800 秒即半小时无操作自动失效。查询走的是 UserDao.findByIdAndPwd内部用 PreparedStatement 防注入这个细节很关键。如果你看到代码里用的是 Statement 字符串拼接一定要改成 PreparedStatement这是老系统常见的注入隐患。4.2 人员档案管理列表分页与增删改查实现档案模块是数据量最大的页面所以列表必须做分页。实现方式有两种一种是用 SQL 的 ROW_NUMBER() 分页另一种是查出全部数据后在内存里 slice。这套系统用的是接近 PageBean 的封装方式先按页码算出起始行和结束行再拼接查询条件。分页参数有三个当前页码 pageNo、每页条数 pageSize、总记录数 totalCount。翻页时前端传递 pageNo后端根据总记录数计算总页数列表底部渲染上一页和下一页按钮。档案新增和编辑共用一个 JSP 页面通过表单里的 hidden 字段区分是新增还是修改。判断依据是 empId 是否为空。提交后先做前端必填校验再用 request.getParameter 逐字段接收封装成 Employee 对象后交给 DAO 层保存。修改操作要先按 id 查一次数据库把原有数据回显到表单用户改完再执行 update。常见错误是新增和修改用同一个 SQL导致有 id 时 insert 报主键冲突。代码实现时注意分支逻辑里 insert 语句不出现 empIdupdate 语句的 where 条件必须带 empId两者分开写。4.3 培训和职称评定业务流程的状态字段驱动培训管理模块和档案模块的区别在于它多了一个“状态”。一场培训从报名、进行中到结束状态字段用整数存储0 表示未开始1 表示进行中2 表示已结束。列表页默认只显示未结束的培训已结束的记录折叠到历史列表避免主页面被无效数据刷屏。新增培训时要把日期格式统一建议用 yyyy-MM-dd避免年月日顺序混淆。讲师和地点字段允许为空因为有些内部培训没有外部讲师地点可能在线上会议室。职称评定模块比培训模块多一层审批语义。员工申报后记录状态为“待审批”管理员登录后能看到待审批列表点击通过后状态改为“已通过”同时把评定数据写入员工档案表。这里要特别注意事务控制更新评定状态和更新员工职称是两个操作必须放在同一个事务里要么都成功要么都失败。ResourceBundle 里用 Connection.setAutoCommit(false) 开启事务业务操作完成后 commitcatch 到异常后 rollbackfinally 里关资源。4.4 奖惩和调动模块写历史记录而不是覆盖原数据奖惩模块页面结构最简单列表 新增 删除但删除操作建议做软删。因为奖惩历史涉及员工信用记录直接物理删除会让后续审计查不到痕迹。常见做法是加一个 is_deleted 字段删除时执行 update 而不是 delete。列表查询默认带 is_deleted 0 条件。这个小改动在答辩时可以讲清楚属于加分项。人员调动模块实现时要动两张表调出部门的员工列表要移除该员工调入部门的员工列表要增加该员工。但这个系统里部门没有独立的组织结构表部门只是员工表中的一个字段所以调动操作的核心就是更新员工表的 emp_dept 字段同时在调动表里插入一条调动记录。页面设计上选择员工后自动带出原部门新部门用下拉框选择提交后先更新员工表再插入调动记录。两步操作同样需要事务包裹重点关注先更新后插入的逻辑顺序。4.5 修改密码模块旧密码校验与重复提交控制修改密码模块是独立于六大业务模块之外的功能但最容易出问题。逻辑上要校验三步旧密码是否正确、新密码是否和旧密码相同、确认密码是否一致。旧密码校验同样要先 MD5 摘要再比对不能拿明文直接查库。新密码不能和旧密码相同这个校验放在后端做而不是只在页面做因为绕过前端直接 POST 接口也能改密码。重复提交控制容易被忽略。用户在页面上连续点两次“保存”按钮会产生两条修改记录。常见做法是提交按钮点击后立即 disable同时后端判断新旧密码是否相同相同则拒绝执行并提示“新密码不能与旧密码相同”。这两个防线叠加后重复提交的脏数据问题基本能防住。资源里的实现在详情页上用的是第一种方案你想加固可以补上第二种。5. 避坑排查SqlServer2008 环境下最常见的六个翻车现场5.1 驱动版本不匹配导致登录页 500现象部署完成后打开登录页正常输入账号密码点击登录页面直接报 500控制台日志显示 ClassNotFoundException错误信息指向 sqljdbc4.jar 或者 com.microsoft.sqlserver.jdbc.SQLServerDriver。原因系统里用的是 SqlServer2008但 JDBC 驱动 jar 包版本太老或太新。SqlServer2008 R2 官方对应的是 sqljdbc4.jar新的 sqljdbc9 或 sqljdbc10 对 Java 版本有要求部分驱动默认开启加密策略和 2008 实例握手失败后抛异常。代码里加载驱动用的类名不同也会报这个错。解决确认几件事。JDK 版本如果是 1.7 或 1.8用 sqljdbc4.jar 最稳。驱动类名统一写成 com.microsoft.sqlserver.jdbc.SQLServerDriver。把 jar 包放到 WebContent/WEB-INF/lib 目录下并且确认构建路径里包含这个目录。检查后重启 Tomcat 再试。5.2 数据库连接串里缺 encryptfalse 导致握手失败现象项目控制台输出“The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption.”数据库能通但应用连不上。原因新版 JDBC 驱动在连接字符串里默认启用 encrypted connection而 SqlServer2008 的加密配置和默认安全协议不支持这个握手方式。解决连接 URL 里显式加上 encryptfalse;。如果驱动版本较低但问题依旧检查是否同时存在多个版本的 sqljdbc jar 冲突清理掉多余的驱动包。再不行就把 url 里的服务器名改成 localhost避免主机名解析时走 IPv6 导致超时。5.3 JSP 页面中文乱码三处编码不一致问题现象页面标题正常但员工姓名、部门名称显示成问号或者新增记录里的中文提交到数据库后变成乱码。原因典型的编码不一致问题。JSP 页面默认是 ISO-8859-1浏览器提交中文时 POST 体是 UTF-8 编码但 Servlet 里没有调用 setCharacterEncoding导致接收参数时按 ISO-8859-1 解码。数据库端字段类型如果是 varchar 而非 nvarchar中文字符存储时会截断。解决要在三处统一编码。页面顶部加 pageEncodingUTF-8Servlet 里在读取任何参数之前执行 request.setCharacterEncoding(UTF-8)数据库表里所有存中文的字段用 nvarchar 类型。修改完代码后强制刷新浏览器缓存避免旧页面继续用错误的编码集。5.4 Tomcat 版本和 JDK 版本不兼容的玄学报错现象项目在 MyEclipse 里运行正常但导出 WAR 包放到另一台电脑的 Tomcat 上就启动失败日志里有 java.lang.UnsupportedClassVersionError。原因本地编译用的 JDK 版本比部署环境的 Tomcat 运行版本高。比如 MyEclipse 里配的是 JDK 1.8目标机器的 Tomcat 7 内置运行环境是 1.6 或 1.7编译产物是 52.0 版本字节码老版本 JVM 不识别。解决部署前用 java -version 确认服务器 JDK 版本再用 javac -source 1.7 -target 1.7 重新编译全部源码或者直接把 MyEclipse 里的编译器 compliance level 调到和目标环境一致。如果目标机器上装的是 JDK 1.8 却仍报错检查 Tomcat 的 setclasspath.bat 里 JAVA_HOME 是否指向了正确路径。5.5 Session 丢失导致每次点击都跳回登录页现象登录成功进入主界面点击任一菜单或刷新页面后立刻回到登录页没有任何报错提示。原因最常见是会话超时时间设置过短或者 Cookie 的 context path 不对导致浏览器不保存 sessionId。有些部署方式把项目 ROOT 改成了自定义路径session 的 cookie 只在原路径下有效访问新路径时重新分配了 session。解决在 web.xml 里显式配置 session-timeout 参数值设置为 30 或更长。项目部署路径统一用根路径或者把 session 的 cookie path 设置为 /。排查时先打开浏览器开发者工具查看请求响应头里是否有 JSESSIONID 这个 cookie如果没有说明 session 创建失败问题在 session 配置而非页面代码。5.6 SqlServer2008 的 sa 登录被禁用现象连接数据库时报“用户 sa 登录失败”但确认密码没输错服务也能连上。原因SqlServer2008 安装时默认只开了 Windows 身份验证模式或者 sa 账号本身被禁用。数据库能连上但因为服务器没开混合认证SQL Server 身份验证的账号全部无法登录。解决SQL Server Management Studio 里用 Windows 认证登录右键服务器选属性安全性选项卡改成“SQL Server 和 Windows 身份验证模式”再展开安全 → 登录名 → sa右键选属性状态页面把“启用”勾上。改完重启 SQL Server 服务。这个操作需要管理员权限部署到不归自己管的服务器时提前和 DBA 沟通。6. 进阶把系统从课程设计改造成可演示的可用项目拿到这套资源后光能跑还不够得让它看起来像个能“上生产”的系统。我每次拿到类似项目都会先做一轮指定动作把硬编码的数据库配置抽离到 properties 文件给登录模块加验证码把列表页改成异步刷新。数据库配置抽离的改动量很小收益却很高。原项目里 JDBC 连接串直接写在 DAO 层代码里换一台机器部署就要改源码重新编译。改成 db.properties 文件后只需要改一行配置文件重启 Tomcat。可以把配置文件的读取封装成静态代码块加载逻辑写成这样static { 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); }这段代码的核心作用是在类加载时一次性读取配置文件。后续 getConnection 方法直接使用这四个静态变量数据源变动的成本降为零。关于连接管理我还要补一句老项目如果能看到每次操作都创建 Connection 的坏味道就顺手改成连接池方式。最简单不过度的方案是用 Apache DBCP不需要引入 Spring也能把响应时间降下来。我从那以后每次接手这类 JSP 老项目第一件事就是检查连接资源和 Session 生命周期这两处确保改完再动业务代码这套流程帮我在无数次部署中绕开了重复踩坑也希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

一句话复刻爆款视频:腾讯 WorkBuddy + 开源 Hypit 小白保姆级教程 2026/9/30 7:21:40

一句话复刻爆款视频:腾讯 WorkBuddy + 开源 Hypit 小白保姆级教程

最近跨境圈和自媒体圈都在传一个玩法:把一条爆款视频丢给 AI,它帮你复刻出一条同款。 听起来像玄学,其实已经落地了——用腾讯的桌面 AI 助手 WorkBuddy,加一个开源项目 Hypit,你只需要发一段话、再发一段话&#xff…

阅读更多 →
hot100——矩阵 2026/9/30 7:21:40

hot100——矩阵

矩阵置零 73. 矩阵置零 - 力扣(LeetCode) 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&…

阅读更多 →
Heric锁相环和电流环路反馈角度的关系 2026/9/30 7:21:40

Heric锁相环和电流环路反馈角度的关系

问题:在仿真时发现并网逆变器环路控制与角度强相关,当PLL锁相采用q轴电压时,此时id若乘以sin,则系统无法有效控制功率;若id乘以cos,则系统可以通过环路控制。可在绝大多数的文献中,环路中常常用…

阅读更多 →
二分查找系列一 2026/9/30 7:21:40

二分查找系列一

前言 二分查找属于最恶心,细节最多,最容易写出死循环的算法。但是同是也是很简单的算法,因为有模板而且很容易学会。主要应用与数组有序或者无序(有规律)的情况下。 模板主要是朴素二分模板、查找左边界的二分模板、查找右边界的二分模板。…

阅读更多 →
Git实战指南:从零开始高效协作开发 2026/9/30 7:21:40

Git实战指南:从零开始高效协作开发

最近实习对git使用有感,所以写一个git使用流程记录一下。以及配合使用SourceTree推拉代码流程。1. 第一次获取代码1.1. 获取仓库权限每个公司都有自己的代码仓库,我们要获取公司的代码就得去跟管理员申请一个账号。比如说GitLab的话,公司给你…

阅读更多 →
编排层成为主战场,一致性从训练问题变成工程问题|2026年09月29日 2026/9/30 7:21:33

编排层成为主战场,一致性从训练问题变成工程问题|2026年09月29日

谷歌研究把长视频生成拆成四个智能体框架,试图用持久视觉记忆解决身份漂移与级联失败[① MarkTechPost];AWS 上周正式发布 CloudWatch Omni,把可观测性问题从「它还在运行吗」改写为「智能体为什么那样做」[② SiliconANGLE AI];推…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉