优雅 REST 风格的 URL 不希望带 .html 或 .do 等后缀,而如果将 DispatcherServlet 请求映射配置为"/",则Spring MVC将捕获Web容器所有的请求,静态资源的请求找不到对应处理器将导致错误。

<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

解决办法:

1、在spring xml文件中配置mvc:default-servlet-handler/

<mvc:default-servlet-handler/>

在xml文件中配置mvc:default-servlet-handler/,Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,对进入 DispatcherServlet 的 URL 进行筛查,静态资源由 Web 服务器默认的Servlet 处理,非静态资源的请求,由 DispatcherServlet 处理。

但是这样会使动态请求失效,还要配置注解驱动来使动态请求生效

<!--开启mvc注解驱动模式-->
<mvc:annotation-driven />

2、<mvc:resources /> 允许静态资源放在任何地方

<mvc:resources location="/,classpath:/WEB-INF/publicResources/" mapping="/resources/**"/>

配置将Web根路径 "/" 及类路径下 /WEB-INF/publicResources/ 的目录映射为 /resources 路径。假设Web根路径下publicResources下拥有 images、js 这两个资源目录,在 images下面有 bg.gif 图片,在 js下面有 test.js 文件,则可以通过 /resources/images/bg.gif 和 /resources/js/test.js 访问这二个静态资源。