Spring MVC and Servlets 3.0 - Do you still need web.xml?

annotations, java, servlets, spring-mvc

Solution

With JEE6, if your application container is Servlet 3.0 ready what you need to do is:

- Create a custom class that implements ServletContainerInitializer (i.e. `com.foo.FooServletContainer`)

- Create a file in your `META-INF/services` folder named `javax.servlet.ServletContainerInitializer` which will contain the name of your implementation above (`com.foo.FooServletContainer`)

Spring 3 is bundled with a class named `SpringServletContainerInitializer` that implements the stuff above (so you don't need to create yourself the file in `META-INF/services`. This class just calls an implementation of `WebApplicationInitializer`. So you just need to provide one class implementing it in your classpath (the following code is taken from the doc above).

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("/");
    }
 }

That's it for the `web.xml` thing, but you need to configure the webapp using `@Configuration`, `@EnableWebMvc` etc..

Problem

In a typical Spring MVC web app, you would declare the `DispatcherServlet` in `web.xml` like so ``` <!-- 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> ``` Along with listeners, filters, etc. With servlet-api 3.0, you can declare your servlets with the annotation `@WebServlet` instead of adding them to your `web.xml`. Spring 3.2 already has `@Configuration` and `@EnableXYZ` for its context configuration. Does it have something similar for the `DispatcherServlet`, ie. is there a way to configure your full Spring application without any xml?

Original source