在使用SpringMVC时,都须要在web.xml中配置一个前端控制器DispatcherServlethtml
控制器是一个servlet,但这个路径配置就有不少种,以前都是以扩展名配置的路径,如*.do,而后再项目中就就*.do的路径进行访问。前端
但最近的项目遵循Restful风格,配置的路径以下web
能够看到配置的路径为“/”,因为以前疑惑上网查,说是/*和/都是拦截全部请求,因而把这里的路径改为/*,以后项目就出先了404资源找不到的问题。jsp
经过后来查阅资料,以本身的理解 /* 和 / 的区别以下spa
首先咱们了解一下servlet的匹配规则3d
精度匹配>路径匹配>扩展名匹配>内省匹配 (这里具体就不举例了,想了解的同窗能够自行百度)code
全部这里的 /属于内省匹配模式(TomCat默认有一个这样的路径),/*属于路径匹配。因此当控制器返回一个结果视图访问时,若是配置的为/*.则SrpingMVC会再次拦截,但因为找不到相关的控制器,就会报404资源找不到。xml
若是这里配置的为 / ,首先会覆盖掉Tomcat中默认的,Tomcat默认的是用来处理静态资源的,好比html,jsp等一些静态资源。这里覆盖掉之后,咱们就要本身考虑静态资源的处理了。htm
其次我发如今web.xml中又配置了这样一些路径,因为以前覆盖掉了Tomcat默认的,这里应该是将一些静态资源手动调用Tomcat的默认处理器进行处理,可是在这里面咱们没有发现jsp页面,那么控制器返回的jsp仍是会被 / 拦截进入到SpringMVC中。blog
因此为了防止资源找不到报404,在SpringMVC的配置文件中配置了以下的配置信息
首先的做用是对进入到SpringMVC的静态资源进行处理,功能同Tomcat默认的DefaultServlet功能相似
其次这个的做用是当进入到SpringMVC中而且路径为 / 时,默认跳转到/index.html界面,这貌似就是跳转主页功能。
最后 是SpringMVC提供处理静态资源的,详细用法自行百度。
有个疑惑,假如我访问一个js文件,web.xml里面配置了*.js交给Tomcat处理(扩展名匹配),DispatcherServlet又配置的是‘/’ (内省匹配),而扩展名优先级大于内省,因此说当我访问一个JS静态资源时,是不会进入SpringMVC中的,但这里又在SpringMVC中配置了一些静态资源的处理,不知道有什么用???
总结:
1./*和/均可以拦截全部请求,可是优先级不同,/*的优先级要高于/,这也是为何配置/*会报资源找不到的问题,由于根本到达不了Tomcat默认的Servlet来处理静态资源。
2.网上说的/*拦截扩展名的,/不会拦截带扩展名的,我以为这总说法是不对的。仍是要理解servlet的匹配规则。