SpringMVC监听器

WebAppRootListener

  1. WebAppRootListener的作用就是监听web.xml中的配置<context-param> 下<param-name>webAppRootKey</param-name>的值
  2. 有如下的使用场景:
  • web项目上传下载时,获取项目根路径常用的方式是:1、Servlet的request.getRealPath(“/”);2、request.getServletContext().getRealPath("/");3、struts2的ServletActionContext获取
  • 上面方式的弊端是在页面没有向后台请求,而是在例如定时器定等地方时则无法获取,而SpringMVC的WebAppRootListener则可以完美解决它

项目开发

一:在web项目的web.xml中写入如下配置

  1. 值得注意的是<param-name>的webAppRootKey必须写死

SpringMVC监听器

二:在项目任何地方取值

  1. System.getProperty("xxx")获取的值,和使用平时的request.getRealPath("/")是一样的

SpringMVC监听器

运行流程

  1. WebAppRootListener监听器会在web上下文初始化的时候,利用servletContext得到物理路径,String path=servletContext.getRealPath("/"); 
  2. 然后找到context-param的webAooRootKey对应的param-value,把param-value的值作为key, 接着执行System.setProperty(<param-value>的值,path)
  3. 这样在整个web中就可以使用System.getProperty(<param-value>的值)来获取服务器的绝对路径

补充说明

  1. 如果只配置了监听器,没有配置webAppRootKey, 默认wenAppRootKey对应的param-value的值为webapp.root
  2. 上面得到系统路径是SpringMVC的做法,其实我们自己也可以写一个监听器,然后得到物理路径后手动放入System中,之后同样可以取
/**
 * Created by Administrator on 2018/4/20 0020.
 * 应用启动、关闭监听器
 */
public class AppListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        /** 照样可以获取到值,然后便可以放入到System中了
         */
        String realPath = servletContextEvent.getServletContext().getRealPath("");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

ContextLoaderListener

一:使用SpringMVC时,都会用到它的核心功能IOC与DI

二:Spring Web中,IOC容器初始化,就会存放我们注入的各种对象,然后供我们以后取用

三:使用方式非常简单,同样只需要在web.xml中配置即可,目的就是用于初始化Spring核心配置文件

SpringMVC监听器

四:那么beans.xml中SpringMVC容器初始化好的实例,以及整个配置文件是如何被找到,或者何时被运行的呢?就是因为在web.xml中配置了ContextLoaderListener监听器

SpringMVC监听器

五:ContextLoaderListener监听器其实就是类似平时我们自己写的监听器,它同样是实现了Servlet的ServletContextListener监听器接口,然后在初始化方法进行初始化操作而已

SpringMVC监听器