
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
动态的创建是为了简化配置文件的.对于我们创建的servlet,filter和listener后可以使用。这也是注解的另外一种替代方式。
动态的添加有两种,一种是基于ContextListener的,另外一种是基于servlet3.0新增接口的ServletContainerInitializer的
动态的主要类是Dynamic
代码:
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) {
}
}
ServletContainerInitializer的:
package com.hotusm.dynamic;
import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.HandlesTypes;
import javax.servlet.http.HttpServlet;
public class ServletContainerInitializerImpl implements ServletContainerInitializer{
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
System.out.println("ServletContainerInitializer");
if(c!=null){
for(Class<?> clazz:c){
System.out.println(clazz.getClass().getName());
}
}
// 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");
}
}
对于ServletContainerInitializer的方式,是基于SPI来做的,所以我们需要编辑几个文件:
另一方面在springmvc中我们可以使用WebApplicationInitializer的,因为我们可以在spring-web的架包下面看到:
其中的类实现有这样一句的代码:
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
表示的就是凡是实现或者继承WebApplicationInitializer的都会被加载
@HandlesTypes指定的类的子类和本类都会传进来。(onStartup的第一个参数)
ServletContext为动态配置Servlet增加了如下方法:
ServletRegistration.Dynamic addServlet(String servletName,Class<? extends Servlet> servletClass)
ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
ServletRegistration.Dynamic addServlet(String servletName, String className)
<T extends Servlet> T createServlet(Class<T> clazz)
ServletRegistration getServletRegistration(String servletName)
Map<String,? extends ServletRegistration> getServletRegistrations()
其中前三个方法的作用是相同的,只是参数类型不同而已;通过createServlet()方法创建的Servlet,通常需要做一些自定义的配置,然后使用addServlet()方法来将其动态注册为一个可以用于服务的Servlet。两个getServletRegistration()方法主要用于动态为Servlet增加映射信息,这等价于在web.xml(抑或web-fragment.xml)中使用<servlet-mapping>标签为存在的Servlet增加映射信息。
以上ServletContext新增的方法要么是在ServletContextListener的contexInitialized方法中调用,要么是在ServletContainerInitializer的onStartup()方法中调用。
ServletContainerInitializer也是Servlet 3.0新增的一个接口,容器在启动时使用JAR服务API(JAR Service API)来发现ServletContainerInitializer的实现类,并且容器将WEB-INF/lib目录下JAR包中的类都交给该类的onStartup()方法处理,我们通常需要在该实现类上使用@HandlesTypes注解来指定希望被处理的类,过滤掉不希望给onStartup()处理的类
了解详情请登陆昆明达内IT培训官网(km.tedu.cn)!