手记

SSM 整合 (这应该是最详细,最通俗易懂的文章了吧 小声BB)

SSM 整合系列

一、修改 Maven 镜像源
	1.1 找到 maven 的配置文件 settings.xml
	1.2 修改 Maven 源
二、搭建 Maven WebApp 项目
	2.1 搭建项目
	2.2 配置 Maven 依赖
三、配置文件编写
	3.1 Spring 配置文件
	3.2 log4j 配置文件编写
	3.3 SpringMVC 配置文件
	3.4 数据库创建
	3.5 编写 web.xml
四、编写 java 类
	4.1 创建如下包结构
	4.2 编写实体类 Account
	4.3 编写 dao 层方法
	4.4 编写 Service 方法
	4.5 编写 controller
五、编写前端页面
	5.1 index.jsp 编写
	5.2 编写成功跳转界面
六、运行效果
	6.1 返回字符串
	6.2 查询所有
	6.3 表单封装

所谓 SSM,就是把 Spring,SpringMVC,Mybatis 三个框架放在同一个项目中使用,此文使用了一个简单的实例,给大家演示 ssm 的整合基本过程。文章代码量比较多,大家可以适当选择查阅

一、修改 Maven 镜像源

1.1 找到 maven 的配置文件 settings.xml

我用的是 idea 自带的maven 工具,如果用得是自己下的maven,修改镜像配置的方式是一样的。

1.2 修改 Maven 源

使用编辑器打开该文件,我使用 subline 打开的,找到第 146行左右,添加如下镜像信息,把我下面的注释塞进去,就可以解决 maven 下载慢的问题了

     <mirror>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
        <mirror>
            <id>uk</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://uk.maven.org/maven2/</url>
        </mirror>
        <mirror>
            <id>CN</id>
            <name>OSChina Central</name>
            <url>http://maven.oschina.net/content/groups/public/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
        <mirror>
            <id>nexus</id>
            <name>internal nexus repository</name>
            <!-- <url>http://192.168.1.100:8081/nexus/content/groups/public/</url>-->
            <url>http://repo.maven.apache.org/maven2</url>
            <mirrorOf>central</mirrorOf>
        </mirror>

二、搭建 Maven WebApp 项目

2.1 搭建项目

一定要选择第二个,如果你选择第一个就要重新建一个的新的项目

大家初始化的项目是这样的结构

2.2 配置 Maven 依赖

因为我们要搭建 ssm 项目,所以需要加入 Spring,SpringMVC,MyBatis 的依赖,以及一些其他的配置文件

  1. 项目版本锁定
<!--  Maven 版本锁定-->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.version>5.2.3.RELEASE</spring.version>
    <slf4j.version>1.6.6</slf4j.version>
    <log4j.version>1.2.12</log4j.version>
    <mysql.version>5.1.10</mysql.version>
    <mybatis.version>3.4.5</mybatis.version>
  </properties>
  1. 依赖配置
<!--  Spring AOP-->
  <dependencies>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.7.4</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>

<!--AOP end-->

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

<!--    单元的测试-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>

<!--    事物-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>

    </dependency>
<!--  jdbc 模板-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

<!--    单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>compile</scope>
    </dependency>

<!--    mysql 驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>

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

<!--    jsp 依赖-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
      <scope>provided</scope>
    </dependency>

<!--    引入 jstl 1.2 库-->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

<!--    log Start 日志记录-->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>


    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
<!--    log end-->

<!--    Mybatis 依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>

<!-- MyBatis 的 Spring 依赖,有了这个,我们就不必单独编写 MyBatis 的配置文件了 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.3</version>
    </dependency>

<!--    数据库连接池-->
    <dependency>
      <groupId>c3p0</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.1.2</version>
      <type>jar</type>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

maven 配置好了之后,这些内容就会在后台自动下载,这里我们就不用管了

三、配置文件编写

  1. Spring 的配置文件
  2. SpringMVC 的配置文件
  3. MyBatis 的配置我们也可以写(但是 Spring 整合了 MyBatis 对象,我们就不用在自己编写)
  4. 配置日志记录文件

3.1 Spring 配置文件

