【基于轻量型架构的WEB开发】课程 第14章 SSM框架整合 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis

第14章 SSM框架整合

学习目标/Target

  • 了解SSM框架的整合思路
  • 熟悉SSM框架整合时的配置文件内容
  • 掌握SSM框架整合应用程序的编写

章节概述/ Summary
对于Java EE应用程序的开发,行业中提供了非常多的技术框架,但是不管如何进行
技术选型,Java EE应用都可以分为 表现层 、 业务逻辑层 和 数据持久层 ,当前,这3个层的
主流框架分别是 Spring MVC 、 Spring 和 MyBatis ,简称为SSM框架,Java EE应用程序
也经常通过整合这3大框架来完成开发。SSM框架的整合有多种方式,本章将对图书完稿
时 常用的整合方式 和 纯注解的整合方式 来对SSM框架的整合进行讲解。


14.1 常用方式整合SSM框架

14.1.1****整合思路

了解常用方式整合思路,能够说出SSM框架整合的大致思路。

SSM框架整合时三层架构的分工

进行SSM框架整合时,3个框架的分工如下所示。

• MyBatis负责与数据库进行交互。

• Spring负责事务管理,Spring可以管理持久层的Mapper对象及业务层的Service对象。由于Mapper对象和Service对象都在Spring容器中,所以可以在业务逻辑层通过Service对象调用持久层的Mapper对象。

• Spring MVC负责管理表现层的Handler。Spring MVC容器是Spring容器的子容器,因此Spring MVC容器可以调用Spring容器中的Service对象。

SSM框架整合实现思路

下面通过一个图书信息查询案例来描述SSM框架的整合,案例实现思路如下。

• 搭建项目基础结构。首先需要在数据库中搭建项目对应的数据库环境;然后创建一个Maven Web项目,并引入案例所需的依赖;最后创建项目的实体类,创建三层架构对应的模块、类和接口。

• 整合Spring和MyBatis。在Spring配置文件中配置数据源信息,并且将SqlSessionFactory对象和Mapper对象都交由Spring管理。

• 整合Spring和Spring MVC。Spring MVC是Spring框架中的一个模块,所以Spring整合Spring MVC只需在项目启动时分别加载各自的配置即可。

14.1.2****项目基础结构搭建

熟悉 项目基础结构搭建 ,能够独立完成SSM框架的基础结构搭建。

接下来,根据14.1.1中的整合思路搭建SSM框架整合的项目基础结构,具体如下所示。

STEP 01

搭建数据库环境 :MySQL数据库中创建一个名称为ssm的数据库,在该数据库中创建一个名
称为tb_book的表,并在tb_book表中插入数据。创建数据库和表,以及往表中插入数据的

SQL语句如下所示。

sql 复制代码
CREATE DATABASE ssm;
USE ssm;
CREATE TABLE `tb_book` ( 
`id` int(11) ,
`name` varchar(32) ,
`press` varchar(32) ,
`author` varchar(32) ); 
INSERT INTO `tb_book` VALUES 
(1, 'Java EE企业级应用开发教程', '人民邮电出版社', '黑马程序员');

STEP 02

引入项目依赖:本案例中需要引入的相关依赖如下所示。
(1) Spring相关依赖 。spring-context : Spring上下文;spring-tx : Spring事务管理;
spring-jdbc : SpringJDBC;spring-test : Spring单元测试;spring-webmvc : Spring
MVC核心。
(2) MyBatis相关依赖 。mybatis : MyBatis核心;
(3) MyBatis与Spring整合包 。mybatis-spring :MyBatis与Spring整合。
(4) 数据源相关 。druid : 阿里提供的数据库连接池。
(5) 单元测试相关的依赖 。junit : 单元测试,与spring-test放在一起做单元测试。
(6) ServletAPI相关的依赖 。jsp-api : jsp页面使用request等对象;servlet-api : java文
件使用request等对象。
(7) 数据库相关的依赖 。mysql-connector-java : mysql的数据库驱动包。

STEP 03

创建实体类:创建名称为Book的实体类。

java 复制代码
public class Book {
private Integer id; //图书id
private String name; //图书名称
private String press; //出版社
private String author; //作者
 // 省略getter/setter方法
}

