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);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM