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);
    }
  • 相关阅读:
    【css】媒体查询(@media 查询)
    【angular】利用$scope.$apply() 按需要强制渲染前端页面
    【html】百度经常使用的 map标签
    【d2-admin】浅入了解 d2-admin之安装
    【web前端】谈谈浏览器的兼容性(面试题)
    【web性能优化】相关文章
    【web性能优化】DOM的reflow 和repaint
    【web性能优化】视频类优化(慕课网笔记)
    js高阶函数--判断数据类型、函数胡柯里化;
    js数组排序
  • 原文地址:https://www.cnblogs.com/zhangcaihua/p/12989338.html
Copyright © 2011-2022 走看看