Spring MVC和Servlets 3.0 - 你还需要web.xml吗?

时间:2013-02-21 17:04:19

标签: java spring-mvc annotations

在典型的Spring MVC网络应用中,您会在DispatcherServlet中声明web.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,您可以使用注释@WebServlet声明servlet,而不是将其添加到web.xml。 Spring 3.2的上下文配置已经有@Configuration@EnableXYZ。是否有DispatcherServlet类似的东西,即。有没有办法在没有任何xml的情况下配置完整的Spring应用程序?

2 个答案:

答案 0 :(得分:41)

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

  1. 创建一个实现ServletContainerInitializer的自定义类(即com.foo.FooServletContainer
  2. 在名为META-INF/services的{​​{1}}文件夹中创建一个文件,其中包含上述实施的名称(javax.servlet.ServletContainerInitializer
  3. Spring 3捆绑了一个名为com.foo.FooServletContainer的类,它实现了上面的内容(所以你不需要在SpringServletContainerInitializer中创建自己的文件。这个类只调用{{3}的实现所以你只需要在类路径中提供一个实现它的类(以下代码来自上面的doc)。

    META-INF/services

    这是针对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@Configuration等来配置网络应用。

答案 1 :(得分:1)

是的,您不需要web.xml来启动您的webapp Servlet 3.0+。正如Alex已经提到的,您可以实现WebApplicationInitializer类并覆盖onStartup()方法。 WebApplicationInitializer是Spring MVC提供的接口,可确保检测到您的实现并自动用于初始化任何Servlet 3容器。

  

有没有办法在没有任何xml的情况下配置完整的Spring应用程序?

添加此答案只是为了添加另一种方式。您无需实施WebApplicationInitializer。名为WebApplicationInitializer的{​​{1}}的抽象基类实现通过简单地重写方法来指定servlet映射和DispatcherServlet配置的位置,从而更容易注册DispatcherServlet -

AbstractDispatcherServletInitializer