动态的创建是为了简化配置文件的.对于我们创建的servlet,filter和listener后可以使用。这也是注解的另外一种替代方式。
package com.hotusm.dynamic; import javax.servlet.FilterRegistration; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletRegistration; import javax.servlet.annotation.WebListener; @WebListener public class DynamicInitContextListener implements ServletContextListener{ public void contextInitialized(ServletContextEvent sce) { ServletContext context = sce.getServletContext(); ServletRegistration.Dynamic dynamicServlet=context.addServlet("dynamicServlet", DynamicServlet.class); dynamicServlet.addMapping("/dynamicServlet"); dynamicServlet.setAsyncSupported(true); dynamicServlet.setLoadOnStartup(1); FilterRegistration.Dynamic dynamicFilter = context.addFilter("dynamicFilter", DynamicFilter.class); context.addListener("com.hotusm.dynamic.DynamicListener"); } public void contextDestroyed(ServletContextEvent sce) { } }
其中前三个方法的作用是相同的,只是参数类型不同而已;通过 createServlet() 方法创建的 Servlet,通常需要做一些自定义的配置,然后使用 addServlet() 方法来将其动态注册为一个可以用于服务的 Servlet。两个 getServletRegistration() 方法主要用于动态为 Servlet 增加映射信息,这等价于在 web.xml( 抑或 web-fragment.xml) 中使用 <servlet-mapping> 标签为存在的 Servlet 增加映射信息。
以上 ServletContext 新增的方法要么是在 ServletContextListener 的 contexInitialized 方法中调用!