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容器。 一个名为AbstractDispatcherServletInitializerWebApplicationInitializer的抽象基类实现,通过简单地重写方法来指定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

AbstractDispatcherServletInitializerisAsyncSupported受保护方法提供了一个单独的位置来启用DispatcherServlet上的异步支持以及映射到它的所有过滤器。 默认情况下,这个标志被设置为true

最后,如果您需要进一步自定义DispatcherServlet本身,则可以覆盖createDispatcherServlet方法。

results matching ""

    No results matching ""