在一个使用springmvc的web项目中,必然在web.xml中要配置前端控制器DispatcherServlet
springmvc
org.springframework.web.servlet.DispatcherServlet
1
springmvc
/
这里的url-pattern有两种配置方式
.扩展名,比如.do,古老的方式,不会导致静态资源文件被拦截的问题,但 是不支持RESTful编码风格 /,支持RESTful风格,但是会导致静态资源文件被拦截 还有一种错误的配置方式
/*,错误的方式,可以请求到Controller方法,但是跳转到JSP时会被拦截,JSP不能正常显示
一般来说,企业中更多的是采用第二种配置方式,但这导致了静态资源被拦截
静态资源为什么会被拦截??我们知道,我们的web项目最终要部署到服务器上,以我们熟悉的Tomcat服务器为例进行说明。
当我们将web应用部署到tomcat服务器上,服务器是先加载全局的web.xml,即"D:\work_folder\java_studying\java_tools\apache-tomcat-9.0.12\conf\web.xml"这是tomcat自带的web.xml文件,然后才会加载我们自己web项目中的web.xml,当我们加url-pattern配置成/
会覆盖掉全局web.xml中对于静态资源的处理,具体可以参考全局web.xml中:
default
org.apache.catalina.servlets.DefaultServlet
debug
0
listings
false
1
default
/
这就是默认的servlet,发现与我们配置的url-pattern一样了,导致静态资源也被我们自定义的dispatcherServlet所拦截,那这个类就会去找controller里面的映射了,比如我们访问http://localhost:8080/springmvc/img.png,显然是Controller里面是没有这个映射路径的。
如何处理静态资源被拦截方式一:手动排除法 在我们的web.xml添加如下配置
default
*.jpg
其他地方保持不变,这个粒度显然是比/更小的,它会将*.jpg文件交给servlet-name为default的servlet去处理该请求,默认的servlet为什么就没有拦截了呢?因为它是直接访问。
当然不好的地方是,如果你需要拦截*.html又得配一个,所以比较麻烦。一般不采用
方式二:在springmvc的配置文件中加入以下代码
方式三:在springmvc配置文件中手动指定静态资源路径
这种方式更灵活,功能更丰富,也是可以的
注意 springmvc配置文件中这个配置推荐每次都加 以上就上springmvc中处理静态资源的三种方式
推荐文章:https://blog.csdn.net/xingkongdeasi/article/details/79557198