創建一個簡單項目有如下結構:
在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, "/*"); } }
在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); }