SpringMVC(9)——SSM整合

目录

前言

ContextLoaderListener监听器

前置工作(创建SSM项目并创建spring_listenner模块)

SSM入门

SSM正式整合

(前置工作)创建新的模块ssm

SSM整合Spring、SpringMVC

SSM整合Mybatis框架

SSM整合事务

(实践)SSM整合实现页面展示所有员工信息

(实践)SSM整合实现页面通过分页方式展示所有员工信息,并设置分页跳转的超链接


前言

  • 已经学习了Mybatis、spring、springMVC框架,现在需要把他整合
  • SpringMVC是一个表述层框架,用于接收浏览器的请求、参数、资源,然后将服务器的数据响应给浏览器
  • Mybatis帮我们连接数据库进行增删改查
  • spring是一个整合型框架,通过IOC容器管理对象(Mybatis的SqlSesion对象)和AOP(实现Mybatis的声明式事务)
  • Mybatis组件可以通过spring进行管理、springMVC与spring是同源的,他们可以用同一个配置文件(使用同一个IOC容器)也就是不整合;反而言之也可以不用同一个配置文件,也就是各自用各自的配置文件(spring一个IOC容器ApplicationContext,springMVC一个IOC容器WebApplicationContext),通过各自配置文件来自行管理自己的组件。推荐使用整合方式
  • 回顾之前我们在使用Spring的时候,都是通过手动代码获取IOC容器,然后再获取一个Bean进行操作,因为当时是在java代码,因此我们可以通过测试类手动创建spring的IOC容器。
    public class TestSpring5 {
        @Test
        public void testAdd() {
            //1 加载 spring 配置文件,ClassPathXmlApplicationContext()的configLocation参数是以src目录基础的
            ApplicationContext context =
                    new ClassPathXmlApplicationContext("bean1.xml");
            //2 获取配置后创建的对象,参数分别为配置文件的标签的id属性值,还有要创建的类Class实例.用于创建运行时类
            User user = context.getBean("user", User.class);
            System.out.println(user);//com.atguigu.spring5.User@436e852b
            user.add();//add......
        }
    }
    但是后面变成了Web模块,也就是SpringMVC的IOC容器是在web.xml中配置DispathcerServlet前端控制器的时候初始化创建的,他是专门用来管理控制层Controller的组件(常用SpringMVC控制层组件:HandlerMapping、Handler、HandlerAdapter、ViewResolver、View)
  • 那么剩下的业务层、持久层的组件就要交给Spring的IOC容器管理。但是我们发现我们控制层在调用业务层进行代码操作时,是需要依赖业务层的组件的(例如:@Autowired注入一个Service层的Bean作为成员变量进行操作,这种叫自动装配,是在获取Spring的IOC容器的Bean才能完成的)
  • 至此我们发现springMVC的IOC有Controller有关的组件、Spring的IOC有Service和Dao有关的组件,我们SpringMVC的Controller层需要调用Spring的Service层,也就是Controller需要完成Service自动装配,那就是说SpringMVC依赖于Spring,Spring要比SpringMVC的IOC容器先要创建,也就是在DispathcerServlet初始化前先创建,这时候就会延伸到Web三大组件和执行顺序(监听器Listener-->过滤器Filter-->Servlet),需要通过Listener来实现Spring的IOC容器在DispathcerServlet之前创建(不使用过滤器因为Spring的IOC容器创建代码只需要执行一次,不需要每个请求进来都执行拦截和放行)