在 Maven 的 resources 目录里创建一个 applicationContext.xml 的配置文件,加入 Spring的 一些配置 和 约束

这里有些 IOC 的配置会报错,之后会解决

<?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:aop="http://www.springframework.org/schema/aop"
       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
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

<!--        开启注解扫描, 希望处理 service 和 dao,controller 不需要 spring 去处理-->
    <context:component-scan base-package="cn.gorit">
        <!-- 配置哪些注解不扫描-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- Spring 整合 Mybatis 对象,有了这个就可以不用 mybatis 注解了 ======================================= -->
<!--    配置连接池-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8" />
        <property name="user" value="root"/>
        <property name="password" value="root"/>
    </bean>

<!--    配置 SqlSessionFactor 工厂-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
    </bean>

<!--    配置 AccounDao 接口所在的包-->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.gorit.dao" />
    </bean>
<!--======================================================================================-->

<!--    配置 Spring 框架声明式事物管理-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

<!--    配置事物通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
<!--            find 方法打头的-->
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*" isolation="DEFAULT" />
        </tx:attributes>
    </tx:advice>

<!--    配置 AOP 增强-->
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution( * cn.gorit.service.impl.*ServiceImpl.*(..))"></aop:advisor>
    </aop:config>
</beans>

3.2 log4j 配置文件编写

这是一个 日志打印的一个配置文件

log4j.rootLogger=INFO,stdout,debug,error

#\u8F93\u51FA\u5230\u63A7\u5236\u53F0
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n

#\u8F93\u51FADEBUG\u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230\u6587\u4EF6
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n
log4j.appender.debug.File=./logs/debug.txt
log4j.appender.debug.DatePattern=','yyyy-MM-dd
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.Append=true
log4j.appender.debug.Encoding=UTF-8

#\u8F93\u51FADEBUG\u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230\u6587\u4EF6
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n
log4j.appender.error.File=./logs/error.txt
log4j.appender.error.DatePattern=','yyyy-MM-dd
log4j.appender.error.Threshold=ERROR
log4j.appender.error.Append=true
log4j.appender.error.Encoding=UTF-8

3.3 SpringMVC 配置文件

创建 springmvc.xml 在 resources 目录下

<?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!--开启注解扫描,只扫描 Controller 注解-->
    <context:component-scan base-package="cn.gorit">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
	<!--    配置视图解析器-->
    <!--    视图解析器对象 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

<!--    过滤静态资源-->
    <!-- 前端控制器 有哪些静态资源不拦截  释放静态资源,否则静态资源无法访问 -->
    <mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
    <mvc:resources mapping="/css/**" location="/csss/"></mvc:resources>
    <mvc:resources mapping="/images/**" location="/images/"></mvc:resources>

<!--    开启SpringMvc 的注解支持-->
    <mvc:annotation-driven/>
</beans>

3.4 数据库创建

创建一个名为 ssm 的数据库,并创建名为 account 的表,表结构如下, 注意数据库版本,我用得是 mysql 5.7 版本的

//创建数据库
create database ssm;

// 使用数据库
use ssm;

// 创建数据表
create table account(
	id int(11) primary key auto_increment,
	name varchar(30),
	money double 
};

3.5 编写 web.xml

配置前端控制器
spring 监听器
编码监听器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  
  <display-name>Archetype Created Web Application</display-name>
  
<!--  配置Spring 监听器, 默认只加载 WEB-INF 目录下的 applicationContext.xml 配置文件-->
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--设置配置文件路径-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

<!--  配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--    加载 springmvc.xml 配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
<!--    启动服务器,创建该 servlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

<!--  解决中文乱码的过滤器-->
  <filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>

四、编写 java 类

4.1 创建如下包结构

4.2 编写实体类 Account

通过上面可知,我们应该要创建一个名为 account 的实体类,并且也是包含三个字段

package cn.gorit.entity;

import java.io.Serializable;

public class Account implements Serializable {

    private Integer id;
    private String name;
    private double money;
	
	// 使用有参数的构造方法,我们使用 IOC 容器注入的时候,从表单传过来的数据会自动封装成 Account 对象
    public Account(Integer id, String name, double money) {
        this.id = id;
        this.name = name;
        this.money = money;
    }
	
