Can SpringMVC be configured to process all requests, but exclude static content directories? Can SpringMVC be configured to process all requests, but exclude static content directories? spring spring

Can SpringMVC be configured to process all requests, but exclude static content directories?


NOTE: this answer applies to Spring 3.0.4+ ONLY

(BTW, this question has also been dealt with here: Spring serving static content with mvc:resources, invalid xsd)

Check out the Spring mvc-showcase project in the Spring subversion samples repository. It shows exactly what you want to do, namely that you can delineate static resources which will not be processed by the DisapatcherServlet. See file /mvc-showcase/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml. Here's a snippet of how I handle these exclusions, where the JS, CSS, and images are in the app context root (with the MVC namespace mapped to mvc:

<!-- resources exclusions from servlet mapping --><mvc:resources mapping="/css/**" location="/css/" /><mvc:resources mapping="/images/**" location="/images/" /><mvc:resources mapping="/js/**" location="/js/" />


I solved by serving static content through the 'default' servlet, that just serve the content to the client. So my web.xml looks like this:

<servlet>    <servlet-name>MyApp</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class></servlet><servlet-mapping>    <servlet-name>MyApp</servlet-name>    <url-pattern>/</url-pattern></servlet-mapping> <!-- The 'dynamic' content --><servlet-mapping>    <servlet-name>default</servlet-name>    <url-pattern>*.css</url-pattern></servlet-mapping><servlet-mapping>    <servlet-name>default</servlet-name>    <url-pattern>*.js</url-pattern></servlet-mapping><servlet-mapping>    <servlet-name>default</servlet-name>    <url-pattern>*.jpg</url-pattern></servlet-mapping> <!-- The 'static' content -->

Hope this helps.


If you want to do this with Spring only, it's possible but a bit messy:

  1. You'll either need to use a SimpleUrlHandlerMapping for which you can explicitly specify URL patterns which should be mapped to controllers OR extend it to support "ignore" URLs like "css/**".
  2. You'll need to write your own HttpRequestHandler implementation that would basically consist of "getServletContext().getRequestDsipatcher().include()" call to return the requested resource as is.
  3. You'll have to register that handler as defaultHandler for the above SimpleUrlHandlerMapping.

Once all that is done, all requests that can't be mapped to your controllers will be forwarded to your HttpRequestHandler and served "as is".