SSM框架
SSM 框架是 Java Web 开发中广泛使用的经典组合,由 Spring、Spring MVC 和 MyBatis 三个开源框架整合而成,适用于构建中大型企业级应用。
1. SSM框架组成
框架 | 作用 | 核心特性 |
---|---|---|
Spring | 管理业务层(Service)和持久层(DAO)的对象依赖关系(IoC)和事务(AOP) | 依赖注入(DI)、面向对象编程(AOP)、声明式事务管理、模块化设计 |
Spring MVC | 处理Web层的请求分发、视图渲染、遵循MVC设计模式 | 基于注解的控制器(@Controller)、灵活的路由配置(@RequestMapping)等 |
MyBatis | 负责数据持久化,简化数据库操作(SQL映射) | XML/注解配置SQL、动态SQL、结果集映射、与Spring无缝集成 |
2. SSM框架工作流程
- 用户请求 → 由DispatcherServlet(Spring MVC前端控制器)接收
- 请求分发 → 根据@RequestMapping找到对应的Controller
- 业务处理 → Controller调用Service层(Spring管理的业务逻辑)
- 数据操作 → Service层通过DAO/Mapper接口(MyBatis实现)访问数据库
- 返回结果 → Controller将处理结果封装为ModelAndView或JSON,渲染视图(JSP/HTML)返回客户端
3. 三层结构(表现层、业务层、持久层)
3.1 表现层(Web层)
- 对应框架:Spring MVC
- 核心作用:处理用户请求和响应,控制页面跳转和数据交互。
- 关键组件:
- Controller:接收 HTTP 请求,解析参数,调用业务层处理,返回视图或数据。
- View(视图层):渲染页面(如 JSP、HTML等)。
- DispatcherServlet:Spring MVC 的前端控制器,负责请求分发。
3.2 业务层(Service层)
- 对应框架:Spring
- 核心作用:实现业务逻辑,处理事务管理,协调多个数据操作(如数据库和缓存)。
- 关键组件:
- Service 接口与实现类:定义业务方法,调用持久层完成数据操作。
- 事务管理:通过
@Transactional
注解实现声明式事务(如回滚、传播行为)。
3.3 持久层(DAO/Mapper层)
- 对应框架:MyBatis
- 核心作用:直接操作数据库,执行 SQL 语句,完成数据的增删改查(CRUD)。
- 关键组件:
- Mapper 接口与 XML 文件:定义数据库操作方法,通过 MyBatis 动态代理实现。
- 实体类(POJO):映射数据库表结构(如
User
类对应user
表)。
4. SSM整合
项目根目录:
ssm-project/
├── src/
│ ├── main/
│ │ ├── java/ # 核心Java源代码
│ │ ├── resources/ # 配置文件及资源
│ │ └── webapp/ # Web应用资源
│ └── test/ # 单元测试代码
├── pom.xml # Maven项目配置
4.1 src/main/jave目录:
存放Java业务代码,按分层架构组织。
com.example.ssm
├── controller/ # Spring MVC控制器(处理HTTP请求)
├── service/ # 业务逻辑层接口
│ └── impl/ # 业务逻辑层实现类
├── dao/ # 数据访问层接口(MyBatis Mapper接口)
├── entity/ # 实体类(对应数据库表)
├── dto/ # 数据传输对象(Data Transfer Object)
├── util/ # 工具类(如日期处理、字符串处理)
└── config/ # Java配置类(替代XML配置,可选)
-
Controller:接收请求参数,调用Service层返回结果,转发视图。
-
Service:实现业务逻辑,处理事务管理(通过Spring声明式事务)。
-
Dao/Mapper:定义数据库操作接口,由MyBatis动态代理实现。
4.2 src/main/resources目录:
存放配置文件和非Java资源。
resources/
├── spring/ # Spring核心配置
│ ├── applicationContext.xml # Spring主配置(数据源、事务等)
│ └── spring-mvc.xml # Spring MVC配置(拦截器、视图解析器等)
├── mybatis/ # MyBatis配置
│ ├── mybatis-config.xml # MyBatis全局配置(可选)
│ └── mapper/ # MyBatis XML映射文件(SQL语句)
├── db.properties # 数据库连接配置
└── log4j2.xml # 日志配置文件
-
Spring配置:定义数据源
DataSource
、事务管理器TransactionManager
、组件扫描等。 -
MyBatis配置:配置
SqlSessionFactory
,指定Mapper XML文件位置。 -
属性文件:解耦数据库连接信息,便于环境切换。
4.3 src/main/webapp目录:
Web应用根目录,存放静态资源和WEB-INF配置。
webapp/
├── WEB-INF/
│ ├── web.xml # 部署描述符(配置DispatcherServlet)
│ └── views/ # 视图文件(JSP/Thymeleaf等)
├── static/ # 静态资源(CSS/JS/图片)
└── index.jsp # 默认首页
-
web.xml:配置Spring MVC的前端控制器
DispatcherServlet
,指定Spring配置文件位置。 -
视图层:JSP或其他模板引擎文件,由视图解析器定位。
-
静态资源:通过
<mvc:resources/>
配置直接访问。
4.4 src/test目录:
存放单元测试代码和测试资源。
-
JUnit测试:对Service、DAO层进行单元测试,使用
@ContextConfiguration
加载Spring配置。 -
测试资源:可单独配置测试数据库(如H2内存数据库)。
4.5 POM.XML文件:
Maven项目核心配置,管理依赖和构建流程。
<dependencies>
<!-- Spring Core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- MyBatis-Spring整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- 数据库驱动(如MySQL) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!-- 数据源(如C3P0) -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.0.2</version>
</dependency>
<!-- JSTL支持 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
4.6 关键整合点
- Spring与MyBatis整合:
-
配置
SqlSessionFactoryBean
,注入数据源和Mapper XML路径。 -
使用
MapperScannerConfigurer
自动扫描DAO接口生成代理类。
-
- Spring MVC配置:
-
启用注解驱动
<mvc:annotation-driven/>
。 -
配置视图解析器
InternalResourceViewResolver
。
-
- 事务管理:
-
在
applicationContext.xml
中配置DataSourceTransactionManager
,通过@Transactional
注解管理事务。
-
5. 常见问题
❓ Service 层和 DAO 层都要写接口吗?
- 最佳方法:Service 层建议写接口(方便后续扩展或 AOP 代理),DAO 层可省略接口(MyBatis Mapper 接口已由框架动态代理实现)。
❓ 实体类(如 User)属于哪一层?
- Model 层:贯穿所有层,但不归属任何框架。DTO(数据传输对象)和 VO(视图对象)可根据场景补充。
❓ 如何避免跨层调用?
- 禁止 Controller 直接调用 Mapper,必须通过 Service 层协调(确保事务和逻辑完整性)。
结束啦,去继续学习SpringBoot了~