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>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…