问题由来:有时一些简单系统服务,不必用到很多jar包,于是自己封装servlet来处理所有的请求,但是@WebServlet(name="test", urlPatterns="/")会对项目中的静态资源进行拦截,这是我不乐意看到的,缓然回顾过往SpringMVC4项目中,却并没有明显使用mvc:resources标签进行静态资源处理,也没有配置其他servlet对静态资源进行放行,于是对SpringMVC4中静态资源的访问链路进行了探索之路。
- 既然SpringMVC亦是基于servlet,传统的我们都有配置web.xml的习惯,找到spring配置的servlet:
根据对servlet的理解,SpringMVC将所有请求【包括静态资源】进行了接管。
- 开始源码调试探索。DispatcherServlet想必大家上课都听得耳朵起茧了,熟悉的同学可以直接在doDispatch方法上定位;当然基于对servlet的理解,在其父类FrameworkServlet可以找到doGet,doPost方法。打上断点走一遍,对大体脉络进行观察,其他有些方法不了解没关系,注意自己关注重点是:静态资源,于是重点关注是否有页面啊,后缀相关的,再者对一些可能是判断检测的方法点进去瞧瞧。
- 上述步骤完成几次之后,你很无奈的发现,然而好像并没找到相关后缀有关的地方,于是,搞不懂的问问百度、谷歌嘛;博客:https://blog.csdn.net/chenshun123/article/details/74370236给了我启示,<mvc:default-servlet-handler />!!!对就是它的作用,让静态资源能够正常访问!
- 思考为什么?SpringMVC沿用了tomcat的静态资源配置,在handler进行相关处理,故能够正常访问到静态资源。{难怪我说如果spring如果自己做静态资源的后缀库放行的话,现在文件格式这么多种,可能以后更多,它仅仅作为框架难道一直更新?故spring肯定不会接锅。}
- 再回想很久以前,刚使用tomcat用的很爽的时候,是否一直忽略了一点,为什么加域名+端口+项目名+静态文件名就能访问到???这是因为:tomcat也有基于servlet的配置,找到tomcat物理路径,点开conf,你会发现一个web.xml,再进去查看,恍然大悟~~~~