SSM框架多种整合方式,这里使用注解+XML文件的方式来进行整合开发

一、前期准备

1.1、创建数据库与表

打开数据库可视化工具,执行以下sql语句

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE DATABASE ssm;

USE ssm;

CREATE TABLE `student`(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(32),
score DOUBLE
);
INSERT INTO `student` VALUES (1, 'A', 80);
INSERT INTO `student` VALUES (2, 'B', 95);
INSERT INTO `student` VALUES (3, 'C', 90);
INSERT INTO `student` VALUES (4, 'D', 100);

1.2、创建maven项目

注:这里需要以maven-archetype-webapp为骨架构建项目

image-20210131125931386

设置项目路径与坐标后,点击next

选择项目使用的maven版本及settings.xml文件,在属性中添加一键值对:**(archetypeCatalog:internal)**,这个键值对可以解决maven项目构建速度过慢的问题。

image-20210131130358733

1.3、编辑pom.xml

在pom.xml文件中引入项目依赖版本锁定

1
2
3
4
5
6
7
8
9
10
11
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<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.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mysql.version>8.0.19</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>

<dependencies>
<!-- spring -->
<!-- aop相关的技术 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>

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

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

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

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

<!-- spring测试 -->
<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.12</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>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>

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

<!-- EL JL TL表达式 -->
<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>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>

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

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
</dependencies>

1.4、完善目录结构

  • 在src/main目录下创建java文件夹与resource文件夹。
  • 在上一步创建的java目录下创建com.hzx.entity、com.hzx.dao、com.hzx.controller、com.hzx.service和com.hzx.test包

完善后的目录如下:

image-20210131131024222

1.5、创建基本类

根据数据库的表结构创建实体类,这里使用了Lombok简化开发

1
2
3
4
5
6
7
package com.hzx.entity;
@Data
public class Student implements Serializable {
private Integer id;
private String name;
private Double score;
}

在service包下创建一个StudentService接口,再创建一个impl包,然后在impl包下新建一个StudentServiceImpl实现类,这个类实现StudentService接口。

  • 接口
1
2
3
package com.hzx.service;
public interface StudentService {
}
  • 实现类
1
2
3
package com.hzx.service.impl;
public class StudentServiceImpl implements StudentService {
}

在mapper包下创建StudentMapper接口

1
2
3
package com.hzx.mapper;
public interface StudentMapper {
}

在controller包下创建一个StudentController接口

1
2
3
package com.hzx.controller;
public class StudentController {
}

二、Spring相关环境配置

2.1、编写Spring核心配置文件

在resource目录下创建Spring核心配置文件–applicationContext.xml

在这个核心配置文件中,我们需要

  • 开启组件扫描,扫描com.hzx包下的所有组件
  • 由于controller包下的控制器组件属于SpringMVC,所以我们需要在组件扫描中排除com.hzx包下所有添加了@Controller注解的组件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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 -->
<context:component-scan base-package="com.hzx">
<!-- 配置哪些注解不扫描 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

</beans>

2.2、测试

在StudentServiceImpl上添加@Service注解,同时添加两个方法进行测试

1
2
3
4
5
6
7
8
@Service
public class StudentServiceImpl implements StudentService {
@Override
public List<Student> getAllStudent() {
System.out.println("Service层的getAll方法,需要调用Mapper层与数据库交互.");
return null;
}
}

在com.hzx.test包下创建一个TestSpring类,编写方法使用junit进行测试

1
2
3
4
5
6
7
8
public class TestSpring {
@Test
public void testGetAll() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
StudentService studentService = ioc.getBean(StudentServiceImpl.class);
studentService.getAllStudent();
}
}

结果

image-20210131133141706

出现以上结果证明Spring基本环境已经搭建完成,下面配置SpringMVC

三、SpringMVC相关环境配置

3,1、配置web.xml

配置SpringMVC的核心前端控制器:DispatcherServlet

web.xml文件位置如下

image-20210131133440460

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--配置前端控制器-->
<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>
  • 配置前端控制器的过程中,可以直接指定springmvc的核心配置文件位置,在resource目录下创建springmvc核心配置文件–springmvc.xml

  • 使用该前端控制器拦截所有请求,在服务器启动时创建该servlet

配置字符编码过滤器,用于解决中文乱码

注:如果配置了多个过滤器,那么这个字符编码过滤器必须放在最前

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--配置过滤器,解决中文乱码-->
<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>

可选:如果你在SSM框架中想使用REST风格的API,那么需要配置一个HiddenHttpMethodFilter

1
2
3
4
5
6
7
8
9
<!-- 配置使用Rest风格的URL -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3.2、配置springmvc.xml

在resource目录下创建一个springmvc.xml配置文件

  • 创建配置文件,引入命名空间

  • 开启组件扫描,由于Spring核心配置文件中已经扫描除控制器之外的组件,所以在springmvc核心配置文件中只需要扫描控制器即可。

1
2
3
4
<!--1  开启只对controller的扫描-->
<context:component-scan base-package="com.hzx">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
  • 配置视图解析器,在WEB-INF文件夹下创建一个pages文件夹
1
2
3
4
5
6
7
<!--2 配置视图解析器-->
<bean id="org" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--JSP 目录-->
<property name="prefix" value="/WEB-INF/pages/"/>
<!--文件后缀-->
<property name="suffix" value=".jsp"/>
</bean>
  • 在webapp目录下创建三个用于存放静态资源的文件夹(css、images、js),并放行静态资源
1
2
3
4
<!--3 不过滤静态资源-->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
  • 开启注解支持
