Using Spring, mapping to root in web.xml, static resources aren't found Using Spring, mapping to root in web.xml, static resources aren't found spring spring

Using Spring, mapping to root in web.xml, static resources aren't found


The problem is that requests for the static content go to the dispatcherServlet, because it's mapped as <url-pattern>/</url-pattern>. It's a very common problem in applications with "RESTful" URLs (that is, without any prefix in the DispatcherServlet mapping).

There are several possible ways to solve this problem:


Since Spring 3.x the preferred way to access static resources is to use <mvc:resources>:web.xml:

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

Spring config:

<!-- Handles GET requests for /resources/** by efficiently serving static content     in the ${webappRoot}/resources dir --> <mvc:resources mapping="/resources/**" location="/resources/" /> 

See also MVC Simplifications in Spring 3


1. Use URL rewrite filter
See mvc-basic example here

2. Set a prefix for the default servlet:

<servlet-mapping>    <servlet-name>default</servlet-name>    <url-pattern>/static/*</url-pattern></servlet-mapping>

That is, request for /static/images/image.png will return the file named /images/image.pngHowever, this way is incompatible across different servlet containers (doesn't work in Jetty), see workarounds here

3. Set static content extensions for the default servlet:

<servlet-mapping>    <servlet-name>default</servlet-name>    <url-pattern>*.png</url-pattern>    <url-pattern>*.js</url-pattern>    <url-pattern>*.css</url-pattern></servlet-mapping>

4. Do not use RESTful URLs, use URLs with prefix:

<servlet-mapping>     <servlet-name>springapp</servlet-name>     <url-pattern>/app</url-pattern> </servlet-mapping>

5. Do not use RESTful URLs, use URLs with extension:

<servlet-mapping>     <servlet-name>springapp</servlet-name>     <url-pattern>*.do</url-pattern> </servlet-mapping>


Did any one consider using this:

<!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource requests to the container's default Servlet --><mvc:default-servlet-handler/>

Here is the latest spring docs on it:http://static.springsource.org/spring/docs/3.1.2.RELEASE/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-default-servlet-handler


As an alternative to the proposed solution number (2, default servlet which behaves differently from servlet container to servlet container), I would recommend taking a look into the Resource Servlet (org.springframework.js.resource.ResourceServlet) from the Spring Webflow project.

For more details please have a look at How to handle static content in Spring MVC?