整合基于注解的SSM框架
先创建一个SpringMVC项目:创建Maven项目,在创建过程中,Packaging必须选择war
,创建好项目后,项目会因为缺少web.xml文件报错,则先在pom.xml中添加配置信息:
<properties>
<failOnMissingWebXml>false</failOnMissingWebXml>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
然后,还是在pom.xml中添加必要的依赖:
代码语言:javascript复制<dependencies>
<!-- SpringMVC的依赖:spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- SpringJdbc的依赖:spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- MyBatis的依赖:mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- MyBatis整合Spring的依赖:mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<!-- MySQL连接的依赖:mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!-- 数据库连接池的依赖:commons-dbcp(也可以使用其它数据库连接池) -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- 单元测试的依赖:junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
以上依赖基本上是一个整合SSM三个框架后必须使用的依赖,在以后的工作中,可能会更换依赖的版本(需要注意的是:spring-webmvc
和spring-jdbc
必须使用相同的版本号),也可能会使用其它的数据库连接池(则更换掉commons-dbcp
的依赖代码),或者,因为需要响应正文,可能需要补充jackson-databind
的依赖:
<!-- Jackson依赖(响应JSON数据时需要使用的依赖):jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.4</version>
</dependency>
如果使用Thymeleaf框架,则需要补充thymeleaf
和thymeleaf-spring4
/thymeleaf-spring5
的依赖:
<!-- Thymeleaf的依赖:thymeleaf -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<!-- Thymeleaf整合Spring5的依赖:thymeleaf-spring5 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
本次将使用Thymeleaf,所以,添加以上这2个依赖!
使用
jackson-databind
与thymeleaf
相关依赖并不冲突,即使把这些依赖都添加在同一个项目中,也不会出错,但是,同一个项目,控制器的响应方式应该是相对固定的,要么响应JSON数据到客户端,由客户端技术处理响应的数据,要么使用转发的方式,将数据转发到Thymeleaf模版页面,由服务器端完成整个页面的数据处理后,再将整个页面响应给客户端。
然后,对项目点右键,配置项目的属性,在Targeted Runtimes项中勾选Tomcat。
接下来,需要完成Spring、SpringMVC、MyBatis框架的相关配置,编写配置时不区分先后顺序!
在src/main/resources下创建mappers文件夹,用于存放使用MyBatis框架时配置SQL语句的XML文件。
在src/main/resources下创建application.properties文件,用于配置连接数据库的相关信息及项目中其它的配置,目前,可以先添加连接数据库的信息及使用MyBatis的配置信息:
代码语言:javascript复制# 数据库连接池的配置
datasource.url=jdbc:mysql://localhost:3306/tedu_store?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
datasource.driver-class-name=com.mysql.cj.jdbc.Driver
datasource.username=root
datasource.password=root
datasource.initialSize=2
datasource.maxTotal=10
# mybatis的配置
mybatis.mapper-locations=classpath:mappers/*.xml
注意:因为Spring框架在处理以上配置文件时,如果存在名为username
的配置,在Windows操作系统中,会发生冲突,所以,自定义的各配置名称最好都添加一些前缀,避免与默认的一些配置信息发生冲突!
在src/main/java下,创建SpringConfig
类,用于读取以上配置信息:
package cn.tedu.ssm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.Resource;
@Configuration
@PropertySource("classpath:application.properties")
public class SpringConfig {
@Value("${datasource.url}")
private String url;
@Value("${datasource.driver-class-name}")
private String driverClassName;
@Value("${datasource.username}")
private String username;
@Value("${datasource.password}")
private String password;
@Value("${datasource.initialSize}")
private Integer initialSize;
@Value("${datasource.maxTotal}")
private Integer maxTotal;
@Value("${mybatis.mapper-locations}")
private Resource mapperLocations;
}
并且,在这个文件中,继续配置使用MyBatis时所需要使用的数据源DataSource
和SqlSessionFactoryBean
的对象:
@Bean
public DataSource getDataSource() {
// 当前方法声明的返回值类型是javax.sql.DataSource接口类型的,符合该接口类型的数据源有多种
// 由于本次使用的是commons-dbcp,则创建并返回BasicDataSource的对象
// 如果改用其它数据源,则创建并返回其它数据源的对象
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setInitialSize(initialSize);
dataSource.setMaxTotal(maxTotal);
return dataSource;
}
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource) {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(mapperLocations);
return bean;
}
然后,再创建SpringMvcConfig
类,用于配置SpringMVC相关的配置:
package cn.tedu.ssm;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
@Configuration
@EnableWebMvc
@ComponentScan("cn.tedu.ssm")
public class SpringMvcConfig implements WebMvcConfigurer {
/**
* 字符编码
*/
private String characterEncoding = "utf-8";
// 如果需要使用Thymeleaf,则必须添加以下配置
@Bean
public ViewResolver getViewResolver() {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setCacheable(false);
templateResolver.setCharacterEncoding(characterEncoding);
templateResolver.setTemplateMode("HTML");
templateResolver.setPrefix("/templates/");
templateResolver.setSuffix(".html");
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setCharacterEncoding(characterEncoding);
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}
}
注意:由于以上配置了使用Thymeleaf时的“前缀”与“后缀”,所以,必须在src/main/resources下创建templates文件夹,用于存放Thymeleaf模版页面,且这些模版页面的扩展名必须是.html
。
后续,如果还有与SpringMVC相关的配置,也写在以上SpringMvcConfig
类中,例如拦截器的配置信息等。
最后,创建SpringMvcInitializer
类作为项目的初始化类:
package cn.tedu.ssm;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { SpringConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { SpringMvcConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "*.do" };
}
}
由于SpringMVC项目中,默认情况下,使用POST
方式的请求提交的数据都是ISO-8859-1
编码的,所以,在以上初始化类中,继续补充过滤器的配置,以应用字符编码过滤器:
private String encoding = "utf-8";
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter(encoding);
return new Filter[] { filter };
}
至此,一个整合的SSM框架就已经全部配置完成,接下来,就是具体的使用了!
注意:在确定了使用MyBatis时创建的接口所在的包之后,需要在SpringConfig
类的声明之前添加@MapperScan
,以指定接口文件所在的包,例如:
@Configuration
@PropertySource("classpath:application.properties")
@MapperScan("cn.tedu.ssm.mapper")
public class SpringConfig {
}