	// getter  和  setter 省略,因为用不到

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

4.3 编写 dao 层方法

我们可以使用 MyBatis 的注解,直接完成数据库的操作

package cn.gorit.dao;

import cn.gorit.entity.Account;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 账户接口
 * */
@Repository
public interface AccountDao {

    // 查询所有账户信息
    @Select("select * from account")
    public List<Account> findAll();

    // 保存账户信息
    @Insert("insert into account(name,money) values(#{name},#{money})")
    public int saveAccount(Account account);
}

4.4 编写 Service 方法

  1. AccountService编写
    编写两个基础的账号操作接口
package cn.gorit.service;

import cn.gorit.entity.Account;
import java.util.List;

public interface AccountService {
    // 查询所有账户信息
    public List<Account> findAll();

    // 保存账户信息
    public void saveAccount(Account account);
}
  1. AccountServiceImpl 实现 AccountService 接口
    前面我们在 mybatis 完成了数据库的操作,这里直接调用 dao 层对应的方法即可
package cn.gorit.service.impl;

import cn.gorit.dao.AccountDao;
import cn.gorit.entity.Account;
import cn.gorit.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

    @Override
    public List<Account> findAll() {
        System.out.println("业务层,查询所有账户...");
        return accountDao.findAll();
    }

    @Override
    public void saveAccount(Account account) {
        System.out.println("业务层,存账户...");
        accountDao.saveAccount(account);
    }
}

4.5 编写 controller

使用 Controller 我们就可以在页面看到我们想要的数据了

package cn.gorit.controller;

import cn.gorit.entity.Account;
import cn.gorit.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

// 账户 web
@Controller
@RequestMapping("/account")
public class AccountController {

    @Autowired
    private AccountService accountService;

    @RequestMapping("/test")
    @ResponseBody
    public String test() {
        // 使用 RequestBody 来标识这个方法,这样返回的就是一个字符串,不然 springmvc 就会去寻找同名的 jsp 文件
        return "Hello World";
    }

    @RequestMapping("/findAll")
    public String findAll(Model model) {
        System.out.println("表现层,查询所有账户...");
//        调用 service 方法
        List<Account> list = accountService.findAll();
        model.addAttribute("list",list);
        return "list";
    }

    // 保存数据
    @RequestMapping("/save")
    public void save(Account account, HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("表现层,保存账户...");
        System.out.println(account);
//        调用 service 方法
        accountService.saveAccount(account);
        response.sendRedirect(request.getContextPath()+"/account/findAll");
        return;
    }
}

但是你以为就这样结束了吗,不,我们还没编写 前端页面呢

五、编写前端页面

5.1 index.jsp 编写

因为我们要在这里调用 controller 中的方法

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试</title>
</head>
<body>

    <h3>SpringMVC </h3>
    <a href="account/findAll">findAll</a>

    <h3>测试保存</h3>
    <form action="account/save" method="post">
        姓名:<input type="text" name="name"><br>
        金额:<input type="text" name="money"><br>
        <input type="submit" value="保存">
    </form>
</body>
</html>

5.2 编写成功跳转界面

在 WEB-INF 目录下创建 pages 文件,再创建 list.jsp 和 success.jsp(和controller 中跳转的页面时对应的)

为什么会这样的呢?

  1. 因为我们在 springmvc.xml 中配置了这样的一个视图解析器

  2. 因为我们使用了 controller 来接收所有的网络请求,这个请求会最先经过 web.xml 中配置的 前端控制器

  3. 经过了前端控制器,再会经过 视图解析器,然后根据返回的内容,跳转至指定页面,也就是 list.jsp

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %>
<html>
<head>
    <title>list</title>
</head>
<body>
    <h3>查询了所有的账户信息</h3>
    ${list.get(0)} ${list.get(0)}
</body>
</html>

六、运行效果

6.1 返回字符串

6.2 查询所有

显示的内容我只打印了显示第一条数据,所以这里只有第一条数据

6.3 表单封装

5人推荐
随时随地看视频
慕课网APP