- 1WEB 基础HTTP / Browser / WebServer静态页面写死,人人看到一样
- 2Servlet手写 if-else 分发不可扩展,无生命周期/并发管理
- 3JSP:参数散字符串参数散成一堆 String,取值靠字段名硬记
- 3JSP:scriptlet 塞逻辑scriptlet 把逻辑塞进页面,代码与 HTML 糊在一起
- 3JavaBean:数据对象化对象全靠 new、层层硬依赖
- 4Spring IoCWeb 路由仍手写 web.xml/if-else、手动取参绑定,展示/业务/数据访问没分开
- 5MVC · SpringMVC数据在库里,访问是重复样板 + 拼串有注入风险
- 6MySQLJava 连库要手写五步,连接与资源管理全手动
- 7JDBCSQL 与 Java 混写、结果集逐行手映射、没有动态 SQL
- 8MyBatis四份配置 + web.xml 装配繁琐,部署要外部 Tomcat
- 9SpringBoot链尾 · 不考核
综合应用:SSM 人事管理系统
综合应用:SSM 人事管理系统
目标:以一个真实的人事管理系统为例,完整走一遍 SSM 开发 WEB 应用的流程——需求分析 → 数据库表设计 → 四层开发(实体 → Mapper+XML → Service → Controller)→ 配置文件总览 → 部署测试。本章是模块1–10 知识点的综合落地,也是实验八的开工指南。
一、需求分析:三大功能模块
人事管理系统按需求分析拆成三个业务模块:用户登录、部门管理、员工信息管理。每个模块都按 SSM 四层模式开发。下面的功能地图把每个功能点与真实工程 SHrmSSM01B(workspace-ssm/SHrmSSM01B)里的代码落点一一对应,并标注实现状态:
人事管理系统功能地图(SHrmSSM01B)
SHrmSSM01B 是实验八的「进行中」工程:登录与部门分页/编辑已落地,新增/删除与员工模块四层开发待补全——功能地图既是需求分析素材,也是实验八的工作清单。
打开站点直接进入登录页(welcome-file),提交用户名/密码表单。
- 配置
WebContent/WEB-INF/web.xml<welcome-file>把 /WEB-INF/jsp/login.jsp 设为启动页
- 表现层
src/com/hrms/controller/LoginController.javalogin()/hrms/login(GET)返回视图名 login
- 表现层
WebContent/WEB-INF/jsp/login.jsplogin.jsp登录表单(username / password)
- 用户登录:welcome-file 启动页 →
LoginController的 login / dologin / main / logout;当前账号校验是内存里的简单比较(尚无用户表)。 - 部门管理:
tbl_dept+DepartmentMapper.xml(resultMap deptResult / selectDeptsByLimitAndOffset / updateDeptById)+ 各 JSP 页面。 - 员工管理:
tbl_emp已建表(11 条示例数据),四层开发留给学生按部门管理同款模式补全。
二、数据库表设计(shrmssm.sql)
数据库 shrmssm,两张表:
| 表 | 字段 | 类型 | 说明 |
|---|---|---|---|
| tbl_dept | dept_id | int(11) PK 自增 | 部门编号 |
| tbl_dept | dept_name | varchar(20) | 部门名称 |
| tbl_dept | dept_leader | varchar(20) | 部门负责人 |
| tbl_emp | emp_id | int(11) PK 自增 | 员工编号 |
| tbl_emp | emp_name | varchar(20) | 员工姓名 |
| tbl_emp | emp_email | varchar(30) | 邮箱 |
| tbl_emp | gender | char(2) | 性别(M/F) |
| tbl_emp | department_id | int(11) | 逻辑外键 → tbl_dept.dept_id |
两个教学要点:
- 逻辑外键:
department_id没有声明物理 FOREIGN KEY(MyISAM 不支持),一致性由应用逻辑保证——删除部门前必须先处理其下员工。 - 用户表尚未创建:登录模块目前在
LoginController.dologin()里做简单比较;扩展成「用户管理」(建 user 表 + 查询校验)是实验八的后续任务。
三、四层开发走查(以部门管理为例)
1. 持久层:DepartmentMapper.xml
<resultMap id="deptResult" type="com.hrms.bean.Department">
<id property="deptId" column="dept_id"/>
<result property="deptName" column="dept_name"/>
<result property="deptLeader" column="dept_leader"/>
</resultMap>
<select id="selectDeptsByLimitAndOffset" resultMap="deptResult">
SELECT * FROM tbl_dept LIMIT #{offset}, #{limit}
</select>
<update id="updateDeptById" parameterType="com.hrms.bean.Department">
UPDATE tbl_dept SET dept_name = #{deptName}, dept_leader = #{deptLeader}
WHERE dept_id = #{deptId}
</update>
resultMap的type指向实体类(实体层);列名与属性名显式映射,下划线/驼峰不匹配也不怕。#{}预编译绑定防 SQL 注入;LIMIT #{offset}, #{limit}实现分页。
2. 表现层:LoginController 模式
@Controller
@RequestMapping("/hrms")
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login() { return "login"; } // 视图名 → /WEB-INF/jsp/login.jsp
@RequestMapping(value = "/dologin", method = RequestMethod.POST)
@ResponseBody
public JsonMsg dologin(String username, String password) { ... } // JSON 响应
}
@Controller+ 类级@RequestMapping("/hrms"):类前缀 + 方法路径,组成完整 URL。- 返回
String→ 视图名(由 jspViewResolver 解析);加@ResponseBody→ 直接把对象写成 JSON。
3. 业务层与实体层(同款模式)
- 实体:
com.hrms.bean.Department(deptId / deptName / deptLeader,与 resultMap 一一对应)。 - Service:
@Service封装业务 +@Transactional管理事务——例如「删除部门前先查该部门下有无员工」。 - Mapper 接口:
com.hrms.mapper.DepartmentMapper,由 MapperScannerConfigurer 扫描注册。
四、配置文件总览(SHrmSSM01B)
| 文件 | 职责 | 关键点 |
|---|---|---|
| web.xml | 容器入口 | ContextLoaderListener → applicationContext.xml;DispatcherServlet → springmvc.xml;三个 Filter(编码 / 登录校验 / 退出) |
| applicationContext.xml | Spring 根容器 | component-scan com.hrms(exclude-filter 排除 @Controller)+ import MyBatis.xml |
| MyBatis.xml | 持久层配置 | dataSource(druid) / sqlSessionFactory / SqlSessionTemplate(BATCH) / MapperScannerConfigurer(basePackage=com.hrms.mapper) |
| springmvc.xml | Web 子容器 | mvc:annotation-driven / component-scan com.hrms.controller / jspViewResolver(/WEB-INF/jsp/*.jsp) |
对照提示:本工程命名是
MyBatis.xml+springmvc.xml,而模块10 的 GuestBookSSM 叫mybatis-config.xml+springmvc-servlet.xml——名字不同、职责完全一样。实际项目里文件名可以自定,只要 web.xml 指对即可。
五、系统测试与部署
- 把
shrmssm.sql导入 MySQL(建库 shrmssm + 两张表 + 示例数据)。 - Eclipse 中构建 SHrmSSM01B,产物放入 Tomcat 的
webapps/(或 WTP 自动部署),启动 Tomcat 8.5 / 9。 - 访问
http://localhost:8080/<应用名>/→ welcome-file 直接进登录页;登录后进入主页面。 - 验证部门管理:分页列表 / 编辑(已实现);新增 / 删除(待实现,实验八任务)。
下面复用 CRUD SQL 可视化工具,练习为 tbl_dept / tbl_emp 表编写增删改查语句(内置模型是留言板表,SQL 语法与人事系统完全一致):
交互实验:CRUD 增删改查实时演示(CRUDVisualizer)
executeUpdate / executeQuery在内存里的 guestbook(留言板)表上直接试 CRUD:点预设或自己写一条 SQL(INSERT / UPDATE / DELETE / SELECT), 点「执行」——新增行变绿、修改行变黄、删除的行红色划掉,受影响行数像 executeUpdate() 一样返回。
guestbook 表(当前状态)
| id自动编号 | userid用户 ID | username昵称 | title留言标题 | contents留言内容 |
|---|---|---|---|---|
| 1 | u001 | tom | from tom | 大家好,这是我的第一条留言。 |
| 2 | u002 | jerry | Re: from tom | 很高兴认识你,tom! |
| 3 | u003 | lucy | 课程很棒 | JDBC 时序图讲得很清楚。 |
executeUpdate(sql)(返回受影响行数,不返回结果集); 查 → executeQuery(sql)(返回 ResultSet,用 rs.next() 逐行读)。六、期末复习:全站知识图谱
M1 WEB基础 → M2 Servlet → M3 JSP·JavaBean
→ M4 Spring(IoC/DI) → M5 SpringMVC
→ M6 MySQL → M7 JDBC → M8 MyBatis
→ M9 SpringBoot(接力链收口,不纳入考核)
↓
M10 SSM整合 → M11 综合应用(本章)
- 各模块课程页随堂测验 + 分章汇总题库(
/quiz/bank)可用于自测。 - 期末模拟卷(
/quiz/final):覆盖 10 个考核模块共 40 题(M9 SpringBoot、M12 进阶不纳入考核),提交后即时判分、逐题讲解——考前用它做一次全面体检。
讨论问题
- SHrmSSM01B 为什么没有建用户表?如果要补一个「用户管理」模块,四层各要改什么?
- 删除部门前为什么要先检查其下有无员工?这个逻辑应该写在 Service 层的哪个方法里、怎么加事务?
- 本工程的
MyBatis.xml与模块10 的mybatis-config.xml有什么区别?最终是哪个文件决定了「MyBatis 用哪份配置」? - JSP 放在 WEB-INF 下有什么好处?如果把 login.jsp 挪到 WebContent 根目录,安全性会受什么影响?
- SqlSessionTemplate 的 BATCH 模式与默认 SIMPLE 模式有何不同?什么场景下 BATCH 更有优势?
学习测验
学习小测验
开发一个完整的 SSM 人事系统,第一步应该做什么?
SHrmSSM01B 中定义 tbldept / tblemp 两张表的文件是
DepartmentMapper.xml 里 resultMap 的作用是
SHrmSSM01B 中 MapperScannerConfigurer 扫描的 Mapper 接口包是
MyBatis.xml 中 SqlSessionTemplate 配置了 executorType=BATCH,它是
人事系统部署到 Tomcat 时,WEB 应用应放在哪个目录?