前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、listener监听

1、ServletRequest监听

ServletRequestListenerServletRequestAttributeListener

ServletRequestListener可见监听Request的创建和销毁;

ServletRequestAttributeListener可以对Request的属性进行监听。

2、HttpSession监听

HttpSessionListenerHttpSessionAttributeListener

HttpSessionListener可以监听HttpSession的创建跟销毁,
HttpSessionAttributeListener则是对session中属性的监听,它可以监听到session新增属性、移除属性和属性值被替换时。

3、ServletContext监听

ServletContextListenerServletContextAttributeListener

ServletContextListener可以监听到ServletContext的创建和销毁,
ServletContextAttributeListener可以监听到ServletContext中属性的新增、移除和属性值的替换。

2、启用上面Listener监听

使用 @ServletComponentScan注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。

/**
 * 使用 @ServletComponentScan注解后,Servlet、Filter、Listener
 * 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。
 **/
@ServletComponentScan
@SpringBootApplication
public class AdminApplication {
    public static void main(String[] args) {
        SpringApplication.run(AdminApplication.class, args);
    }
}


3、ServletContext监听

3.1、ServletContextListener

3.1.1、contextInitialized

当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,

作用:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

1、ServletContext 对象是一个为整个 web 应用提供共享的内存,任何请求都可以访问里面的内容 2、如何实现在服务启动的时候就动态的加入到里面的内容:我们需要做的有:   1 ) 实现 servletContextListerner 接口 并将要共享的通过 setAttribute ( name,data )方法提交到内存中去   ; 2 )应用项目通过 getAttribute(name) 将数据取到 。


@Override
public void contextInitialized(ServletContextEvent sce) {
   System.out.println("ServletContext initialized");
}
     

3.1.2、contextDestroyed

当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器(比如直接停止虚拟机运行)

@Override
public void contextDestroyed(ServletContextEvent sce) {
   System.out.println("ServletContext destroyed");
}
   

3.2、ServletContextAttributeListener

直接看也应该很好懂


@Override
public void attributeAdded(ServletContextAttributeEvent event) {
   System.out.println("ServletContext attribute added");
}

@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
   System.out.println("ServletContext attribute removed");
}

@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
   System.out
}

3.3、测试

3.3.1、创建一个监听


package com.hlj.moudle.servletcontext;

/**
 * 作者 :HealerJean
 * 日期 :2019/2/20  下午1:07.
 * 类描述:
 */
import javax.servlet.*;
import javax.servlet.annotation.WebListener;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * ServletContext监听器和ServletContext属性监听器
 *
 */
@WebListener
public class ContextListener implements ServletContextAttributeListener, ServletContextListener {

    /**
     * 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext destroyed");
    }

    /**
     * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,
     * 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
     *
     * 作用:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
     *
     * 1、ServletContext 对象是一个为整个 web 应用提供共享的内存,任何请求都可以访问里面的内容
     * 2、如何实现在服务启动的时候就动态的加入到里面的内容:我们需要做的有:  
     *  1 ) 实现 servletContextListerner 接口 并将要共享的通过 setAttribute ( name,data )方法提交到内存中去   ;
     *  2 )应用项目通过 getAttribute(name) 将数据取到 。
     *
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {

        ServletContext sct=sce.getServletContext();
        Map<Integer,String> depts=new HashMap<Integer,String>();
        sct.setAttribute("dept", depts);

        System.out.println("ServletContext initialized");
    }



    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("ServletContext attribute added");
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        System.out.println("ServletContext attribute removed");
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        System.out.println("ServletContext attribute replaced");
    }

}

3.3.2、启动服务器

我们可以看到这里打印了两次attributeAdded,因为一开始启动服务器,就会在ServletContext 添加一些默认值,所以会先进入它

然后进入contextInitialized,的时候,代码中有添加的操作,所以会再次进入

2019-02-20 13:36:45.333 [localhost-startStop-1] INFO  o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
ServletContext attribute added
ServletContext attribute added
ServletContext initialized
2019-02-20 13:37:28.898 [main] INFO  s.d.s.w.PropertySourcedRequestMappingHandlerMapping - Mapped URL path [/demo/swagger] onto method [public org.springframework.http.ResponseEntity<springfox.documentation.spring.web.json.Json> springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)]
2019-02-20 13:37:29.483 [main] INFO  s.d.s.w.p.DocumentationPluginsBootstrapper - Context refreshed
2019-02-20 13:37:29.502 [main] INFO  s.d.s.w.p.DocumentationPluginsBootstrapper - Found 1 custom documentation plugin(s)

3.3.3、关闭服务器

2019-02-20 13:37:29.734 [main] INFO  com.hlj.AdminApplication - Started AdminApplication in 46.565 seconds (JVM running for 47.508)
Disconnected from the target VM, address: '127.0.0.1:56548', transport: 'socket'
ServletContext destroyed

ContactAuthor