JavaEE 环境与程序设计 · 交互课程
技术演进接力链(M1 → M9)
  1. 1WEB 基础
    HTTP / Browser / WebServer
    静态页面写死,人人看到一样
  2. 2Servlet
    手写 if-else 分发不可扩展,无生命周期/并发管理
  3. 3JSP:参数散字符串
    参数散成一堆 String,取值靠字段名硬记
  4. 3JSP:scriptlet 塞逻辑
    scriptlet 把逻辑塞进页面,代码与 HTML 糊在一起
  5. 3JavaBean:数据对象化
    对象全靠 new、层层硬依赖
  6. 4Spring IoC
    Web 路由仍手写 web.xml/if-else、手动取参绑定,展示/业务/数据访问没分开
  7. 5MVC · SpringMVC
    数据在库里,访问是重复样板 + 拼串有注入风险
  8. 6MySQL
    Java 连库要手写五步,连接与资源管理全手动
  9. 7JDBC
    SQL 与 Java 混写、结果集逐行手映射、没有动态 SQL
  10. 8MyBatis
    四份配置 + web.xml 装配繁琐,部署要外部 Tomcat
  11. 9SpringBoot
    链尾 · 不考核

综合应用:SSM 人事管理系统

承接上一章的死结
承接 M10 的 SSM 整合能力,本章把它落进一个完整的人事管理系统(综合示例 / 实验八)。

综合应用:SSM 人事管理系统

目标:以一个真实的人事管理系统为例,完整走一遍 SSM 开发 WEB 应用的流程——需求分析 → 数据库表设计 → 四层开发(实体 → Mapper+XML → Service → Controller)→ 配置文件总览 → 部署测试。本章是模块1–10 知识点的综合落地,也是实验八的开工指南。

一、需求分析:三大功能模块

人事管理系统按需求分析拆成三个业务模块:用户登录、部门管理、员工信息管理。每个模块都按 SSM 四层模式开发。下面的功能地图把每个功能点与真实工程 SHrmSSM01B(workspace-ssm/SHrmSSM01B)里的代码落点一一对应,并标注实现状态:

人事管理系统功能地图(SHrmSSM01B)

已实现(5)进行中(1)待实现(3)

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)

二、数据库表设计(shrmssm.sql)

数据库 shrmssm,两张表:

表字段类型说明
tbl_deptdept_idint(11) PK 自增部门编号
tbl_deptdept_namevarchar(20)部门名称
tbl_deptdept_leadervarchar(20)部门负责人
tbl_empemp_idint(11) PK 自增员工编号
tbl_empemp_namevarchar(20)员工姓名
tbl_empemp_emailvarchar(30)邮箱
tbl_empgenderchar(2)性别(M/F)
tbl_empdepartment_idint(11)逻辑外键 → tbl_dept.dept_id

两个教学要点:

三、四层开发走查(以部门管理为例)

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>

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 响应
}

3. 业务层与实体层(同款模式)

四、配置文件总览(SHrmSSM01B)

文件职责关键点
web.xml容器入口ContextLoaderListener → applicationContext.xml;DispatcherServlet → springmvc.xml;三个 Filter(编码 / 登录校验 / 退出)
applicationContext.xmlSpring 根容器component-scan com.hrms(exclude-filter 排除 @Controller)+ import MyBatis.xml
MyBatis.xml持久层配置dataSource(druid) / sqlSessionFactory / SqlSessionTemplate(BATCH) / MapperScannerConfigurer(basePackage=com.hrms.mapper)
springmvc.xmlWeb 子容器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 指对即可。

五、系统测试与部署

  1. 把 shrmssm.sql 导入 MySQL(建库 shrmssm + 两张表 + 示例数据)。
  2. Eclipse 中构建 SHrmSSM01B,产物放入 Tomcat 的 webapps/(或 WTP 自动部署),启动 Tomcat 8.5 / 9。
  3. 访问 http://localhost:8080/<应用名>/ → welcome-file 直接进登录页;登录后进入主页面。
  4. 验证部门管理:分页列表 / 编辑(已实现);新增 / 删除(待实现,实验八任务)。

下面复用 CRUD SQL 可视化工具,练习为 tbl_dept / tbl_emp 表编写增删改查语句(内置模型是留言板表,SQL 语法与人事系统完全一致):

交互实验:CRUD 增删改查实时演示(CRUDVisualizer)

executeUpdate / executeQuery

在内存里的 guestbook(留言板)表上直接试 CRUD:点预设或自己写一条 SQL(INSERT / UPDATE / DELETE / SELECT), 点「执行」——新增行变绿、修改行变黄、删除的行红色划掉,受影响行数像 executeUpdate() 一样返回。

共 3 行 · id 自动编号

guestbook 表(当前状态)

id自动编号userid用户 IDusername昵称title留言标题contents留言内容
1u001tomfrom tom大家好,这是我的第一条留言。
2u002jerryRe: from tom很高兴认识你,tom!
3u003lucy课程很棒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 综合应用(本章)

讨论问题

  1. SHrmSSM01B 为什么没有建用户表?如果要补一个「用户管理」模块,四层各要改什么?
  2. 删除部门前为什么要先检查其下有无员工?这个逻辑应该写在 Service 层的哪个方法里、怎么加事务?
  3. 本工程的 MyBatis.xml 与模块10 的 mybatis-config.xml 有什么区别?最终是哪个文件决定了「MyBatis 用哪份配置」?
  4. JSP 放在 WEB-INF 下有什么好处?如果把 login.jsp 挪到 WebContent 根目录,安全性会受什么影响?
  5. SqlSessionTemplate 的 BATCH 模式与默认 SIMPLE 模式有何不同?什么场景下 BATCH 更有优势?

学习测验

学习小测验

Q1

开发一个完整的 SSM 人事系统,第一步应该做什么?

Q2

SHrmSSM01B 中定义 tbldept / tblemp 两张表的文件是

Q3

DepartmentMapper.xml 里 resultMap 的作用是

Q4

SHrmSSM01B 中 MapperScannerConfigurer 扫描的 Mapper 接口包是

Q5

MyBatis.xml 中 SqlSessionTemplate 配置了 executorType=BATCH,它是

Q6

人事系统部署到 Tomcat 时,WEB 应用应放在哪个目录?

链尾 / 收束
整条技术演进链 + 三大贯穿示例在此全部落地。下一章为可选进阶。