SSM的整合

1. SSM整合的概述

什么是SSM整合

所谓SSM,即SpringMVC+Spring +mybatis,标准的MVC设计模式,将整个系统划分为web、service层、DAO层。Spring MVC、spring、mybatis各司其职,在整个框架中有着不同的作用。

  • Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,主要实现业务对象管理;

  • Spring MVC框架,通过实现MVC模式将数据、业务与展现进行分离,主要负责 请求的转发和视图管理;

  • MyBatis 是一个基于Java的持久层框架,作为 数据对象的持久化 引擎;

2.SSM整合:搭建Spring环境

步骤

只写了业务层

  1. 创建maven项目:在pom.xml中添加依赖

  2. 编写User实体类

  3. 编写UserSevice接口和实现类:查询所有用户

    注:暂时没有写DAO层访问数据库,只是打印一句话

  4. 编写Spring的配置文件:applicationContext.xml

    注:配置注解只扫描业务层,不要扫描controller,避免多次扫描,出现问题

  5. 使用Spring Test进行测试

代码

  1. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.it</groupId>
    <artifactId>day50_02_SSM</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--统一Spring的版本-->
    <properties>
        <!-- 定义属性 -->
        <spring_version>5.2.0.RELEASE</spring_version>
    </properties>

    <dependencies>
        <!-- SpringMVC支持包,包含了Spring的核心包和上下文包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <!-- 引用属性 -->
            <version>${spring_version}</version>
        </dependency>

        <!--SpringJDBC支持包,包含了事务处理的包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring_version}</version>
        </dependency>

        <!--Spring测试包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring_version}</version>
        </dependency>

        <!--面向切点编程的aspectj-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.7</version>
        </dependency>

        <!--MyBatis核心包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.0</version>
        </dependency>

        <!--Spring整合Mybatis支持包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>

        <!--数据库驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.30</version>
        </dependency>

        <!--druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--junit支持包-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!--jstl支持包-->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!--servlet配置可选-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!--json转换工具-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0</version>
        </dependency>

        <!-- Log4j 依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

2.编写User实体类,封装数据

package com.it.entity;

import lombok.Data;

//如果写成java.util.Date Spring不会自动转换
import java.sql.Date;

@Data
public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private char sex;
    private String address;
}

3.编写UserSevice接口和实现类

接口

package com.it.entity.service;

import com.it.entity.User;

import java.util.List;

/**
 用户业务接口
 */
public interface UserService {
    /**
     查询所有用户
     */
    List<User> findAll();
}

4.UserServiceImpl 实现类,并没有真实查询数据库

package com.it.service.impl;

import com.it.entity.User;
import com.it.service.UserService;

import java.util.List;

public class UserServiceImpl implements UserService {
    /**
     * 查询所有用户
     */
    @Override
    public List<User> findAll() {
        System.out.println("查询所有用户");
        return null;
    }
}

5.applicationContext.xml

注:只要扫描业务层的包即可

<?xml version="1.0" encoding="UTF-8"?>
<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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 注:这里只扫描是业务层,不要出现重复扫描要情况 -->
    <context:component-scan base-package="com.it.service"/>
    
</beans>

6.使用Spring Test中测试

package com.it.test;

import com.it.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestUser {

    @Autowired
    public UserService userService;

    @Test
    public void testFindAll() {
        userService.findAll();
    }

}

7.log4j.properties

log4j.rootLogger=info, stdout

log4j.category.org.springframework=info

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

3.SSM整合:搭建SpringMVC环境

1.将maven项目使用插件转成Web项目

2.将页面放到到webapp目录下

3.web.xml配置前端控制器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">


    <!--Spring MVC的servlet配置-->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 汉字乱码过滤器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


</web-app>

4.springMVC.xml

<?xml version="1.0" encoding="UTF-8"?>
<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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--1. 控制器包的注解扫描-->
    <context:component-scan base-package="com.it.controller"/>

    <!--2. 视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--页面前缀-->
        <property name="prefix" value="/pages/"/>
        <!--页面后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--3. 注册驱动-->
    <mvc:annotation-driven/>

    <!--4. 静态资源由默认Servlet处理-->
    <mvc:default-servlet-handler/>
</beans>

5.UserController控制器,添加进SpringIoC容器,使用RESTful风格操作。

package com.it.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/user")
public class UserController {

    //GET查询
    @GetMapping
    public ModelAndView findAll() {
        return new ModelAndView("user-list", "userList", null);
    }

}