1
2
<!--4 开启注解支持-->
<mvc:annotation-driven/>
  • springmvc.xml配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.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.xsd">

<!--1 开启只对controller的扫描-->
<context:component-scan base-package="com.hzx">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!--2 配置视图解析器-->
<bean id="org" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--JSP 目录-->
<property name="prefix" value="/WEB-INF/pages/"/>
<!--文件后缀-->
<property name="suffix" value=".jsp"/>
</bean>

<!--3 不过滤静态资源-->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/js/**" location="/js/"/>

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

3.3、编写页面

修改index.jsp

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<a href="student/getAll">查询所有学生</a>
</body>
</html>

在WEB-INF/pages目录下创建一个list.jsp

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>查询所有页面</title>
</head>
<body>
<h3>这是学生列表</h3>
</body>
</html>

3.4、测试

在StudentController添加一方法,这个方法用于跳转到list.jsp页面

1
2
3
4
5
6
7
8
9
10
@Controller
@RequestMapping("/student")
public class StudentController {
@RequestMapping("/getAll")
public ModelAndView getAll() {
ModelAndView mv = new ModelAndView();
mv.setViewName("list");
return mv;
}
}

配置tomcat

image-20210131140153219

点击超链接后跳转成功,证明Springmvc基本配置完成

image-20210131140235530

四、Spring整合Spring MVC

4.1、配置监听器

通过对 Spring MVC 的代码编写,我们知道,在服务器启动的时候就回去加载 springmvc.xml 这个配置,现在我们就需要继续在 web.xml 中配置,使得在项目启动的时候,就去加载applicationContext.xml的配置文件

所以我们可以在 web.xml 中,配置spring核心监听器,它默认会以 /WEB-INF/applicationContext.xml作为配置文件,这里需要注意web.xml文件中各个组件的存放位置

1
2
3
4
5
6
7
8
9
<!--设置配置文件路径-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--配置 Spring 的监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

4.2、使用controller调用service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Controller
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService studentService;

@RequestMapping("/getAll")
public ModelAndView getAll() {
System.out.println("控制层的getAll方法...");
studentService.getAllStudent();
ModelAndView mv = new ModelAndView();
mv.setViewName("list");
return mv;
}
}

4.3、重新启动tomcat,测试

在tomcat的VM options中填入:-Dfile.encoding=UTF-8,用于解决IDEA的控制台乱码问题

image-20210131141119573

五、使用Spring整合Mybatis

5.1、编写Mybatis核心配置文件

在resource目录下新建一个SqlMapConfig.xml,这个文件其实可以省略,但我们还是用它来编写类名简化配置。

  • 创建SqlMapConfig.xml配置文件
  • 扫描com.hzx包,为包下的实体类起一个别名,并在控制台输出执行的sql
  • 与数据库连接相关的配置我们放在Spring的核心配置文件中配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<typeAliases>
<package name="com.hzx"/>
</typeAliases>
</configuration>

5.2、编写StudentMapper接口

使用注解形式编写sql语句,也可以使用xml配置文件的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Repository
public interface StudentMapper {
/***
* 查询所有学生
* @return
*/
@Select("select * from `ssm`.`student`")
List<Student> getAll();

/***
* 向数据库中插入一个学生
* @param student
* @return
*/
@Insert("insert into `ssm`.`student`(name,score) values(#{name},#{score})")
int addStudent(Student student);
}

5.3、编写链接数据库的配置文件

1
2
3
4
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=tianxin1230.

5.4、修改Spring核心配置文件

在Spring核心配置文件配置数据库连接池,引入properties文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true" />
<!--配置数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 数据库基本信息配置 -->
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

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

<!-- 配置StudentMapper接口所在包 -->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer" >
<property name="basePackage" value="com.hzx.mapper" />
</bean>

5.5、修改service实现类和controller层

service实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentMapper studentMapper;
@Override
public List<Student> getAllStudent() {
System.out.println("Service层的getAll方法,需要调用Mapper层与数据库交互.");
return studentMapper.getAll();
}
@Override
public int addStudent(Student student) {
System.out.println("Service层的addStudent方法,需要调用Mapper层与数据库交互.");
return studentMapper.addStudent(student);
}
}

controller层

修改getAll方法,并添加add方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Controller
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService studentService;

@RequestMapping("/getAll")
public ModelAndView getAll() {
System.out.println("控制层的getAll方法...");
List<Student> students = studentService.getAllStudent();
ModelAndView mv = new ModelAndView();
mv.addObject("students",students);
mv.setViewName("list");
return mv;
}

@RequestMapping("/add")
public void add(Student student, HttpServletRequest request, HttpServletResponse response) throws IOException, IOException {
studentService.addStudent(student);
response.sendRedirect(request.getContextPath()+"/student/getAll");
return;
}
}

5.6、修改index.jsp和

index.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<a href="student/getAll">查询所有学生</a>
<form action="student/add" method="post">
学生姓名:<input type="text" name="name"><br/>
学科成绩:<input type="text" name="score"><br/>
<input type="submit" value="添加"/><br/>
</form>
</body>
</html>

list.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>学生列表</title>
</head>
<body>
<h3>学生列表</h3>
<c:forEach items="${students}" var="student">
${student.name} 的成绩为: ${student.score}
</c:forEach>
</body>
</html>

测试查询所有学生方法

image-20210131143231582

测试添加所有学生方法

image-20210131143459450

结果

image-20210131144429826

5.7、添加事务控制

修改spring核心配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--配置Spring框架声明式事务管理-->
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<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.ideal.service.impl.*ServiceImpl.*(..))"/>
</aop:config>