Springmvc项目无法访问静态资源的原因分析:
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--
/ 拦截所有,不包括.jsp
/* 拦截所有,包括.jsp
*.do 拦截所有的.do
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
我们配置的是/,也就是说除了jsp的所有请求都要到springmvc的dispatcherServlet里面去,去了之后都是直接去到controller了,但是很明显,如果是访问静态资源的话,http://localhost:8080/ok.html的访问路径,肯定就是找的
requestMapping("ok.html"),当然找不到,所有报404。
自己做的测试哈:
我不做任何静态资源的配置,然后写controller
@Controller public class TMController { @RequestMapping("/test.html") public String s (){ int a=215; System.out.println(1); return "ok"; } }
然后浏览器访问:http://localhost:8080/test.html是可以直接抵达后端的controller的。
//-------------------------------------------------------------------------------------------------------
我自己搭建ssm框架时候,想重现静态资源无法访问的现象,一直无法重现,我都可以访问到webapps目录下面的jsp文件,js文件、html文件等等...好诡异...
最后才找到原因:
原来,我在springmvc.xml 文件、applicationContext.xml文件写了一个注解
<mvc:default-servlet-handler/>
然后把它删除了,不配置,就无法访问静态资源了。所以得出结果:要正常访问静态资源的解决方案之一:添加<mvc:default-servlet-handler/>注解。
那么它具体是什么意思呢?启用tomcat中默认的servlet,即把静态资源交给默认的servlet处理。
解决访问二:简单粗暴地告诉服务器,这些资源不需要拦截!直接在web.xml文件中进行配置,如下:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
比如这里配置了 jpg、png、js,那么像下图的目录,使用
http://localhost:8080/1.png 就可以正常访问。
弊端:就是如果要访问html静态文件,还需要添加
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
也就是这里的代码会很多,有点麻烦并且low.
方案三:直接告诉spring,这个你就得这么做!在MVC配置文件中添加资源文件映射。
<resources mapping="/resources/**" location="/resources/" />
<resources mapping="/images/**" location="/images/" />
<resources mapping="/js/**" location="/js/" />