Spring MVC和Servlets 3.0-您仍然需要web.xml吗?


问题内容

在典型的Spring MVC Web应用程序中,您将像这样声明DispatcherServletinweb.xml

<!-- MVC Servlet -->
<servlet>
    <servlet-name>sample</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>sample</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

以及侦听器,过滤器等

使用servlet-api 3.0,您可以使用注释声明servlet,@WebServlet而不必将其添加到web.xml。Spring
3.2已经有了@Configuration@EnableXYZ为其上下文配置。它是否有类似的东西DispatcherServlet,即。有没有一种方法可以配置没有任何xml的完整Spring应用程序?


问题答案:

使用JEE6,如果您的应用程序容器已准备好Servlet 3.0,那么您需要做的是:

  1. 创建一个实现ServletContainerInitializer的自定义类(即com.foo.FooServletContainer
  2. META-INF/services名为的文件夹中创建一个文件,javax.servlet.ServletContainerInitializer其中将包含上述实现的名称(com.foo.FooServletContainer

Spring
3捆绑了一个名为的类SpringServletContainerInitializer,该类实现上述内容(因此,您无需在中创建文件META- INF/services。该类仅调用。的实现WebApplicationInitializer。因此,您只需要在类路径中提供一个实现它的类即可(以下代码摘自上面的文档)。

public class FooInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) {
        WebApplicationContext appContext = ...;

        ServletRegistration.Dynamic dispatcher =
           container.addServlet("dispatcher", new DispatcherServlet(appContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
 }

这是它的web.xml事,但你需要使用配置Web应用程序@Configuration@EnableWebMvc等等。