一、spring搭建web项目环境

1、存在问题

  • 做的是javase项目的有main方法,在main方法里面创建ApplicationContext对象,即可获得想要的对象
  • 而web项目没有main方法,在tomcat上运行,tomcat一启动,项目一直运行
    • 所以容器的创建就需要换一种方式
  • 注意:maven创建的web项目的web.xml里面的Servlet版本很低很低,所以要从别的地方复制过来一份4.0版本的

    2、解决问题

  • 使用监听器的功能,可以避免在每一次调用Controller 的时候创建ApplicationContext对象 把spring容器放到全局作用域对象中去【ServletContext】

  • 监听器作用
  • 创建容器对象,执行 ApplicationContext ac = new ClassPathApplicationContext("application-context.xml");
  • 把容器对象放入到 ServletContext中,ServletContext.setAttribute(key,ac);

    3、代码实现

    监听器可以自己创建,也可以使用框架中提供好的ContextLoaderListener

  1. 为了使用框架自动提供好的监听器,首先添加依赖

    1. <!--spring的监听器-->
    2. <dependency>
    3. <groupId>org.springframework</groupId>
    4. <artifactId>spring-web</artifactId>
    5. <version>5.2.8.RELEASE</version>
    6. </dependency>
  2. 在web.xml注册监听器

    1. <listener>
    2. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    3. </listener>
    4. 监听器被创建以后,会读取 /WEB-INF/applicationContext.xml 文件
    5. (1) 因为监听器里面要创建ApplicationContext对象,那么他需要加载配置文件,
    6. (2) 而 /WEB-INF/applicationContext.xml 是监听器默认读取spring配置文件的路径

    在项目中我们一般都修改默认文件的位置, 使用context-param重新指定文件的位置【web.xml文件中配置】

    1. <context-param>
    2. <!--param-name:表示配置文件的路径,相当于变量名-->
    3. <param-name>contextContextLocation</param-name>
    4. <!--自定义配置文件的路径-->
    5. <param-value>classpath:spring.xml</param-value>
    6. </context-param>

配置完之后就可以在controller类里面获取到容器后,就可以用了【不用 用下面的功能方法】

  1. WebApplicationContext wac = null;
  2. String key = WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE;
  3. Object attr = getServletContext().getAttribute(key);
  4. If(attr ! = null){
  5. Wac = (WebApplicationContext) attr;
  6. }
  7. 此时 wac就是spring容器 就可以直接往里面getBean()

spring提供的工具方法(常用)获取容器对象

  1. WebApplicationContext wac = null;
  2. ServletContext sc = getServletContext();
  3. //这样就得到spring容器
  4. wac = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);

未命名图片.png