18.15基于代码的Servlet容器初始化
在Servlet 3.0+环境中,您可以选择以编程方式配置Servlet容器作为替代方法或与web.xml文件结合使用。 以下是一个注册DispatcherServlet的例子:
import org.springframework.web.WebApplicationInitializer;
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
WebApplicationInitializer是Spring MVC提供的一个接口,它确保您的实现被检测到并自动用来初始化任何Servlet 3容器。 一个名为AbstractDispatcherServletInitializer的WebApplicationInitializer的抽象基类实现,通过简单地重写方法来指定Servlet映射和DispatcherServlet配置的位置,使注册DispatcherServlet变得更加容易。
推荐使用基于Java的Spring配置的应用程序:
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { MyWebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
如果使用基于XML的Spring配置,则应该直接从AbstractDispatcherServletInitializer扩展:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
@Override
protected WebApplicationContext createServletApplicationContext() {
XmlWebApplicationContext cxt = new XmlWebApplicationContext();
cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
return cxt;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
AbstractDispatcherServletInitializer还提供了添加Filter实例并将其自动映射到DispatcherServlet的便捷方式:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
}
}
每个过滤器都根据其具体类型添加一个默认名称,并自动映射到DispatcherServlet。
AbstractDispatcherServletInitializer的isAsyncSupported受保护方法提供了一个单独的位置来启用DispatcherServlet上的异步支持以及映射到它的所有过滤器。 默认情况下,这个标志被设置为true。
最后,如果您需要进一步自定义DispatcherServlet本身,则可以覆盖createDispatcherServlet方法。