STEP 04

创建三层架构对应模块的类和接口 :
(1)创建名称为BookMapper的持久层接口,在BookMapper接口中定义findBookById()方法,通过图书id获取对应的图书信息。

java 复制代码
package com.itheima.dao;
import com.itheima.domain.Book;
public interface BookMapper {
    public Book findBookById(Integer id);
}

(2)创建BookMapper接口对应的映射文件 BookMapper.xml。

XML 复制代码
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper 
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.BookMapper">
<!--根据id查询图书信息 -->
<select id="findBookById" parameterType="int"
resultType="com.itheima.domain.Book">
select * from book where id = #{id}</select>
</mapper>

(3)创建名称为BookService的业务层接口,在BookService接口中定义findBookById()方法,通过id获取对应的Book信息。

java 复制代码
package com.itheima.service;
import com.itheima.domain.Book;
public interface BookService {
    public Book findBookById(Integer id);
}

(4)创建BookService接口的业务层实现类BookServiceImpl。BookServiceImpl类实现BookService接口的findBookById()方法。

java 复制代码
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookMapper bookMapper;
    public Book findBookById(Integer id) {
        return bookMapper.findBookById(id);
    }
}

(5)创建名称为BookController的类。在BookController类中注入一个BookService对象,并且定义一个名称为findBookById()的方法。

java 复制代码
@Controller
public class BookController {@Autowired
    private BookService bookService;
    @RequestMapping("/book")
    public ModelAndView findBookById(Integer id){
        Book book = bookService.findBookById(id);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("book.jsp");
        modelAndView.addObject("book",book); return modelAndView; 
    }
}

(6)至此,项目基础结构已经搭建完成,项目基础结构如图所示。

14.1.3 SpringMyBatis****整合

掌握 Spring和Mybatis整合 ,能够在项目中进行Spring和MyBatis的整合操作。

Spring和MyBatis的整合步骤

Spring和MyBatis的整合可以分为2步来完成,首先搭建 Spring环境 ,然后 整合MyBatis到Spring环境 中。框架环境包含框架对应的依赖和配置文件,其中Spring的依赖、MyBatis的依赖、Spring和MyBatis整合的依赖,在项目基础结构搭建时候已经引入到项目中了,接下来,只需编写Spring的配置文件、Spring和MyBatis整合的配置文件即可。

Spring的配置文件

创建配置文件application-service.xml,用于配置Spring对Service层的 扫描信息 。application-service.xml具体代码如下所示。

java 复制代码
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
...>
<!--开启注解扫描, 扫描包-->
<context:component-scan base-package="com.itheima.service"/>
</beans>

Spring和MyBatis整合的配置

Spring和MyBatis的整合包中提供了一个 SqlSessionFactoryBean 对象,该对象的Bean需要注入数据源,也可以根据需求在SqlSessionFactoryBean的Bean中配置 MyBatis核心文件路径 、 别名映射 和 Mapper映射文件路径 。

创建数据源属性文件jdbc.properties,jdbc.properties配置的数据源信息如下所示。

java 复制代码
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true
&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=root

整合测试

创建名称为BookServiceTest的测试类,用于对Spring和MyBatis的整合进行测试。

java 复制代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:application-service.xml",
"classpath:application-dao.xml"})
public class BookServiceTest {
@Autowired private BookService bookService;
@Test
 public void findBookById() {
Book book = bookService.findBookById(1);
// 输出语句输出:图书id、图书名称、作者、出版社,省略
}}

结果测试

运行测试方法findBookById(),方法运行后控制台打印信息如图所示。

从图中所示的信息可以看出,程序打印出了id为1的图书信息。这表明测试类中成功装配了BookService对象,BookService对象成功调用Service层的findBookById()方法,Service层的findBookById()方法成功调用Dao层的findBookById()方法完成了数据查询。说明Spring和MyBatis已经整合成功。

14.1.4 SpringSpring MVC****整合

掌握Spring和SpringMVC整合,能够在项目中进行Spring和Spring MVC的整合操作。

Spring的配置

之前Spring和MyBatis整合时,已经完成了Spring的配置文件,Spring和Spring MVC

整合,只需在项目启动时加载Spring容器和Spring的配置文件即可。在项目的web.xml文件

