zoukankan      html  css  js  c++  java
  • java动态注册Filter,Servlet,Listener

    1、使用servlet提供的ServletContext

    创建一个简单项目有如下结构:

    有过滤器TestFilter,监听器TestListener,和一个TestServlet,动态注册这三个组件就需要使用javax.servlet包下的ServletContainerInitializer接口,这个接口是Servlet3.0之后提供的,利用SPI机制可以在容器启动时执行该接口的实现类来进行一些初始化工作,因此可以在实现类中来动态注册Servlet 、Filter、Listener等组件。

    在TestServletContainerInitializer类中实现这个接口,并实现onStartup方法:

    public class TestServletContainerInitializer implements ServletContainerInitializer {
    
        /**
         *
         * @param set 这个参数得到的是实现了ServletContainerInitializer接口的所有实现类
         * @param servletContext servlet上下文,通过上下文对象来实现动态注册
         * @throws ServletException
         */
        @Override
        public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
            //注册Servlet,参数一指定servlet-name,参数二指定servlet-class
            //这个方法返回一个动态注册器
            ServletRegistration.Dynamic reg = servletContext.addServlet("test", TestServlet.class);
            //添加请求映射(相当于配置url-pattern)
            reg.addMapping("/test");
    
            //注册监听器
            servletContext.addListener(TestListener.class);
    
            //注册过滤器
            //该方法返回一个动态注册器
            FilterRegistration.Dynamic filterReg =  servletContext.addFilter("testFilter", TestFilter.class);
            /**
             * 映射请求的url
             * 参数一:表示请求或者转发或者包含时会经过这个过滤器
             * 参数二:表示动态配置的过滤器是否优先于web.xml中配置的过滤器
             * true表示优先
             * 参数三:请求过滤的url
             */
            filterReg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
        }
    }

    2、使用Spring提供的ServletContext:

    在Spring中,提供了AbstractAnnotationConfigDispatcherServletInitializer类专门用于取代web.xml,同时这个类也提供了onStartup方法,重写这个方法就可以动态注册相关组件。

    在配置类中继承这个类,并重写onStartup方法:

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        //注册自定义过滤器
        //addFilter中分别提供filter-name和filter的class对象
        FilterRegistration.Dynamic reg = servletContext.addFilter("testFilter", TestFilter.class);
        reg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
        //注册spring mvc 提供字符编码过滤器
        FilterRegistration.Dynamic encodingFilter
            = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());
        encodingFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
        //注意重写onStartup方法后必须将ServletContext对象传回给父类,
        //否则DispatcherServlet不会生效
        super.onStartup(servletContext);
    }
  • 相关阅读:
    【RL-TCPnet网络教程】第3章 初学RL-TCPnet的准备工作及其快速上手
    【二代示波器教程】第15章 FreeRTOS操作系统版本二代示波器实现
    【RL-TCPnet网络教程】第2章 嵌入式网络协议栈基础知识
    【二代示波器教程】第14章 uCOS-III操作系统版本二代示波器实现
    【RL-TCPnet网络教程】第1章 当前主流的小型嵌入式网络协议栈
    徐州网络赛H-Ryuji doesn't want to study【线段树】
    徐州网络赛F-Feature Trace【暴力】
    徐州网络赛C-Cacti Lottery【DFS】
    南京网络赛I-Skr【回文树模板】
    AC自动机
  • 原文地址:https://www.cnblogs.com/zhangcaihua/p/12989338.html
Copyright © 2011-2022 走看看