21.15 基于代码的Servlet容器初始化
在Servlet3.0+的环境下,你可以选择使用编程,同时结合web.xml来配置Servlet。下方是注册一个DispatcherServlet的示例:
import org.springframework.web.WebApplicationInitializer;
public classMyWebApplicationInitializer implementsWebApplicationInitializer {
@Override
public voidonStartup(ServletContext container) {
XmlWebApplicationContext appContext = newXmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", newDispatcherServlet(appContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
WebApplicationInitializer是Spring MVC提供的接口,用来确保你的实现是被检测到的,并且自动地在任意Servlet 3容器中初始化。WebApplicationInitializer的抽象基类的实现名叫AbstractDispatcherServletInitializer,使注册DispatcherSerlvet更简单,只需覆写其方法到servlet的映射和其配置的地址,如下所示:
public classMyWebAppInitializer extendsAbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[]getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[]getServletConfigClasses() {
return new Class[] {MyWebConfig.class };
}
@Override
protected String[]getServletMappings() {
return new String[] { "/" };
}
}
上方的例子展示了基于java 的Spring配置的应用。如果使用基于XML的Spring配置,直接继承AbstractDispatcherServletInitializer:
public classMyWebAppInitializer extendsAbstractDispatcherServletInitializer {
@Override
protected WebApplicationContextcreateRootApplicationContext() {
return null;
}
@Override
protectedWebApplicationContext createServletApplicationContext() {
XmlWebApplicationContext cxt = newXmlWebApplicationContext();
cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
return cxt;
}
@Override
protected String[]getServletMappings() {
return new String[] { "/" };
}
}
AbstractDispatcherServletInitializer同时也提供了一种很方便的方法来添加过滤器实例,并把他们自动映射到对应DispatcherServlet上:
public classMyWebAppInitializer extendsAbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[]getServletFilters() {
return new Filter[] { newHiddenHttpMethodFilter(), new CharacterEncodingFilter()};
}
}
每一个被自动映射到DispatcherServlet上的过滤器的默认名,是基于其构造的类型的。
AbstractDispatcherServletInitializer中的受保护的方法isAsyncSupported,提供了在DispatcherServlet和所有映射到此Servlet的过滤器的异步支持。此方法默认为true。
最后,如果你需要更加个性化定制DispatcherServlet,你可以覆写createDispatcherServlet方法来实现。