目录
3)Spring提供的监听器ContextLoaderListener
2)创建MyBatis的核心配置文件mybatis-config.xml
Spring 和 SpringMVC 本身就是同源的,作为 Spring 家族的一个框架,整合不整合都行,我们所说的不整合是指 Spring 和 SpringMVC 创建同一个 IOC 容器,整合是指 Spring 和 SpringMVC 各自创建自己的 IOC 容器,管理各自的组件。(建议整合)
既然是两个IOC容器,他们如何关联呢?
SpringMVC是子容器,Spring是父容器,子容器可以访问父容器的bean,父容器访问不了子容器。(具体在源码中体现,这里不再赘述)
Java工程我们可以控制代码的执行,写一个测试类,但是我们要创建的是 web 工程,我们创建IOC容器的代码要写在哪里?
SpringMVC 管理的是控制层组件,其他的组件交给 Spring 管理,控制层依赖于Service组件,又自动装配是在获取 IOC 容器时完成的,即 Controller 装配 Service组件就是在获取 SpringMVC 的 IOC 容器时完成的,那么Spring创建IOC容器要先与SpringMVC的创建时间 ,才能完成自动装配。
SpringMVC的IOC容器是在 DispatcherServlet 初始化的过程中创建的,又 DispatcherServlet 注册的时候加入了 loadonstartup 标签,DispatcherServlet 初始化就提前到了服务器启动的时候。
服务器启动时三大组件执行顺序:监听器,过滤器,Servlet
SpringMVC 的 IOC 容器是在 Servlet 的初始化方法中执行的,那我们把获取 Spring 的 IOC 容器的代码放在过滤器或者监听器的初始化方法中执行,就可以保证在获取 SpringMVC 的 IOC 容器时, Spring 的 IOC 容器是提前创建好的,完成 Controller 中对 Service 自动装配。
但是,过滤器并不适合,过滤器是用来过滤当前的请求和响应,如果我们在过滤器的初始化方法中写了创建 Spring 的 IOC 容器的代码,那在执行过滤的方法中什么都不写,直接放行的话,那创建过滤器的意义就没有了。
创建过滤器的初始化方法,销毁方法我们完全可以不写,最主要的就是dofilter方法,但是现在我们的过滤器就执行了一个初始化方法,之后执行过滤的时候 dofilter 没有写任何代码,我们不能为了实现一个目的而忽视了组件的最初目的。
所以创建Spring的IOC容器只能交给监听器了。
监听器常见的分为三种:ServletContextListener,HttpSesionListener,HttpSessionAttributeListener,后两个是监听HttpSession的,只能使用第一种。
ServletContextListener里面有两个抽象方法ServletContext初始化方法,ServletContext销毁方法。
- public interface ServletContextListener extends EventListener {
- void contextInitialized(ServletContextEvent var1);
-
- void contextDestroyed(ServletContextEvent var1);
- }
Spring提供了监听器ContextLoaderListener,实现ServletContextListener接口,可监听
ServletContext的状态,在web服务器的启动,读取Spring的配置文件,创建Spring的IOC容器。
- public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
- public ContextLoaderListener() {
- }
-
- public ContextLoaderListener(WebApplicationContext context) {
- super(context);
- }
-
- public void contextInitialized(ServletContextEvent event) {
- this.initWebApplicationContext(event.getServletContext());
- }
-
- public void contextDestroyed(ServletContextEvent event) {
- this.closeWebApplicationContext(event.getServletContext());
- ContextCleanupListener.cleanupAttributes(event.getServletContext());
- }
- }
web 应用中必须在web.xml中配置
-
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
- listener>
-
-
- <context-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:spring.xmlparam-value>
- context-param>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0modelVersion>
-
- <groupId>com.atguigugroupId>
- <artifactId>ssmbuildartifactId>
- <version>1.0-SNAPSHOTversion>
-
- <packaging>warpackaging>
-
- <properties>
- <spring.version>5.3.1spring.version>
- properties>
-
- <dependencies>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-beansartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-jdbcartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-aspectsartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-testartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatisartifactId>
- <version>3.5.7version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatis-springartifactId>
- <version>2.0.6version>
- dependency>
-
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druidartifactId>
- <version>1.0.9version>
- dependency>
-
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.12version>
- <scope>testscope>
- dependency>
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>8.0.16version>
- dependency>
-
- <dependency>
- <groupId>log4jgroupId>
- <artifactId>log4jartifactId>
- <version>1.2.17version>
- dependency>
-
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>3.1.0version>
- <scope>providedscope>
- dependency>
-
- <dependency>
- <groupId>ch.qos.logbackgroupId>
- <artifactId>logback-classicartifactId>
- <version>1.2.3version>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- <version>2.12.1version>
- dependency>
-
- <dependency>
- <groupId>commons-fileuploadgroupId>
- <artifactId>commons-fileuploadartifactId>
- <version>1.3.1version>
- dependency>
-
- <dependency>
- <groupId>org.thymeleafgroupId>
- <artifactId>thymeleaf-spring5artifactId>
- <version>3.0.12.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelperartifactId>
- <version>5.2.0version>
- dependency>
- dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-compiler-pluginartifactId>
- <version>3.8.1version>
- <configuration>
- <source>1.8source>
- <target>1.8target>
- configuration>
- plugin>
- plugins>
- build>
- project>
- CREATE TABLE `t_emp` (
- `emp_id` int(11) NOT NULL AUTO_INCREMENT,
- `emp_name` varchar(20) DEFAULT NULL,
- `age` int(11) DEFAULT NULL,
- `sex` char(1) DEFAULT NULL,
- `email` varchar(50) DEFAULT NULL,
- PRIMARY KEY (`emp_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
相比单独的SpringMVC,整合时多配置了ContextLoaderListener,主要作用是Spring的监听器,在服务器启动的时候加载Spring的配置文件。
- <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_4_0.xsd"
- version="4.0">
-
-
- <filter>
- <filter-name>CharacterEncodingFilterfilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
-
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
- <init-param>
- <param-name>forceEncodingparam-name>
- <param-value>trueparam-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>CharacterEncodingFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
-
-
- <filter>
- <filter-name>HiddenHttpMethodFilterfilter-name>
- <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
- filter>
- <filter-mapping>
- <filter-name>HiddenHttpMethodFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
-
-
- <servlet>
- <servlet-name>DispatcherServletservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
-
- <init-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:springmvc.xmlparam-value>
- init-param>
-
- <load-on-startup>1load-on-startup>
- servlet>
- <servlet-mapping>
- <servlet-name>DispatcherServletservlet-name>
- <url-pattern>/url-pattern>
- servlet-mapping>
-
-
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
- listener>
-
-
- <context-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:spring.xmlparam-value>
- context-param>
- web-app>
需要什么组件在里面注册即可。
- <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:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
-
- <context:component-scan base-package="com.atguigu.ssm.controller"/>
-
-
- <bean id="viewResolver"
- class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
- <property name="order" value="1"/>
- <property name="characterEncoding" value="UTF-8"/>
- <property name="templateEngine">
- <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
- <property name="templateResolver">
- <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
-
- <property name="prefix" value="/WEB-INF/templates/"/>
-
- <property name="suffix" value=".html"/>
- <property name="templateMode" value="HTML5"/>
- <property name="characterEncoding" value="UTF-8" />
- bean>
- property>
- bean>
- property>
- bean>
-
-
- <mvc:default-servlet-handler/>
-
-
- <mvc:annotation-driven/>
-
-
- <mvc:view-controller path="/" view-name="index"/>
-
-
- <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
-
-
- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"/>
- beans>
这里解释一下以下三者的关系,顺便复习一下前面的知识
-
- <mvc:default-servlet-handler/>
-
-
- <mvc:annotation-driven/>
-
-
- <mvc:view-controller path="/" view-name="index"/>
配置
对于这个问题 Spring MVC 在全局配置文件中提供了一个
只配置
只配置
配置
- jdbc.driver=com.mysql.cj.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/ssm
- jdbc.username=root
- jdbc.password=12345
其余的配置都在Spring配置文件中,这里面的所有内容都可以在Spring配置文件中配置,我配置了一部分。
- 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>
- public interface EmpMapper {
- List
getAllEmp(); - }
- mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.atguigu.ssm.mapper.EmpMapper">
- <select id="getAllEmp" resultType="emp">
- select * from t_emp
- select>
- mapper>
- log4j:configuration SYSTEM "log4j.dtd">
-
- <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
- <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
- <param name="Encoding" value="UTF-8" />
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n" />
- layout>
- appender>
- <logger name="java.sql">
- <level value="debug" />
- logger>
- <logger name="org.apache.ibatis">
- <level value="info" />
- logger>
- <root>
- <level value="debug" />
- <appender-ref ref="STDOUT" />
- root>
- log4j:configuration>
SpringMVC扫描的是controller包,Spring就要把其他的包扫描了
- <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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
-
-
- <context:component-scan base-package="com.atguigu.ssm">
-
-
- <context:exclude-filter type="assignable" expression="com.atguigu.ssm.controller.EmpController"/>
- context:component-scan>
-
-
- <context:property-placeholder location="classpath:jdbc.properties"/>
-
-
- <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>
-
-
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"/>
- bean>
-
-
- <tx:annotation-driven transaction-manager="transactionManager"/>
-
-
- <bean class="org.mybatis.spring.SqlSessionFactoryBean">
-
- <property name="configLocation" value="classpath:mybatis-config.xml"/>
-
- <property name="dataSource" ref="dataSource"/>
-
- <property name="typeAliasesPackage" value="com.atguigu.ssm.pojo"/>
-
- <property name="mapperLocations" value="classpath:mappers/*.xml"/>
-
- <property name="plugins">
- <array>
- <bean class="com.github.pagehelper.PageInterceptor"/>
- array>
- property>
- bean>
-
-
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="com.atguigu.ssm.mapper"/>
- bean>
- beans>
- public class Emp {
-
- private Integer empId;
-
- private String empName;
-
- private Integer age;
-
- private String sex;
-
- private String email;
-
- public Emp() {
- }
-
- public Emp(Integer empId, String empName, Integer age, String sex, String email) {
- this.empId = empId;
- this.empName = empName;
- this.age = age;
- this.sex = sex;
- this.email = email;
- }
-
- public Integer getEmpId() {
- return empId;
- }
-
- public void setEmpId(Integer empId) {
- this.empId = empId;
- }
-
- public String getEmpName() {
- return empName;
- }
-
- public void setEmpName(String empName) {
- this.empName = empName;
- }
-
- public Integer getAge() {
- return age;
- }
-
- public void setAge(Integer age) {
- this.age = age;
- }
-
- public String getSex() {
- return sex;
- }
-
- public void setSex(String sex) {
- this.sex = sex;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- @Override
- public String toString() {
- return "Emp{" +
- "empId=" + empId +
- ", empName='" + empName + '\'' +
- ", age=" + age +
- ", sex='" + sex + '\'' +
- ", email='" + email + '\'' +
- '}';
- }
- }
- @Controller
- public class EmpController {
-
- @Autowired
- private EmpService empService;
-
- @RequestMapping(value = "/emps",method = RequestMethod.GET)
- public String getAllEmp(Model model){
- List
emps = empService.getAllEmp(); - model.addAttribute("emps",emps);
- return "emp_list";
- }
- }
- public interface EmpService {
- List
getAllEmp(); - }
- @Service
- @Transactional //事务注解
- public class EmpServiceImpl implements EmpService {
-
- @Autowired
- private EmpMapper empMapper;
-
- @Override
- public List
getAllEmp() { - List
emps = empMapper.getAllEmp(); - return emps;
- }
- }
index.html
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>首页title>
- head>
- <body>
- <h1>首页h1>
- body>
- html>
emp_list.html
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>员工列表title>
- head>
- <body>
- <table>
- <tr>
- <th colspan="6">员工列表th>
- tr>
- <tr>
- <th>流水号th>
- <th>员工姓名th>
- <th>年龄th>
- <th>姓别th>
- <th>邮箱th>
- <th>操作th>
- tr>
- <tr th:each="employee : ${emps}">
- <td th:text="${employee.empId}">td>
- <td th:text="${employee.empName}">td>
- <td th:text="${employee.age}">td>
- <td th:text="${employee.sex}">td>
- <td th:text="${employee.email}">td>
- <td>
- <a href="">删除a>
- <a href="">修改a>
- td>
- tr>
- table>
- body>
- html>
SSM整合核心有以下几点:
其余的配置与单独使用时基本一致。