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.png
However, 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?