6. SSM整合:Spring整合SpringMVC

关键点

  1. 在项目启动时候,加载web.xml

  2. web.xml中目前只加载了springMVC.xml

  3. 需要在web.xml中加载applicationContext.xml

ContextLoaderListener监听器作用

ContextLoaderListener实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时会加载applicationContext.xml配置文件。

如果在web.xml中不写任何参数配置信息,默认的路径是/WEB-INF/applicationContext.xml

步骤

  1. 配置web.xml

    1. 配置Spring提供的ContextLoaderListener监听器

    2. 读取全局的配置参数contextConfigLocation,加载Spring的配置文件

  2. 修改controller控制器类,注入service对象

 

代码

  1. web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">


    <!--Spring MVC的servlet配置-->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <!-- 加载Spring的配置文件 -->
    <listener>
        <!-- 实现了上下文域创建和销毁的监听器,在web容器启动的时候加载配置文件 -->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 指定spring的配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- 汉字乱码过滤器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


</web-app>

2.在控制器中注入:UserService

package com.it.controller;

import com.it.entity.User;
import com.it.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    //GET查询
    @GetMapping
    public ModelAndView findAll() {
        List<User> userList = userService.findAll();
        return new ModelAndView("user-list", "userList", userList);
    }

}

Spring和SpringMVC框架整合本质

Spring和SpringMVC框架的整合本质上是两个Spring容器的整合,因为我们知道SpringMVC框架本质也是一个Spring容器,所以这里所谓的整合就是在web容器中配置两个Spring容器,并让他们各司其职。

  1. Spring管理service,dao,事务等相关的组件的注入

  2. SpringMVC管理控制器相关的组件controller。

父子容器

Spring容器对应的是父容器,SpringMVC容器对应的是子容器。从容器里面getBean的时候,先从本容器取,如果取不到再从父容器取。

IoC容器体系中可以有多个子容器,但是父容器只有一个。不同的子容器之间不能共享bean,但是子容器都可以获得父容器中的bean信息。

父容器和子容器被初始化后会以属性的形式被存储在ServletContext上下文域中以供调用。因此处理器对象(子容器中)可以获取Service对象(父容器)并且注入,反过来业务对象不能获取处理器对象。

 

4. SSM整合:Spring整合MyBatis环境

要点

  1. 把mybatis-config.xml中配置放到applicationContext.xml中,包含以下内容

    1. 加载jdbc.properties的配置

    2. 数据库连接池的配置

    3. 加载DAO接口文件的配置

  2. 在applicationContext文件中完成mybatis中相关的配置:

    1. SqlSessionFactoryBean把SqlSessionFactory的创建,交给Spring完成

    2. MapperScannerConfigurer扫描DAO接口所在的包

  3. 配置声明式事务处理业务层的事务

代码

1.jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf8
jdbc.username=root
jdbc.password=root

2.配置applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<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"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 注:这里只扫描是业务层,不要出现重复扫描要情况 -->
    <context:component-scan base-package="com.it.service"/>

    <!--1. 加载jdbc.properties的配置-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--2. 数据库连接池的配置-->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
    </bean>

    <!-- spring整合mybaits -->
    <!--1. 把SqlSessionFactory的创建,交给Spring完成-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 配置数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 加载mybatis的配置文件,可选-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 将这个类下所有的实体类定义别名,可选 -->
        <property name="typeAliasesPackage" value="com.it.entity"/>
    </bean>

    <!--2. 扫描DAO接口所在的包-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--
        扫描dao包,做了以下事:
        1) 将dao下所有接口生成代理对象,放在Spring容器中
        2) 如果下面有xml的映射文件,解析xml文件
         -->
        <property name="basePackage" value="com.it.dao"/>
    </bean>

    <!-- 配置声明式事务 -->
    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 事务注解驱动,指定事务管理器,注:不要导错命名空间:tx -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

3.mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        <!--在控制台显示SQL语句-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--映射下划线为驼峰命名法-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

</configuration>

4.修改service,注入dao,直接调用dao方法

package com.it.service.impl;

import com.it.dao.UserDao;
import com.it.entity.User;
import com.it.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;
    /**
     * 查询所有用户
     */
    @Override
    public List<User> findAll() {
        return userDao.findAll();
    }
}

5.测试类

package com.it.test;

import com.it.entity.User;
import com.it.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestUser {

    @Autowired
    public UserService userService;

    @Test
    public void testFindAll() {
        List<User> users = userService.findAll();
        users.forEach(System.out::println);
    }

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值