简介:基于JSP的企业人事管理系统毕业设计资料包,面向Java Web方向的高校学生和入门开发者,能够满足毕业设计选题、编码实践与报告撰写三项需求。系统完整覆盖用户权限、人事档案、考勤、薪酬、绩效、报表等典型业务模块,采用Servlet与JSP配合MVC分层结构,并通过数据库实现数据持久化。
压缩包整体仅3.18MB,包含277个文件,其中104个JSP页面、14个Java源文件与28个class字节码文件构成主体代码,辅以CSS、JavaScript、jpg/gif图片素材,以及doc项目报告、xml配置和mdf/ldf数据库文件,结构清晰,适合直接导入开发工具运行学习。目前已有51人学习下载。
配套项目报告对需求分析、数据库设计、功能实现与测试步骤具备较完整描述,对照源代码可快速理解登录鉴权、考勤统计、薪资计算、报表生成等核心逻辑,既可用于毕业设计答辩准备,也可作为Java Web综合开发实战参考。
1. 基于JSP的企业人事管理系统毕业设计与实现:这套源码到底能帮你什么
“基于jsp的企业人事管理系统毕业设计与实现(源代码+项目报告).zip”——这个压缩包几乎是Java方向毕设学生绕不开的站点。JSP这套技术栈早不算新了,但企业人事管理系统要做的员工信息管理、部门管理、考勤与薪资核算,恰好把Servlet、JSP、JDBC、MySQL这几样最“答辩友好”的内容串成了一条能完整演示的链路。它解决的问题很具体:让一个没完整做过Web系统的人,在两周内把数据库、后端逻辑和页面串成一套能跑的系统,同时附上一份能直接改的毕业设计报告。适合三类人:时间紧想快速出成果的、想拿完整系统改改再交差的、以及想搞懂JSP项目从部署到运行到底会踩哪些坑的。
2. 为什么是JSP:选型逻辑与企业人事管理系统的三层架构
2.1 毕设选JSP而不是Spring Boot:3个很现实的理由
先别急着说JSP“过时”。毕业设计的评价标准从来不只是技术新,而是“工作量够、逻辑对、能演示、能讲清楚”。常见做法里Spring Boot加Vue确实更时髦,但这条路线对零基础学生的门槛不低,前端的node、vite、跨域、打包任何一个环节卡住就是半天。而JSP项目在三方面有明显优势:一是环境固定,JDK加Tomcat就能跑,依赖极少;二是页面即文件,JSP里能直观看到HTML和Java代码怎么协作,答辩老师翻代码时不需要你解释一套复杂分层;三是报告好写,三层架构和MVC的对应关系在教科书里本来就是围绕JSP展开的,能把理论落到实际代码上。
第三个理由要展开说。很多学生最后卡住的不是程序,而是那份一万字的“项目报告”。用JSP的话,报告的技术背景可以写JSP生命周期,数据库部分可以写MySQL建表与JDBC操作,核心模块直接对照着DAO和Servlet讲,每一章都有实际代码可贴。用Spring Boot反而容易陷入“配置文件讲不清、starter原理答不上”的局面。技术选型不是选最先进的,是选你答辩时能从头讲到尾的。
2.2 三层架构的职责拆解:JSP到底站在哪一层
这类系统最常见的分层是JSP、Servlet、DAO三层,选这个结构不是为了赶时髦,而是让人事管理系统的每个请求都有清晰的落点。JSP负责展示员工列表、部门信息、考勤表这些页面;Servlet负责接收表单参数、做权限判断、控制页面跳转;DAO层用JDBC连接MySQL执行SQL并返回结果。控制权握在Servlet手里,JSP里不应该出现大段业务逻辑,否则后面改需求时寸步难行。
一个请求的典型链路是这样的:浏览器打开login.jsp填写账号密码,表单提交到LoginServlet,Servlet调用UserDAO查询数据库校验,成功后把用户信息写进session并重定向到系统主页。这条链路每一环都是常规操作,但能把整条链讲清楚的人并不多。下面这张表我习惯在写代码前先列出来,模块与职责对应清楚再动手:
| 层 | 典型文件 | 职责 | 不应该做的事 |
|---|---|---|---|
| JSP视图层 | login.jsp、emp_list.jsp、dept_edit.jsp | 表单呈现、列表展示、EL表达式输出 | 不写JDBC、不做权限判断 |
| Servlet控制层 | LoginServlet、EmpServlet | 参数校验、调用DAO、控制跳转 | 不写SQL、不拼HTML输出 |
| DAO数据层 | UserDAO、EmpDAO | 执行SQL、封装结果集到实体类 | 不处理页面跳转、不接收请求参数 |
| MySQL数据库 | user、emp、dept、attendance | 持久化存储 | 业务逻辑尽量别用存储过程 |
这张表直接贴进项目报告里也很加分,它直观说明了“每一层只干一件事”。我做这类项目时,会先用表格把模块拆清楚,因为人事系统看着简单,但员工、部门、用户、考勤、薪资几张表之间是有关联的,不先梳理好,写到一半容易发现少了个外键,回头再补就很被动。
2.3 数据库设计:员工、部门、用户、考勤、薪资5张核心表的建表方案
打开zip之后,通常解压出来会有源代码目录、数据库脚本目录和项目报告文档,也可能SQL脚本直接放在源代码的sql文件夹下。不管怎么组织,先找后缀为.sql的文件,那就是整套系统的地基。企业人事管理系统无论叫什么名字,核心模块都绕不开员工基本信息、部门、用户账号、考勤、薪资这五块,即便原项目功能更多、表更多,最底层的支撑也是这五类数据。
下面给出一个我在类似项目中常用的建表骨架,足以覆盖人事管理毕业设计的主体功能:
CREATE DATABASE IF NOT EXISTS hrms DEFAULT CHARACTER SET utf8mb4; USE hrms; CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL, role INT NOT NULL DEFAULT 1 COMMENT '1=普通员工, 2=管理员', emp_id INT DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE t_dept ( id INT PRIMARY KEY AUTO_INCREMENT, dept_name VARCHAR(100) NOT NULL, manager VARCHAR(50) DEFAULT NULL, remark VARCHAR(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE t_emp ( id INT PRIMARY KEY AUTO_INCREMENT, emp_no VARCHAR(20) NOT NULL UNIQUE, name VARCHAR(50) NOT NULL, gender TINYINT DEFAULT 1, birth DATE, phone VARCHAR(20), dept_id INT, entry_date DATE, salary_base DECIMAL(10,2) DEFAULT 0.00, status TINYINT DEFAULT 1 COMMENT '1=在职, 0=离职', CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id) REFERENCES t_dept(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE t_attendance ( id INT PRIMARY KEY AUTO_INCREMENT, emp_id INT NOT NULL, att_date DATE NOT NULL, status TINYINT DEFAULT 0 COMMENT '0=正常, 1=迟到, 2=早退, 3=缺勤', CONSTRAINT fk_att_emp FOREIGN KEY (emp_id) REFERENCES t_emp(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE t_salary ( id INT PRIMARY KEY AUTO_INCREMENT, emp_id INT NOT NULL, month VARCHAR(7) NOT NULL, base_pay DECIMAL(10,2), bonus DECIMAL(10,2), deduct DECIMAL(10,2), CONSTRAINT fk_sal_emp FOREIGN KEY (emp_id) REFERENCES t_emp(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO t_dept(dept_name, manager) VALUES ('技术部', '王明'), ('人事部', '李娜'); INSERT INTO t_user(username, password, role) VALUES ('admin', MD5('123456'), 2);有几个细节值得单独说。数据库统一用utf8mb4而不是utf8,因为utf8mb4能完整存储中文和特殊字符,防止员工姓名中有生僻字时乱码。user表里的emp_id是外键但非必填,这样管理员账号可以不绑定具体员工。员工号emp_no设为唯一键,它是考勤、薪资关联员工的主口径。密码字段用MD5,毕设答辩足够用了,但如果老师追问安全性,可以回答生产环境会换成BCrypt加盐——这个回答很加分。
注意一点:如果拿到手的项目已经建好了库,先不要急着加字段。应该先把原系统跑通,登录进去看看哪些功能能用,再按自己的需求加表。改表结构前务必将原SQL脚本另存一份,这是给自己留后悔药。改崩了能一键还原,比任何恢复技巧都可靠。
3. 导入Eclipse与本地跑通:环境版本匹配、数据库准备和部署细节
3.1 先看清压缩包里有什么:源代码加报告的项目组织形态
下载解压后先看目录,不要急着双击任何文件。“源代码+项目报告”这种交付形态,通常压缩包里会有源代码目录、数据库脚本目录,以及一份Word格式的毕业设计报告。先确认三件事:有没有.sql文件、有没有README或说明文档、项目是基于Eclipse还是IDEA导出的结构。
这一步很多人会跳过直接导入,结果环境对不上,白折腾一晚上。我的经验是:先打开项目根目录下的.classpath和.project文件(Eclipse导出的话),确认JDK版本和项目类型;再打开WebContent/WEB-INF/web.xml,看Servlet的映射规则。web.xml是项目的路由地图,里面那些带url-pattern的配置如果和页面表单的提交地址对不上,登录时就必然404。
如果压缩包里没有现成的Eclipse工程文件,可以新建一个Dynamic Web Project,把源代码目录里的Java文件拷进src,把JSP和静态资源拷进WebContent,最后把jar包放进WEB-INF/lib。这一步本身不难,但jar包版本之间会互相影响,后面连接MySQL报驱动错误,八成是驱动版本太老或和MySQL大版本不匹配。
3.2 数据库脚本导入:用命令行方式避开字符集陷阱
许多学生习惯用图形化工具把SQL文件直接拖进去执行,但图形化工具经常因为默认字符集和SQL文件本身的编码不一致,导入后中文变成问号。我一般推荐直接用MySQL命令行导入,流程固定、报错直接,能少绕很多弯。
mysql -u root -p source /your_path/hrms.sql; show tables; SELECT * FROM t_user;source命令后面的路径,Windows下如果路径里有反斜杠,建议改成正斜杠,否则MySQL解析路径可能出错。导入后先用show tables确认五张核心表都建出来了,再查一下t_user里有没有初始化的管理员账号。如果SQL文件里没有包含CREATE DATABASE这一句,那就先手动建库、执行use命令切换,再source文件,不然会报“No database selected”。
还有一种常见翻车点:SQL脚本里建表语句带有外键,导入时表的创建顺序不对,会提示找不到父表。解决办法是查看脚本开头有没有SET FOREIGN_KEY_CHECKS = 0,没有的话自己先执行一次,导入完成再改回1。这个坑看着吓人,实际就是一条命令的事,遇到别慌。
3.3 JDBC连接配置:换数据库、换密码时改这一处就够了
数据库就绪后,重点是把项目里的JDBC连接信息指向你自己的MySQL。这类JSP项目的连接配置一般集中在jdbc.properties文件里,也有的直接写在DBUtil工具类中。建议尽量用properties文件管理,代码只负责读配置,将来换库、换密码、换端口都不用动Java代码。
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/hrms?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai jdbc.username=root jdbc.password=123456这四行配置里每个参数都有讲究。driver用com.mysql.jdbc.Driver还是com.mysql.cj.jdbc.Driver,取决于你装的驱动包版本,MySQL 5.7配老驱动、MySQL 8.0必须用带cj的那一个,否则启动即报ClassNotFoundException。url里的characterEncoding=utf8解决存中文乱码,serverTimezone=Asia/Shanghai解决MySQL 8连接时的时间时区报错,useSSL=false告诉JDBC本地开发无需证书校验,能省掉一堆握手警告。
配置改完后,把项目部署到Tomcat。Eclipse里右键项目选Run As、再选Run on Server,IDEA里配置好Tomcat后点运行。正常启动后浏览器访问http://localhost:8080/项目名/login.jsp,能看到登录页就说明整条链路通了。这里项目名取决于打包名和部署方式,访问路径不对时看Tomcat启动日志里的部署记录,里面会打印出明确的上下文路径。
如果没有IDE环境,也可以把WebContent目录直接拷进Tomcat的webapps目录,重启Tomcat后静态页面能访问,但Servlet需要编译才能生效,登录功能大概率会失败。所以还是建议用IDE管理部署,手动拷目录只适合临时验证页面效果。
4. 人事管理系统核心模块改法:登录、员工列表与部门管理的代码实现
4.1 登录模块:先跑通这个入口再动其他代码
拿到一台年久失修的JSP人事系统源码,不要从头到尾读一遍。先从登录模块入手,理由很简单:登录是系统入口,能跑通就同时验证了数据库连接、Servlet映射、JSP跳转三层都正常,这个链路通了,后面所有模块的信心就都有了。一个标准的登录逻辑长这样:
@WebServlet("/login") public class LoginServlet extends HttpServlet { private UserDAO userDAO = new UserDAO(); protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); if (username == null || password == null || username.isEmpty()) { req.setAttribute("error", "用户名和密码不能为空"); req.getRequestDispatcher("/login.jsp").forward(req, resp); return; } User user = userDAO.findByUsernameAndPassword(username, password); if (user != null) { HttpSession session = req.getSession(); session.setAttribute("loginUser", user); session.setMaxInactiveInterval(30 * 60); resp.sendRedirect(req.getContextPath() + "/emp/list"); } else { req.setAttribute("error", "用户名或密码错误"); req.getRequestDispatcher("/login.jsp").forward(req, resp); } } }这段代码有几个关键点值得细看。req.setCharacterEncoding必须在读取任何参数之前设置,放到后面等于没设。userDAO返回的是User实体对象而不是boolean,这样登录成功后能直接把整个用户对象放进session,JSP页面用EL表达式取姓名、角色都方便。密码校验在SQL中同时带username和password两个条件,这是最常见也最简单的做法。
session.setMaxInactiveInterval把会话超时设成30分钟,是容易被忽略的参数。不设置的话,超时时间跟随Tomcat全局配置,答辩演示时如果中途停顿很久再操作,可能被莫名其妙踢回登录页。我一般都会显式设置,并把超时值和理由写进项目报告,答辩时能多一个安全细节的加分项。
登录成功用sendRedirect而不是forward,目的是避免浏览器刷新时重复提交登录表单。这个细节在答辩演示时很容易被老师操作出来,提前处理掉能少一次现场翻车。JSP表单里的action地址要和@WebServlet注解里的路径一致,不一致就是404,排查思路第一条先看这个。
4.2 员工列表模块:分页查询与JSP页面渲染
员工列表是人事系统的门面。这里不建议用全量查询,因为数据一多页面就会卡。答辩老师如果随口问一句“数据量大了怎么办”,用分页的同学就能接上话。分页是成本最低、收益最明显的优化手段,代码也不难:
public List<Emp> findByPage(int pageNum, int pageSize, String keyword) { StringBuilder sql = new StringBuilder( "SELECT e.id, e.emp_no, e.name, e.gender, e.phone, d.dept_name, e.entry_date " + "FROM t_emp e LEFT JOIN t_dept d ON e.dept_id = d.id WHERE 1=1"); List<Object> params = new ArrayList<>(); if (keyword != null && !keyword.trim().isEmpty()) { sql.append(" AND (e.name LIKE ? OR e.emp_no LIKE ?)"); params.add("%" + keyword + "%"); params.add("%" + keyword + "%"); } sql.append(" LIMIT ?, ?"); params.add((pageNum - 1) * pageSize); params.add(pageSize); return queryList(sql.toString(), params); }参数上要留意两点:pageNum从1开始,计算偏移量时要减1,写成pageNum乘pageSize就会丢失第一页的数据,这是最常见的分页错误。LIKE查询的%关键字%必须放进预编译参数里,直接拼SQL字符串会引发SQL注入,写报告时把这条安全意识写进去,算加分项。LEFT JOIN部门表是为了在列表页直接显示部门名称,不JOIN就要每条员工记录再查一次部门,产生N+1次查询,这又是一个能写进报告的性能话题。
列表页在JSP里用EL表达式和JSTL循环输出,不要在页面里写Java的for循环:
<c:forEach items="${page.list}" var="emp"> <tr> <td>${emp.empNo}</td> <td>${emp.name}</td> <td>${emp.gender == 1 ? '男' : '女'}</td> <td>${emp.deptName}</td> <td> <a href="emp/detail?id=${emp.id}">查看</a> <a href="emp/edit?id=${emp.id}">编辑</a> <a href="emp/delete?id=${emp.id}" onclick="return confirm('确认删除?')">删除</a> </td> </tr> </c:forEach>这里用${emp.deptName}而不是${emp.deptId},页面展示给用户的是文本而不是外键数字。删除操作加了onclick确认弹窗,一行代码的事,但少了它,老师演示时手一抖删掉一条数据,现场就很尴尬。员工详情页或个人信息展示页面可以复用这套结构,把字段换成更详细的档案信息即可。
4.3 加一个部门管理模块:照已有代码风格扩展,不要另起炉灶
拿到别人的项目后,最常遇到的需求是“加一个模块”。很多人的第一反应是从网上找教程里的写法另起炉灶,结果和原项目风格冲突,原项目用DAO,新模块把SQL写在JSP里,答辩老师看到这种代码风格不统一会提出质疑。正确做法是照着原项目已有的结构复制一个完整模块,我一般按“DAO加Servlet加JSP页面”三个文件的模式去扩展,再逐段替换业务字段。
新增部门管理模块只需要四步:先在DeptDAO里写t_dept表的增删改查方法,再写DeptServlet处理list、add、edit、delete四个动作,接着建dept_list.jsp和dept_edit.jsp两个页面,最后在系统左侧菜单加上入口。考勤模块稍微复杂一点,涉及按日期批量插入和查重,但只要记住“插入前先查询当天是否已存在”这一个原则,核心逻辑就是普通JDBC操作。
扩展时最忌讳直接照搬而不理解。例如原项目员工表用status字段表示在职或离职,新考勤模块又建一个在职状态字段,两边不同步,离职员工照样能打考勤。这种逻辑冲突很难排查,因为编译不报错,运行时表现时好时坏,看上去像玄学问题,本质是数据口径不统一。动手前画一张简单的模块关联图,哪怕写在纸上,都能避开大部分这类坑。
5. JSP企业人事管理系统避坑:5个让新手原地翻车的高频问题
5.1 现象:Tomcat启动正常却始终404
启动日志没有报错,浏览器里输入地址却一直404,这是拿到旧项目后最常见的问题。首因是上下文路径不对,项目在IDE里部署后访问地址一般是http://localhost:8080/项目名/,直接访问http://localhost:8080/自然打不开。Tomcat的规则是根路径属于Root应用,其他每个项目都挂在项目名路径下,少写这段就404。也有可能是JSP文件放在WebContent根目录下,而web.xml里配置的welcome-file指向一个不存在的index.jsp。
解决办法是先看Tomcat启动日志里的部署记录,确认上下文路径是什么。再把浏览器地址栏和跳转代码里的地址逐一对比,特别关注重定向代码写的是绝对路径还是相对路径。前端页面中以/开头的资源路径指向服务器根目录,会直接绕开项目路径,这是老项目里另一个404重灾区。
5.2 现象:登录后中文变成问号
中文乱码有3层独立原因,必须分开排查。第一层是页面编码,JSP文件的pageEncoding必须统一为UTF-8,meta标签里的charset也要是UTF-8,两处不一致时浏览器按meta解析,中文就会乱。第二层是请求参数编码,Servlet读取参数前没执行req.setCharacterEncoding("UTF-8"),POST提交的中文就变乱码;GET请求乱码则是Tomcat的URIEncoding默认问题,可以在Tomcat的server.xml的Connector配置上增加URIEncoding="UTF-8"。第三层是数据库编码,连接串没有characterEncoding=utf8,或表和库本身是latin1,数据入库时就已经是乱码。
排查顺序建议从后往前:先在MySQL命令行直接插入一条中文记录,如果显示正常说明库没问题;再用一个最简单的JSP页面输出中文字符串,如果页面正常说明Tomcat没问题;最后才查Servlet传参。逐层定位比一次改一堆配置更有效,每次只改一个地方测一次,这样即使问题解决了,你也知道是哪一层的修复起了作用。
5.3 现象:JDBC连接数据库报Communications link failure
这个报错是新手高发区,但它背后的原因高度集中。最常见的是MySQL服务根本没启动,Windows下服务管理器中MySQL显示停止状态,代码逻辑再对也连不上。其次是端口不对,MySQL默认3306,但不少人的机器装过多个数据库版本或改过端口,连接串里依然写3306就必然失败。还有一种情况是MySQL 8.0的认证插件为caching_sha2_password,老版本JDBC驱动不支持,报错信息中会明确提到Public Key Retrieval。
解决方式分三步。先在命令行执行mysql -u root -p,能进说明服务正常,再用show variables like 'port';确认端口。然后用一个最简单的Java测试类单独连接一次数据库,排除掉项目本身的问题。最后核对驱动jar包版本,MySQL 8选mysql-connector-java-8.0.x,不要混用5.x的驱动。这类问题本质是环境版本组合问题,和业务代码无关,所以先怀疑环境、再怀疑代码,别一上来就翻DAO。
5.4 现象:表单提交后按F5,数据重复插入
JSP页面提交后如果网络稍慢,用户习惯性按F5刷新,最直接的结果是同一条数据被插入两次。原因在于表单的POST请求还留在浏览器历史里,刷新会重新执行最后一次POST。解决思路有两个,一个是在Servlet处理完新增请求后立刻sendRedirect跳转到列表页,也就是常说的Post/Redirect/Get模式,让刷新时最后一次请求变成GET而不是POST;另一个是表单提交前用JavaScript禁用按钮,阻止用户连续点击。这两种做法我都会同时做,因为redirect防的是主动刷新,禁用按钮防的是双击提交。
这个坑在答辩演示时出现概率极高,老师一上来就会到处点。如果代码里已经处理了重复提交,可以在讲解时主动提一句,属于“我踩过坑所以提前处理了”的高光回答。特别提醒:新增和编辑共用一个Servlet时,处理完保存逻辑后要区分跳转场景,不要提交完成又走一遍查询逻辑。
5.5 现象:项目拷到别的电脑或服务器上就跑不起来
JSP项目在A电脑上一切正常,复制到B电脑就各种报错,原因绝大多数是路径写死和本地环境依赖。比如数据库连接串里把路径写成了C:/software/mysql,换台机器当然不存在;JSP页面引入CSS或JS用/img/logo.png这种根路径写法,项目名不同也会失效。处理这类问题要养成两个习惯:一是JDBC配置写到properties文件里,避免编译进代码;二是前端静态资源用${pageContext.request.contextPath}拼接相对路径,它能自动带上当前项目上下文,避免因部署路径不同而挂掉。
除了路径,还有MySQL的root密码不同、MySQL版本不同导致驱动不兼容、Tomcat版本不同导致Servlet注解不被扫描等。我一般会把源代码、SQL脚本和启动说明三样东西放在同一目录下,启动说明里写清JDK版本、MySQL版本、Tomcat版本、默认账号密码、项目名五个要素。这不仅是帮别人,也是帮半年后的自己。
6. 一个让毕设多加两分的小功能:给员工列表加Excel导出
到这里项目已经能跑,核心模块也都调通了。最后一个建议不是加复杂功能,而是加一个多数同学没有、但答辩老师会眼前一亮的小功能——把员工列表导出成Excel。用Apache POI是常见做法,把poi的jar包放进WEB-INF/lib,写一个不到六十行的Servlet即可:
resp.setContentType("application/vnd.ms-excel"); resp.setHeader("Content-Disposition", "attachment;filename=emp_list.xls"); HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("员工"); HSSFRow head = sheet.createRow(0); head.createCell(0).setCellValue("工号"); head.createCell(1).setCellValue("姓名"); // 遍历员工列表写入每一行 for (int i = 0; i < list.size(); i++) { HSSFRow row = sheet.createRow(i + 1); row.createCell(0).setCellValue(list.get(i).getEmpNo()); row.createCell(1).setCellValue(list.get(i).getName()); } wb.write(resp.getOutputStream()); wb.close();这个功能建议加的原因很直接:代码量边际成本低,但能展示你熟悉响应头和文件流的处理。很多老师会顺着问“导出大量数据时会不会内存溢出”,答案是换用SXSSFWorkbook写入临时文件,这一来一回就能把答辩深度从“会点功能”提升到“理解原理”。功能本身不复杂,价值在于把整套系统的完整度从“能查能改”提升到“能导出能交付”。
我自己做这类JSP毕设方向的项目,最大的一个教训是:功能宁可少而精。一个人事管理系统,把登录、员工档案、部门维护、考勤记录四件事做到稳定无bug,比硬塞一堆图表、待办、聊天室之类的炫技功能更稳妥。JSP项目的边界能力摆在那里,用最小的复杂度交付一个说得清的闭环,才是毕业设计的正路。每次拿到类似的源代码包,我也习惯先部署、再读代码、最后才动手改,这个顺序能省下至少一个通宵的折腾。希望帮到你。
本文还有配套的精品资源,点击获取