配置
要想在SpringMVC中开启对静态资源的访问,需要在核心配置文件springMVC.xml
中添加以下代码片段
<!--开启对静态资源的访问-->
<mvc:default-servlet-handler/>
<!--开启注解驱动-->
<mvc:annotation-driven/>
原理
假设工程的目录结构如下图所示,静态资源目录static位于webapp下,通过配置以上两行代码便可以访问静态资源。
切记不能将静态资源放到WEB-INF下,由于WEB-INF目录下资源文件安全性都是很高的。它是不能直接通过浏览器来访问,只能通过服务器来访问。
DispatcherServlet只能访问到WEB-INF中的资源,通过转发去访问WEB-INF下的html、Jsp等资源,而无法访问到静态资源,那么该通过什么方式去访问静态资源呢?
Tomcat的conf目录中有个web.xml,这是对部署到Tomcat中的所有项目的统一配置,我们自己的项目也会有一个web.xml文件,当这两个web.xml对同样的配置项做了不同的配置,Tomcat会按照就近原则,将项目中的配置作为最终的配置。
Tomcat中的web.xml,里面配置了一个Servlet:org.apache.catalina.servlets.DefaultServlet
对应的servlet-mapping配置的为/,它可以访问到static静态资源。
如果项目中的web.xml中的DispatcherServlet或其它自定义的Servlet的servlet-mapping也配置为/,那么会产生矛盾,按照就近原则,DispatcherServlet将会覆盖DefaultServlet的配置。
此时访问资源时只会去DispatcherServlet中匹配,而不会去DefaultServlet中匹配,这样就找不到静态资源。若要能够访问静态资源,那么就要在springMVC.xml
中加上
<!--开启对静态资源的访问-->
<mvc:default-servlet-handler/>
这样就开启对静态资源的访问。
然而,此时无法匹配到其它控制器方法中的请求映射。因为加上这行配置,请求资源时只会经过DefaultServlet,而不会经过DispatcherServlet前端控制器。
这显然不能满足我们的要求,若想要浏览器的请求路径既能够匹配静态资源,也可以匹配到其它控制器方法中的请求映射,此时就需要开启注解驱动
<!--开启注解驱动-->
<mvc:annotation-driven/>
这时候,当浏览器向服务器请求任何资源时,会先经过DispatcherServlet寻找资源,如果没有找到,则会去DefaultServlet中匹配。如果还是没有找到资源,就会报404错误。