中配置Spring的监听器来加载Spring容器及Spring的配置文件,具体配置如下所示。

XML 复制代码
<context-param> <param-name>contextConfigLocation</param-name>
    <param-value>classpath:application-*.xml</param-value>
</context-param>
<listener> <listener-class>
org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Spring MVC的配置

本案例主要测试SSM整合的情况,因此在Spring MVC的配置文件中只配置SSM整合

案例必须的配置。必须配置的项有以下2个。

• 配置包扫描,指定需要扫描到Spring MVC中的Controller层所在的包路径。

• 配置注解驱动,让项目启动时启用注解驱动,并且自动注册HandlerMapping和HandlerAdapter。

在项目的src\main\resources目录下创建Spring MVC的配置文件spring-mvc.xml。

Spring-mvc.xml文件配置完成之后,在web.xml中配置Spring MVC的前端控制器,并在初

始化前端控制器时加载Spring MVC的配置文件。

整合测试

(1)创建名称为book.jsp的文件,用于展示处理器返回的图书信息。

XML 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>图书信息查询</title></head><body>
<table border="1">
<tr><th>图书id</th><th>图书名称</th>
    <th>出版社</th><th>作者</th></tr>
<tr><td>${book.id}</td><td>${book.name}</td>
    <td>${book.press}</td>
    <td>${book.author}</td></tr>
</table></body>
</html>

(2)将chapter14项目部署到Tomcat中,启动项目,在浏览器中访问地址http://localhost:8080/book?id=1来进行图书查询,页面显示效果如图所示。

从图中所示的信息可以看出,程序成功查询到了id为1的图书信息。表明Controller层成功将Service层获取的图书信息返回给页面了,由此可以得出SSM框架整合成功。

14.2 纯注解方式整合SSM框架

14.2.1****整合思路

了解整合思路-纯注解方式,能够说出配置类所需要替代的XML配置文件。

application-dao.xml

application-dao.xml配置文件中配置的内容包含以下4项。

• 读取jdbc.properties文件中的数据连接信息。

• 创建Druid对象,并将读取的数据连接信息注入到Druid数据连接池对象中。

• 创建SqlSessionFactoryBean对象,将并将Druid对象注入到SqlSessionFactoryBean对象中。

• 创建MapperScannerConfigurer对象,并指定扫描的Mapper的路径。

application-service.xml和spring-mvc.xml

application-service.xml配置文件中只配置了包扫描,指定需要扫描到Spring 的Service层所在的包路径。spring-mvc.xml配置文件中配置了Spring MVC扫描的包路径和注解驱动。

web.xml

web.xml配置文件配置了项目启动时加载的信息,包含如下3个内容。

• 使用<context-param>元素加载Spring配置文件application-service.xml和Spring整合Mybatis的配置文件application-dao.xml。

• Spring容器加载监听器。

• 配置Spring MVC的前端控制器。

14.2.2纯注解SSM****框架整合

掌握 SSM框架整合-纯注解方式 ,能够使用纯注解方式整合SSM框架。
接下来,将项目中的XML配置文件删除,使用纯注解的配置类依次替换对应的XML文件内容,以完成纯注解的SSM框架整合。具体实现步骤如下所示。

STEP 01

创建名称为JdbcConfig的类,用于获取数据库连接信息并定义创建数据源的对象方法,并定义getDataSource()方法,用于创建DruidDataSource对象。

java 复制代码
@PropertySource("classpath:jdbc.properties") 
public class JdbcConfig { 
// 下面为使用注入的形式。定义dataSource的bean,省略 
@Value("${jdbc.driverClassName}") 
private String driver; 
@Value("${jdbc.url}") 
private String url; 
@Value("${jdbc.username}") 
private String userName; 
@Value("${jdbc.password}") 
private String password; 
}

STEP 02

创建名称为MyBatisConfig的类,在MyBatisConfig类中定义getSqlSessionFactoryBean() 方法,用于创建SqlSessionFactoryBean对象并返回

java 复制代码
public class MyBatisConfig {
// 定义MyBatis的核心连接工厂bean
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(
@Autowired DataSource dataSource){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setDataSource(dataSource); return ssfb; }
// 定义MyBatis的映射扫描,省略
}