ContextLoaderListener监听器

  • 监听器常见有三种:ServletContextListener(第一个是监听ServletContext状态,里面有ServletContext初始化和销毁两个抽象方法,实际上就是用来监听服务器的启动和关闭执行的最早一个方法)、HttpSessionListener、ServletContextAttributeListener(后两个都是监听HttpSession状态),分析源码
    public class ContextLoaderListener extends ContextLoader implements ServletContextListener{
    
    ...
    
    	@Override
    	public void contextInitialized(ServletContextEvent event) {
    		initWebApplicationContext(event.getServletContext());//创建一个Web应用的IOC容器,进入该方法
    	}
    
    
    ...
    
    -->
    
    public class ContextLoader {
    
    ...
    
    	public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {
    		if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {
    			throw new IllegalStateException(
    					"Cannot initialize context because there is already a root application context present - " +
    					"check whether you have multiple ContextLoader* definitions in your web.xml!");
    		}
    
    		servletContext.log("Initializing Spring root WebApplicationContext");
    		Log logger = LogFactory.getLog(ContextLoader.class);
    		if (logger.isInfoEnabled()) {
    			logger.info("Root WebApplicationContext: initialization started");
    		}
    		long startTime = System.currentTimeMillis();
    
    		try {
    			// Store context in local instance variable, to guarantee that
    			// it is available on ServletContext shutdown.
    			if (this.context == null) {
    				this.context = createWebApplicationContext(servletContext);//真正执行创建IOC容器的方法
    			}
    			if (this.context instanceof ConfigurableWebApplicationContext) {
    				ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) this.context;
    				if (!cwac.isActive()) {
    					// The context has not yet been refreshed -> provide services such as
    					// setting the parent context, setting the application context id, etc
    					if (cwac.getParent() == null) {
    						// The context instance was injected without an explicit parent ->
    						// determine parent for root web application context, if any.
    						ApplicationContext parent = loadParentContext(servletContext);
    						cwac.setParent(parent);
    					}
    					configureAndRefreshWebApplicationContext(cwac, servletContext);
    				}
    			}
    			servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
    
    			ClassLoader ccl = Thread.currentThread().getContextClassLoader();
    			if (ccl == ContextLoader.class.getClassLoader()) {
    				currentContext = this.context;
    			}
    			else if (ccl != null) {
    				currentContextPerThread.put(ccl, this.context);
    			}
    
    			if (logger.isInfoEnabled()) {
    				long elapsedTime = System.currentTimeMillis() - startTime;
    				logger.info("Root WebApplicationContext initialized in " + elapsedTime + " ms");
    			}
    
    			return this.context;
    		}
    		catch (RuntimeException | Error ex) {
    			logger.error("Context initialization failed", ex);
    			servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);//将IOC容器放到最大的应用域servletContext中
    			throw ex;
    		}
    	}
    
    ...
    
    }
  • 现在我们就是通过监听器监听ServletContext状态,判断服务器初始化启动,先加载Spring的配置文件、来创建Spring的IOC容器,然后在DispathcerServlet在初始化时完成Service层在Controller层的自动装配,也完成了SpringMVC的IOC容器创建,并且会设置SpringMVC的容器是Spring容器的子类,也就是完成SSM的SS整合,Spring和SpringMVC各自各自的配置文件及IOC容器。如果只是单纯SpringMVC,那么springMVC容器就是最高级的容器。子容器是可以访问父容器的,也就是springMVC组件(Bean)可以访问spring的组件(Bean),但是父容器不能访问子容器的(Bean),这里之前的文章DispathcerServlet初始化的时候提及过
  • Spring提供了监听器ContextLoaderListener实现类,他实现ServletContextListener接口,可监听ServletContext的状态,在web服务器的启动后第一个启动的方法(Serlvet初始化的方法中,比DispathcerServlet要早),读取Spring的配置文件,创建Spring的IOC容器,web应用中必须在web.xml中配置。监听器配置参考如下代码写在web.xml的根元素里面的内容
        
            
            org.springframework.web.context.ContextLoaderListener
        
        
        
            contextConfigLocation
            classpath:spring.xml
        
    

前置工作(创建SSM项目并创建spring_listenner模块)

  1. 创建项目
    SpringMVC(9)——SSM整合_第1张图片
  2. pom.xml
    
    
        4.0.0
    
        com.atguigu
        spring_listener
        1.0-SNAPSHOT
        
            8
            8
        
        war
    
        
            
            
                org.springframework
                spring-webmvc
                5.3.1
            
            
            
                ch.qos.logback
                logback-classic
                1.2.3
            
            
            
                javax.servlet
                javax.servlet-api
                3.1.0
                provided
            
            
            
                org.thymeleaf
                thymeleaf-spring5
                3.0.12.RELEASE
            
        
    
    
    
  3. 添加web模块的SpringMVC(9)——SSM整合_第2张图片

SSM入门

  • 目的:创建springMVC和Spring的配置文件,然后把控制层交给SpringMVC进行管理,将业务层交给Spring管理,当Controller可以正常访问Service层时,说明Spring在Listener创建容器是没有问题的
  1. web.xml,配置springMVC的DispathcerServlet和Listener初始化Spring

    
    

你可能感兴趣的:(SpringMVC,SSM,Mybatis,mybatis,spring,java,springMVC,SSM)