一、整合思路
SSM框架即SpringMVC + Spring + MyBati框架集,是一种轻量级的Web开源框架。它们各自在JAVA三层架构中负责的模块如下图所示:

其中,SpringMVC与Spring之间本就存在包含关系,所以它们之间并不需要整合,只需要在web.xml中配置使用即可。而SpringMVC并不和MyBatis直接交互,因此它们之间也不需要进行配置。只有Spring和MyBatis二者之间,我们需要用Spring来将MyBatis整合进来。
因此,我们只需要对web.xml和Spring的配置文件进行一些额外的配置即可。
下面,我们通过实现一个简单的转账系统,来展示SSM框架的整合和使用。
二、SSM框架整合
首先新建一个JavaWeb项目,导入SpringMVC、Spring、MyBatis三个框架的jar包和它们之间整合所需要的jar包。

在src目录下创建controller、dao、service、pojo四个包,分别用来存放控制层、持久层、业务层、普通java类的代码。

配置web.xml,使项目加载SpringMVC和Spring。
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 SSM
4
5 index.html
6 index.htm
7 index.jsp
8 default.html
9 default.htm
10 default.jsp
11
12
13
14 SpringMVC
15 org.springframework.web.servlet.DispatcherServlet
16 1
17
18
19
20 SpringMVC
21 /
22
23
24
25 org.springframework.web.context.ContextLoaderListener
26
27
28
29 contextConfigLocation
30 classpath:applicationContext.xml
31
32
33
34 characterEncodingFilter
35 org.springframework.web.filter.CharacterEncodingFilter
36
37 encoding
38 UTF-8
39
40
41
42 characterEncodingFilter
43 /*
44
45
在WEB-INF中创建SpringMVC配置文件SpringMVC-servlet.xml(也可以将配置文件放到其他位置,但需要在web.xml中指明配置文件的路径)和jsp文件夹,jsp文件夹用来存放jsp页面。

1 <?xml version="1.0" encoding="UTF-8"?>
2
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="6 http://www.springframework.org/schema/beans7 http://www.springframework.org/schema/beans/spring-beans.xsd8 http://www.springframework.org/schema/context9 http://www.springframework.org/schema/context/spring-context.xsd">
10
11
12
13
14
15
16
17
在src目录下创建Spring的配置文件applicationContext.xml(文件路径在web.xml中指定),配置Spring并加载MyBatis。
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:tx="http://www.springframework.org/schema/tx"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans7 https://www.springframework.org/schema/beans/spring-beans.xsd8 http://www.springframework.org/schema/context9 http://www.springframework.org/schema/context/spring-context.xsd10 http://www.springframework.org/schema/tx11 http://www.springframework.org/schema/tx/spring-tx.xsd">
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
在dao包里创建MyBatis的配置文件mybatis-config.xml(文件路径在Spring配置文件中指定),指明MyBatis映射文件的路径。
1 <?xml version="1.0" encoding="UTF-8"?>
2 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5
6
7
8
9
在dao包中创建MyBatis的映射文件UserMapper.xml,用来后面实现转账系统时使用。
到了这里,SSM框架环境就已经搭建完成了,可以开始编写代码来实现转账系统了。整合后总的目录结构如下所示:

三、转账系统实现
我们要实现的转账系统很简单,该系统具体的操作流程就是“注册——登录——转账”,用户注册后,默认有100元的余额,然后就可以登陆系统,给指定的用户转账。虽然系统简单,但包含了SSM框架中最基础的部分。
1、实现持久层
经过分析,我们要实现这样的转账系统,首先需要一个记录用户信息的表,因此我们在数据库中,创建一个user库和一个user表,表定义如下:
1 CREATE TABLE `user` (2 `id` int(11) NOT NULLAUTO_INCREMENT,3 `username` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,4 `password` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,5 `sum` int(11) NOT NULL DEFAULT 100,6 PRIMARY KEY(`id`) USING BTREE7 ) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
并插入几条初始数据。

在pojo包中,创建一个跟user表字段对应的类User.java,便于我们传递数据。
1 packagepojo;2
3 public classUser {4
5 private intid;6
7 privateString username;8
9 privateString password;10
11 private intsum;12
13 public intgetId() {14 returnid;15 }16
17 public void setId(intid) {18 this.id =id;19 }20
21 publicString getUsername() {22 returnusername;23 }24
25 public voidsetUsername(String username) {26 this.username =username;27 }28
29 publicString getPassword() {30 returnpassword;31 }32
33 public voidsetPassword(String password) {34 this.password =password;35 }36
37 public intgetSum() {38 returnsum;39 }40
41 public void setSum(intsum) {42 this.sum =sum;43 }44
45 @Override46 publicString toString() {47 return "User [id=" + id + ", username=" + username + ", password=" + password + ", sum=" + sum + "]";48 }49
50 }
在前面创建的MyBatis映射文件UserMapper.xml中,写好需要的SQL语句。
1 <?xml version="1.0" encoding="UTF-8"?>
2 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6
7 select * from user where username = #{username} and password = #{password}8
9
10 select * from user where username = #{username}11
12
13 insert into user (username,password) values (#{username},#{password})14
15
16 update user set sum = #{sum} where username = #{username}17
18
在dao包中创建UserDao.java接口,编写MyBatis映射接口。
1 packagedao;2
3 importorg.apache.ibatis.annotations.Mapper;4
5 importpojo.User;6
7 @Mapper8 public interfaceUserDao {9
10 publicUser selectUserByNameAndPass(User user);11
12 public intaddUser(User user);13
14 publicUser selectUserByName(User user);15
16 public intupdateSumByName(User user);17 }
到这里持久层就编写完成了,此时的目录结构如下:

2、实现业务层
经过分析,该系统需要实现的业务有三个,分别是“登录”、“注册”和“转账”。我们可以在service包下创建UserService.java类,用三个方法来实现这些业务。代码如下:
1 packageservice;2
3 importjavax.servlet.http.HttpSession;4
5 importorg.springframework.beans.factory.annotation.Autowired;6 importorg.springframework.stereotype.Service;7 importorg.springframework.transaction.annotation.Transactional;8
9 importdao.UserDao;10 importpojo.User;11
12 @Service13 public classUserService {14
15 @Autowired16 privateUserDao userDao;17
18 @Autowired19 privateHttpSession httpSession;20
21 public booleanlogin(User user) {22 //验证账号密码
23 user =userDao.selectUserByNameAndPass(user);24 if (user == null) {25 return false;26 }27 //设置Session
28 httpSession.invalidate();29 httpSession.setAttribute("username", user.getUsername());30 return true;31 }32
33 public booleanregister(User user) {34 //检查用户名是否重复
35 if (userDao.selectUserByName(user) != null) {36 return false;37 }38 userDao.addUser(user);39 return true;40 }41
42 @Transactional43 public booleantransfer(User user_in) {44 //检查是否自己向自己转账
45 if (((String) httpSession.getAttribute("username")).equals(user_in.getUsername())) {46 return false;47 }48 //检查转账金额是否为正数
49 int transferSum =user_in.getSum();50 if (transferSum <= 0) {51 return false;52 }53 //检查转账目标用户是否存在
54 user_in =userDao.selectUserByName(user_in);55 if (user_in == null) {56 return false;57 }58 //检查用户是否有足够的余额进行转账
59 User user_out = newUser();60 user_out.setUsername((String) httpSession.getAttribute("username"));61 user_out =userDao.selectUserByName(user_out);62 int remainSum = user_out.getSum() -transferSum;63 if ( remainSum < 0) {64 return false;65 }66 //开始转账
67 user_out.setSum(remainSum);68 userDao.updateSumByName(user_out);69 user_in.setSum(user_in.getSum() +transferSum);70 userDao.updateSumByName(user_in);71 return true;72 }73 }
三、实现控制层
跟业务层一样,控制层也需要三个控制器来调用业务层。我们在controller包中创建UserController.java类,同样需要编写三个方法,代码如下:
1 packagecontroller;2
3 importorg.springframework.beans.factory.annotation.Autowired;4 importorg.springframework.stereotype.Controller;5 importorg.springframework.web.bind.annotation.RequestMapping;6
7 importpojo.User;8 importservice.UserService;9
10 @Controller11 public classUserController {12
13 @Autowired14 privateUserService userService;15
16 @RequestMapping("/login")17 publicString login(User user) {18 if(!userService.login(user)) {19 return "LoginError";20 }21 return "Transfer";22 }23
24 @RequestMapping("/register")25 publicString register(User user) {26 if(userService.register(user)) {27 return "RegisterSuccess";28 }29 return "RegisterError";30 }31
32 @RequestMapping("/transfer")33 publicString transfer(User user) {34 if(userService.transfer(user)) {35 return "TransferSuccess";36 }37 return "TransferError";38 }39 }
4、实现视图层
根据控制层中的定义,我们总共需要编写七个jsp页面,分别如下:
登录注册页面login.jsp:
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
登录8
9
10
11
12
13 用户名:
14
15
16
17 密码:
18
19
20
21
22
23
24
25
26
登录失败页面LoginError.jsp:
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
登录失败8
9
10 用户名或密码错误!11
12
登录成功后的转账页面Transfer.jsp:
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
转账8
9
10
11
12
13 欢迎你!${user.username}
14
15
16 用户名:
17
18
19
20 金额:
21
22
23
24
25
26
27
28
29
30
注册失败页面RegisterError.jsp:
1 <?xml version="1.0" encoding="UTF-8"?>
2
3
4
5
6 pageEncoding="UTF-8"%>
7
8
注册失败9
10
11 注册失败!12
13