Listener 简述
- listener 基于观察者模式,与 AWT、Swing 编程,以及 Javascript 事件编程类似
- javax.servlet 中当服务器启动或关闭,创建或关闭Session,或容器范围、Session范围添加属性时,Servlet 容器内部会调用监听器处理程序
- 与 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