Web 项目 tiger 之14 注册 Servlet 三大组件之 Listener

Listener 简述

  1. listener 基于观察者模式,与 AWT、Swing  编程,以及 Javascript 事件编程类似
  2. javax.servlet 中当服务器启动或关闭,创建或关闭Session,或容器范围、Session范围添加属性时,Servlet 容器内部会调用监听器处理程序
  3. 与 Servlet 的 Filter 一样只需要实现相应接口及其方法即可,以前是在 wbn.xml 中进行配置,现在 Spring Boot 改用注册 ServletListenerRegistrationBean
  • 本文不对 Listener 的知识进行深入,重点说明如何使用 Spring Boot 来使用 Servlet 的监听器

自定义监听器

package com.lct.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * Created by Administrator on 2018/8/11 0011.
 * 标准 Servlet 监听器,实现 javax.servlet.ServletContextListener 接口
 * 然后实现方法
 * ServletContextListener:属于 Servlet 应用启动关闭监听器,监听容器初始化与销毁
 */
public class SystemListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("com.lct.listener.SystemListener::服务器启动.....");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("com.lct.listener.SystemListener::服务器关闭.....");
    }
}

ServletListenerRegistrationBean

  • 注册 ServletListenerRegistrationBean
package com.lct.config;

import com.lct.component.MyLocaleResolve;
import com.lct.filter.SystemFilter;
import com.lct.listener.SystemListener;
import com.lct.servlet.BookServlet;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;

import java.util.Arrays;

/**
 * Created by Administrator on 2018/7/28 0028.
 * 自定义配置类
 */
@Configuration
public class MyMvcConfig {

    /**
     * 将我们自己的 LocaleResolver 组件交于 Spring 容器管理
     * 从而覆盖 Spring Boot默认的区域信息解析器
     *
     * @return
     */
    @Bean
    public LocaleResolver localeResolver() {
        return new MyLocaleResolve();
    }

    /**
     * 自定义嵌入式Servlet容器定制器组件
     * 然后修改应用上下文路径以及 Tomcat 端口
     *
     * @return
     */
    @Bean
    public WebServerFactoryCustomizer webServerFactoryCustomizer() {
        /**
         * 使用 ConfigurableServletWebServerFactory
         */
        return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
            @Override
            public void customize(ConfigurableServletWebServerFactory configurableServletWebServerFactory) {
                /**
                 * 修改应用上下文路径以及 Tomcat 端口
                 */
                configurableServletWebServerFactory.setContextPath("/cat");
                configurableServletWebServerFactory.setPort(8084);
            }
        };
    }

    /**
     * 注册 Servlet 三大组件 之  Servlet
     * 添加 ServletRegistrationBean ,就相当于以前在 web.xml 中配置的 <servlet></servlet>标签
     */
    @Bean
    public ServletRegistrationBean myServlet() {
        /**第二个参数是个不定参数组,可以配置映射多个请求
         * 相当于以前在 web.xml中配置的 <servlet-mapptin></servlet-mapptin>*/
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new
                BookServlet(), "/bookServlet");
        return registrationBean;
    }


    /**
     * 注册 Servlet 三大组件 之  Filter (过滤器)
     * 添加 FilterRegistrationBean ,就相当于以前在 web.xml 中配置的 <filter></filter> 标签
     */
    @Bean
    public FilterRegistrationBean myFilter() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        /**同样添加自定义的 Filter*/
        registrationBean.setFilter(new SystemFilter());
        /**然后设置过滤的路径,参数是个集合 ,相当于 web.xml中配置的 <filter-mapptin></filter-mapptin>
         * "/*": 表示过滤所有 get 与 post 请求*/
        registrationBean.setUrlPatterns(Arrays.asList("/*"));
        /**
         * setDispatcherTypes 相当于 web.xml 配置中 <filter-mapptin> 下的 <dispatcher> 标签
         * 用于过滤非常规的 get 、post 请求
         * REQUEST:默认方式,写了之后会过滤所有静态资源的请求
         * FORWARD:过滤所有的转发请求,无论是 jsp 中的 <jsp:forward</>、<%@ page errorPage= %>、还是后台的转发
         * INCLUDE:过滤 jsp 中的动态包含<jsp:include 请求
         * ERROR:过滤在 web.xml 配置的全局错误页面
         * 了解即可,实际中也很少这么做
         */
//        registrationBean.setDispatcherTypes(DispatcherType.REQUEST);
        return registrationBean;
    }


    /**
     * 注册 Servlet 三大组件 之  Listner
     * 添加 ServletListenerRegistrationBean ,就相当于以前在 web.xml 中配置的 <listener></listener>标签
     */
    @Bean
    public ServletListenerRegistrationBean myListener() {
        /**ServletListenerRegistrationBean<T extends EventListener> 属于的是泛型,可以注册常见的任意监听器
         * 将自己的监听器注册进来*/
        ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(new SystemListener());
        return registrationBean;
    }
}

运行测试

  • 关闭的时候如果点击“红色按钮”,则相当于电脑直接拔电源是一样的,就看不到服务器正常关闭了

.AnnotationConfigServletWebServerApplicationContext@143640d5: startup date [Sat Aug 11 12:31:11 CST 2018]; root of context hierarchy
2018-08-11 12:31:18.638  INFO 1416 --- [       Thread-3] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
javax.servlet.Filter::服务器关闭....
com.lct.listener.SystemListener::服务器关闭.....

Process finished with exit code 1

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/81585375