关于整合基于注解的SSM框架小结

2021-08-23 15:31:58 浏览数 (1)

整合基于注解的SSM框架

先创建一个SpringMVC项目:创建Maven项目,在创建过程中,Packaging必须选择war,创建好项目后,项目会因为缺少web.xml文件报错,则先在pom.xml中添加配置信息:

代码语言:javascript复制
<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-webmvcspring-jdbc必须使用相同的版本号),也可能会使用其它的数据库连接池(则更换掉commons-dbcp的依赖代码),或者,因为需要响应正文,可能需要补充jackson-databind的依赖:

代码语言:javascript复制
<!-- Jackson依赖(响应JSON数据时需要使用的依赖):jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.4</version>
</dependency>

如果使用Thymeleaf框架,则需要补充thymeleafthymeleaf-spring4/thymeleaf-spring5的依赖:

代码语言:javascript复制
<!-- 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-databindthymeleaf相关依赖并不冲突,即使把这些依赖都添加在同一个项目中,也不会出错,但是,同一个项目,控制器的响应方式应该是相对固定的,要么响应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类,用于读取以上配置信息:

代码语言:javascript复制
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时所需要使用的数据源DataSourceSqlSessionFactoryBean的对象:

代码语言:javascript复制
@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相关的配置:

代码语言:javascript复制
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类作为项目的初始化类:

代码语言:javascript复制
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编码的,所以,在以上初始化类中,继续补充过滤器的配置,以应用字符编码过滤器:

代码语言:javascript复制
private String encoding = "utf-8";

@Override
protected Filter[] getServletFilters() {
  CharacterEncodingFilter filter = new CharacterEncodingFilter(encoding);
  return new Filter[] { filter };
}

至此,一个整合的SSM框架就已经全部配置完成,接下来,就是具体的使用了!

注意:在确定了使用MyBatis时创建的接口所在的包之后,需要在SpringConfig类的声明之前添加@MapperScan,以指定接口文件所在的包,例如:

代码语言:javascript复制
@Configuration
@PropertySource("classpath:application.properties")
@MapperScan("cn.tedu.ssm.mapper")
public class SpringConfig {
  
}

0 人点赞