在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 容器中用来保证你的实现可以被检测到以及自动实例化。WebApplicationInitializer
的一个抽象实现类AbstractDispatcherServletInitializer
使我们可以通过重写指定的servlet mapping和DispatcherServlet
的配置位置更加容易的注册DispatcherServlet
:
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[] { "/" };
}
}
上面的例子是对于应用使用基于Java的配置。如果使用基于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() };
}
}
每个filter会被添加基于它的具体的类型的默认名称并且自动映射到DispatcherServlet
。
AbstractDispatcherServletInitializer
提供的protected方法isAsyncSupported
提供一个地方用来确保DispatcherServlet
支持async并且所有的filter映射到它。这个值默认会被标记为true
.
最后,如果你需要更加定制DispatcherServlet
,你可以重写createDispatcherServlet
方法。
因为水平有限,翻译不足之处还望见谅。
原文地址:spring-framework-reference-4.2.6.RELEASE