STEP 03

创建名称为SpringConfig的类作为项目定义Bean的源头,并扫描Service层对应的包。

java 复制代码
@Configuration
@Import({MyBatisConfig.class,JdbcConfig.class})
// 等同于<context:component-scan base-package="com.itheima.service">
@ComponentScan(value = "com.itheima.service")
// 将MyBatisConfig类和JdbcConfig类交给Spring管理
public class SpringConfig {
}

STEP 04

创建名称为SpringMvcConfig的类作为Spring MVC的配置类,在配置类中指定Controller层的扫描路径。

java 复制代码
@Configuration
// 等同于<context:component-scan
// base-package="com.itheima.controller"/>
@ComponentScan("com.itheima.controller")
// 等同于<mvc:annotation-driven/>,还不完全相同
@EnableWebMvc
public class SpringMvcConfig {
}

STEP 05

创建名称为ServletContainersInitConfig的类,继承AbstractAnnotationConfigDispatcherServletInitializer抽象类,重写抽象类的方法。用于替代之前web.xml文件配置的信息 ,初始化Servlet容器时加载指定初始化的信息。

java 复制代码
public class ServletContainersInitConfig extends
AbstractAnnotationConfigDispatcherServletInitializer {
// 加载Spring配置类中的信息,初始化Spring容器
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class}; }
// 加载Spring MVC配置类中的信息,初始化Spring MVC容器
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class}; }
// 配置DispatcherServlet的映射路径
protected String[] getServletMappings() { return new String[]{"/"}; }}

AbstractAnnotationConfigDispatcherServletInitializer抽象类

重写AbstractAnnotationConfigDispatcherServletInitializer抽象类的3个方法。

• getRootConfigClasses()方法:将Spring配置类的信息加载到Spring容器中。

• getServletConfigClasses()方法:将Spring MVC配置类的信息加载到Spring MVC容器中。

• getServletMappings()方法:可以指定DispatcherServlet的映射路径。

STEP 06

启动chapter14项目,在浏览器中访问图书信息查询地址,地址为

http://localhost:8080/book?id=1,页面显示效果如图所示。

从图中所示的信息可以看出,程序成功查询到了id为1的图书信息。表明Controller将Service获取的图书信息成功返回给页面了,由此可以得出纯注解的SSM框架整合成功。

本章小结

本章主要讲解了SSM框架的整合知识。首先对常用方式整合SSM框架进行了讲解,包括
项目基础结构 搭建 、Spring和MyBatis 整合 、Spring和Spring MVC整合;然后讲解了 纯注
解方式 整合SSM框架。通过本章的学习,读者将能够了解SSM框架的整合思路,掌握SSM框
架的整合过程。SSM框架的整合是SSM框架使用的基础,读者一定要多加练习,并熟练掌握。

相关推荐
purrrew4 分钟前
【Java ee初阶】jvm(1)
java·jvm·java-ee
蓝天白云下遛狗5 分钟前
google-Chrome常用插件
前端·chrome
多多*43 分钟前
Spring之Bean的初始化 Bean的生命周期 全站式解析
java·开发语言·前端·数据库·后端·spring·servlet
linweidong1 小时前
在企业级应用中,你如何构建一个全面的前端测试策略,包括单元测试、集成测试、端到端测试
前端·selenium·单元测试·集成测试·前端面试·mocha·前端面经
满怀10151 小时前
【HTML 全栈进阶】从语义化到现代 Web 开发实战
前端·html
东锋1.31 小时前
前端动画库 Anime.js 的V4 版本,兼容 Vue、React
前端·javascript·vue.js
满怀10152 小时前
【Flask全栈开发指南】从零构建企业级Web应用
前端·python·flask·后端开发·全栈开发
小杨升级打怪中2 小时前
前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制
前端·webpack·node.js
Yvonne爱编码2 小时前
CSS- 4.4 固定定位(fixed)& 咖啡售卖官网实例
前端·css·html·状态模式·hbuilder
SuperherRo3 小时前
Web开发-JavaEE应用&SpringBoot栈&SnakeYaml反序列化链&JAR&WAR&构建打包
前端·java-ee·jar·反序列化·war·snakeyaml