Servlet Config

    在 Servlet 3.0+ 环境中,你可以选择以编程方式配置 Servlet 容器,作为一种替代方法,或者与 web.xml 文件相结合。下面的例子注册了一个 DispatcherServlet:

    1. import org.springframework.web.WebApplicationInitializer;
    2. public class MyWebApplicationInitializer implements WebApplicationInitializer {
    3. @Override
    4. public void onStartup(ServletContext container) {
    5. XmlWebApplicationContext appContext = new XmlWebApplicationContext();
    6. appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
    7. ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
    8. registration.setLoadOnStartup(1);
    9. registration.addMapping("/");
    10. }
    11. }

    WebApplicationInitializer 是 Spring MVC 提供的一个接口,它可以确保你的实现被检测到并自动用于初始化任何 Servlet 3 容器。WebApplicationInitializer 的一个抽象基类实现名为 AbstractDispatcherServletInitializer,通过覆盖指定 Servlet 映射和 DispatcherServlet 配置位置的方法,使注册 DispatcherServlet 更加容易。

    建议使用基于 Java 的 Spring 配置的应用程序使用这种方法,如下面的例子所示:

    1. public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    2. @Override
    3. protected Class<?>[] getRootConfigClasses() {
    4. return null;
    5. }
    6. @Override
    7. protected Class<?>[] getServletConfigClasses() {
    8. return new Class<?>[] { MyWebConfig.class };
    9. }
    10. @Override
    11. protected String[] getServletMappings() {
    12. return new String[] { "/" };
    13. }
    14. }

    如果你使用基于 XML 的 Spring 配置,你应该直接从 AbstractDispatcherServletInitializer 扩展,如下例所示:

    1. public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
    2. @Override
    3. protected WebApplicationContext createRootApplicationContext() {
    4. return null;
    5. }
    6. @Override
    7. protected WebApplicationContext createServletApplicationContext() {
    8. XmlWebApplicationContext cxt = new XmlWebApplicationContext();
    9. cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
    10. return cxt;
    11. }
    12. @Override
    13. protected String[] getServletMappings() {
    14. return new String[] { "/" };
    15. }
    16. }

    AbstractDispatcherServletInitializer 还提供了一种方便的方法来添加 Filter 实例,并让它们自动映射到 DispatcherServlet,正如下面的例子所示:

    1. public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
    2. // ...
    3. @Override
    4. protected Filter[] getServletFilters() {
    5. return new Filter[] {
    6. new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
    7. }
    8. }

    每个过滤器都被添加了一个基于其具体类型的默认名称,并自动映射到 DispatcherServlet 上。

    AbstractDispatcherServletInitializer 的 isAsyncSupported 保护方法提供了一个单一的地方来启用对 DispatcherServlet 和所有映射到它的过滤器的异步支持。默认情况下,这个标志被设置为 true。

    最后,如果你需要进一步定制 DispatcherServlet 本身,你可以重写 createDispatcherServlet 方法。