ContextLoaderListener

ContextLoaderListenerSSM,ssm整合,ContextLoaderListener

简介

Spring提供了监听器ContextLoaderListener,实现ServletContextListener接口,可监听 ServletContext的状态,在web服务器的启动,读取(加载)Spring的配置文件,创建Spring的IOC容器。必须在web.xml中配置。

本文章就是测试一下ContextLoaderListener能否使用。因为自己在看尚硅谷杨博超老师的视频时,虽然跟着操作,但一致报404,很烦,所以,在此记录一下成功创建的过程。

为什么使用ContextLoaderListener?

主要原因是在整合Spring和SpringMVC时遇到了问题。

SpringMVC 是表述层框架,处理请求并将结果响应给浏览器。

Mybatis是持久层框架,操作数据库。

Spring 是整合型框架,通过IOC来管理对象,通过AOP增强功能(如事务管理)。

Spring和SpringMV是同一个家族的,Spring和SpringMVC可以整合也可以不整合,不整合就是二者使用同一个IOC容器。整合就是各自用各自的IOC容器,分别管理自己的对象。

推荐整合。

SpringMVC的IOC管理的对象是控制层的对象。其他对象如service层对象、dao层对象等都要交给Spring的IOC管理。我们知道,SpringMVC的控制层要依赖于service层对象(组件),需要使用自动装配,自动装配后就可以在控制层使用service层对象了。要想装配成功,Spring的IOC中要有service层对象,也就是Spring的IOC要提前创建好,优先于SpringMVC的IOC的创建。

如何保证Spring的IOC 的创建 优先于 SpringMVC的IOC 的创建 ?

由于SpringMVC的IOC是在DispatcherServlet初始化时创建的,所以Spring的IOC的创建一定要在DispatcherServlet初始化之前创建,那要把创建Spring的IOC 的代码放到哪呢?

我们知道,服务器的三大组件的执行顺序是:监听器—-》过滤器——》Servlet

所以,可以放到监听器里——-ContextLoaderListener,上下文加载监听器。

1.创建Maven Module

环境:IDEA2022.2 maven版本3.8.6
图1.1

步骤1

新建一个普通工程,然后,右击工程—-》 new—》module—->点击左侧Maven Archetype。然后按下图的提示填写信息。重点是ArcheType 要选择webapp这个模板。
在这里插入图片描述
创建完成后结果如下:
在这里插入图片描述

和我不一样也没关系,后面会删除和增加一些东西。接着往下走

步骤二 添加依赖

点击pom.xml,添加如下依赖.

添加依赖时一定要连网,这样才能从远程仓库里将依赖下载到你电脑的工程模块里

  <dependencies>
    <!-- SpringMVC -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.1</version>
    </dependency>
    <!-- 日志 -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
    <!-- ServletAPI -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <!-- Spring5和Thymeleaf整合包 -->
    <dependency>
      <groupId>org.thymeleaf</groupId>
      <artifactId>thymeleaf-spring5</artifactId>
      <version>3.0.12.RELEASE</version>
    </dependency>
  </dependencies>

在这里插入图片描述

2 配置web.xml

在web.xml里配置SpringMVC的前端控制器 DispatcherServlet监听器 ContextLoaderListener。

整个web.xml 如下:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!--自定义Spring配置文件的位置和名称-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring.xml</param-value>
  </context-param>
  <listener>
    <!-- 配置Spring的监听器,在服务器启动时加载Spring的配置文件 Spring配置文件默认位置和名称:/WEB-INF/applicationContext.xml 可通过上下文参数自定义Spring配置文件的位置和名称 -->
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>



  <!--配置SpringMVC的前端控制器 ,对浏览器发送的请求统一进行处理-->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--设置DispatchServlet加载配置文件的路径和名字。设置后,配置文件就可以放到resources目录下了.SpringMVC.xml就是配置文件的名字-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:SpringMVC.xml</param-value>
    </init-param>
    <!--将DispatcherServlet的初始化时间提前到服务器启动时-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 设置springMVC的核心控制器所能处理的请求的请求路径 url-pattern中 / 和 /*的区别; /:匹配浏览器向服务器发送的所有请求(不包括.jsp),因为DispatcherServlet处理不了.jsp请求,.jsp请求得由 Tomcat里自带的JspServlet处理。 /*:匹配浏览器向服务器发送的所有请求(包括.jsp) -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

3 配置SpringMVC.xml

在resources下创建SpringMVC.xml。

注意:因为在web.xml里指定了SpringMVC的配置文件必须放到resources下,且名字必须为SpringMVC.xml

SpringMVC.xml里要配置的东西

  • 开启扫描扫描控制层组件
  • Thymeleaf视图解析器
  • 视图控制器

为了防止废话太多,直接给出 完整的SpringMVC.xml
(里面所需的东西如index.html、Controller包会在后面的步骤路创建,别急)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启SpringMVC的扫描。扫描控制层组件-->
    <context:component-scan base-package="com.atguigu.srpingmvc.controller"></context:component-scan>
    <!-- 配置Thymeleaf视图解析器 -->
    <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的注解驱动 -->
    <mvc:annotation-driven/>
    <!-- 配置视图控制器。实现访问首页-->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>
</beans>

4 配置spring.xml

在resources下创建spring.xml。

注意:因为在web.xml里指定了Spring的配置文件必须放到resources下,且名字必须为sping.xml

此例子,在Spring的配置文件里只需开启Spring的注解扫描即可。
SpringMVC的注解扫描 的范围是 controller包。
Spring的注解扫描 的范围 是service包和dao包. 我的例子中没创建dao包,所以,只扫描到了service.impl。根据你的需要修改Spring注解的扫描范围。

<?xml version="1.0" encoding="UTF-8"?>
<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" 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">
<!-- 开启Spring的注解-->
    <context:component-scan base-package="com.atguigu.srpingmvc.service.impl"></context:component-scan>
</beans>

5 创建其他组件

在这里插入图片描述
HelloService接口:

public interface HelloService { 
   
}

HelloServiceImpl类实现HelloService接口:

@Service    //声明为组件,放到IOC中管理
public class HelloServiceImpl implements HelloService { 
   
}

HelloController类:

@Controller  //声明为组件,放到IOC中管理
public class HelloController { 
   
    @Autowired //自动装配。
    private HelloService helloService;
}

index.html
在index.html里面随便写点东西就行。写完index.html后,在SpringMVC.xml里添加如下配置.(上面给出的SpringMVC.xml已经是完整的了,已经添加过了)

     <!-- 开启mvc的注解驱动 -->
    <mvc:annotation-driven/>
    <!-- 配置视图控制器。实现访问首页-->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>

配置Tomcat后,只要能访问到这个index.html,就说明我们配置成功了。

6 整个目录结构图

按照上面步骤,最后得到如下的一个Maven Module。
在这里插入图片描述

7 配置Tomcat

能学到SSM框架的,这个应该都会吧。

2 启动TomCat进行测试

启动Tomcat,如果能访问到index.html,说明成功了。

对于本例,成功实现了:SpingMVC的IOC容器管理Controller组件(对象),Spring的IOC容器管理Service组件,二者的IOC是独立的。也实现了自动装配。

今天的文章ContextLoaderListener分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/24206.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注