29

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?

0

2 Answers 2

39

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

  1. Create a custom class that implements ServletContainerInitializer (i.e. com.foo.FooServletContainer)
  2. 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..

Sign up to request clarification or add additional context in comments.

3 Comments

The fact that you still need to put something in META-INF is kind of annoying, but I will try this.
You don't need to if you are using Spring, because Spring provides already the file that references SpringServletContainerInitializer which will call your FooInitializer class. I explained the META-INF/ so that you understand how it works under the cover. (I edited the answer above because it was maybe not clear)
1

Yes you don't need web.xml to startup your webapp Servlet 3.0+. As Alex already mentioned you can implement WebApplicationInitializer class and override onStartup() method. WebApplicationInitializer is an interface provided by Spring MVC that ensures your implementation is detected and automatically used to initialize any Servlet 3 container.

Is there a way to configure your full Spring application without any xml?

Adding this answer just to add another way. You don't need to implement WebApplicationInitializer. An abstract base class implementation of WebApplicationInitializer named AbstractDispatcherServletInitializer makes it even easier to register the DispatcherServlet by simply overriding methods to specify the servlet mapping and the location of the DispatcherServlet configuration -

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[] { "/" }; } } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.