1. Spring 与Spring MVC环境配置
1. 依赖spring-webmvc
2. 配置DispatcherServlet(Spring MVC中的核心组件用于请求的获取和转发)
3. 启用Spring MVC注解模式
4. 配置请求与相应字符集(解决请求与响应中字符集乱码的功能)
filter是配置的POST请求的字符集转换,而GET请求需要修改tomcat的server.xml增加urlEncoding这个配置项,让所有get请求的数据按照utf-8编码进行转换。但是在tomcat8以后默认get请求就是按照utf-8字符集进行转换的
5. 配置FreeMarker模板引擎
6. 配置Json序列化组件
pom.xml
<!-- 1. Maven依赖spring-webmvc -->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- FreeMaker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
<!-- 整合Freemakre组件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- Jackson, springmvc默认的序列化工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.0</version>
</dependency>
<!-- 注解包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.0</version>
</dependency>
<!-- 数据绑定包,通过这个绑定包可以让我们和springmvc的数据进行有效的交互 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
web.xml
<?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_3_1.xsd"
version="3.1">
<!-- 2. 配置DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</init-param>
<!-- 代表在web应用启动的时候就去初始化这个servlet-->
<load-on-startup>0</load-on-startup>
</servlet>
<!-- 映射url-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 4. 解决请求中的中文乱码 (解决post请求中的乱码,核心是一个过滤器)-->
<filter>
<filter-name>characterFilter</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>characterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
applicationContext.xml
<?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"
xmlns:task="http://www.springframework.org/schema/task"
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/task
http://www.springframework.org/schema/task/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 3. 开启SpringMVC注解模式-->
<context:component-scan base-package="com.imooc"/>
<!-- 开启springmvc注解-->
<mvc:annotation-driven>
<!-- 解决相应时候的字符集转换 -->
<mvc:message-converters>
<!--用来管理响应输出所产生的main及字符集-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!--说明响应内容是一个html片段,浏览器会对其进行解析,,,对于响应的内容,会先通过utf-8进行字符集编码转换,然后用http格式文本进行解析-->
<value>text/html;charset=utf-8</value>
<!-- 6. 配置json序列化输出配置 -->
<value>application/json;charset=utf-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 将图片img,css等静态资源排除在外,进而提高springmvc对url的处理效率-->
<mvc:default-servlet-handler/>
<!-- 5. 配置FreeMaker模板引擎 id="freamakerConfig"代表这是freemaker的配置对象 class:去哪个目录下加载freemaker的脚本-->
<bean id="freamakerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!--freemaker脚本存放地址-->
<property name="templateLoaderPath" value="/WEB-INF/ftl"/>
<!--针对freemaker本身,需要配置的参数-->
<property name="freemarkerSettings">
<props>
<!--读取指定ftl文件的时候采用utf-8编码,和请求响应中的字符集没有关系-->
<prop key="defaultEncoding">UTF-8</prop>
</props>
</property>
</bean>
<!-- 视图解析器,规定了到底使用那种模板引擎来对数据进行解析,真正执行的对象是ViewResolver -->
<bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<!-- 在我们进行视图解析器将数据和模板引擎结合所产生的新的html片段,向响应输出时设置他的contentType, -->
<property name="contentType" value="text/html; charset=utf-8"/>
<!-- 要加载的模板引擎扩展名 -->
<property name="suffix" value=".ftl"/>
</bean>
</beans>
2. Spring 与MyBatis的整合配置
在前面我们学习mybatis时,开发了一个名为MyBatisUtils的工具类,他的主要作用是通过代码方式来实例化MyBatis最核心的对象,就是SqlSessionFactory这个对象,用于解析mybatis的配置文件,并完成一系列的初始化工作。但是当前实例化一个对象是通过代码new的形式来完成的。它和spring没有任何关系。由于这个类是我们自己创建的,spring也不会对它进行管理。spring底层提供了IOC,AOP这样的技术,可以在原始的程序之外扩展很多新的能力。比如说日志的管理,任务调度,声明式事物等。经过一些配置,SpringIOC容器在初始化时候自动创建sqlsessionFactory对象。同时这个对象也会被spring进行管理。这样基于spring的很多扩展功能都可以使用在MaBatis上。同时因为加入了mybatis-spring,把程序的创建的权利交给了springIoc容器,让我们系统中分散的技术形成了一个有机的整体,让我们程序更容易被维护,更容易被管理。
2.1 依赖mybatis-spring及驱动
pom.xml
<!-- MyBatis整合步骤: 2.1. 引入依赖 -->
<!-- 1. jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- 2. MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- 必要的整合包 MyBatis与Spring整合组件-->
<!-- 3. MyBatis和Spring之间的整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- 4. JDBC驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!-- 5. alibaba Druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.14</version>
</dependency>
2.2 配置数据源和连接池
applicationContext.xml
<!--2. 配置数据源-->
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/reader?useSSL=false&Unicode=true&characterEncoding=UTF-8&serverTimezone=Asia/shanghai&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="20"/>
</bean>
2.3 配置使Ioc容器实例化SqlSessionFactory
applicationContext.xml
<!-- SqlSessionFactoryBean 用于根据配置信息创建SqlSessionFactory, 不再需要我们自己手动编码创建 -->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<property name="mapperLocations" value="classpath:mappers/*.xml"/>
<!-- 2.5. MyBatis配置文件地址 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
2.4 配置Mapper扫描器
applicationContext.xml
<!-- 2.4. 配置mapper扫描器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 只需要指定包名,ioc容器初始化mybatis的时候,会对这个包下所有的mapper接口进行扫描,并根据对应的xml文件来生成接口对应的实现类-->
<property name="basePackage" value="com.imooc.reader.mapper"/>
</bean>
2.5 创建mybatis-config.xml
前期配置见2.3
mybatis-config.xml
<?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="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
2.6 整合其他组件
2.6.1. 配置logback日志输出
pom.xml添加依赖
<!--logback日志组件-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 直接向控制台打印输出-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 向控制台指定输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{HH:mm:ss} %-5level [%thread] %logger{30} - %msg%n </pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="console"/>
</root>
</configuration>
2.6.2 声明式事物配置
applicationContext.xml开头所有引入的url
<?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"
xmlns:task="http://www.springframework.org/schema/task"
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/task
http://www.springframework.org/schema/task/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- tx代表事物-->
在applicationContext.xml下面添加bean
<!-- 声明式事物配置 用于控制事物的打开提交或者回滚-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"/>
</bean>
<!-- annotation-driven 启用对应的注解模式-->
<tx:annotation-driven transaction-manager="transactionManager"/>
在测试类上加注解@transaction
package com.imooc.reader.service;
import com.imooc.reader.mapper.TestMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@Service
public class TestService {
@Resource
private TestMapper testMapper;
// 事务,要么全部完成,要不不做
@Transactional
public void batchImport(){
for(int i = 0; i < 5; i++){
// if(i == 3){
// throw new RuntimeException("预期外异常");
// }
testMapper.insert();
}
}
}
2.6.3 整合JUnit单元测试
pom.xml增加依赖包
<!-- 2.6.3 单元测试依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!--spring-test依赖于junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>