在使用SpringMVC時,都需要在web.xml中配置一個前端控制器DispatcherServlet
控制器是一個servlet,但這個路徑配置就有很多種,之前都是以擴展名配置的路徑,如*.do,然后再項目中就就*.do的路徑進行訪問。
但最近的項目遵循Restful風格,配置的路徑如下
可以看到配置的路徑為“/”,由於之前疑惑上網查,說是/*和/都是攔截所有請求,於是把這里的路徑改成/*,之后項目就出先了404資源找不到的問題。
通過后來查閱資料,以自己的理解 /* 和 / 的區別如下
首先我們了解一下servlet的匹配規則
精度匹配>路徑匹配>擴展名匹配>內省匹配 (這里具體就不舉例了,想了解的同學可以自行百度)
所有這里的 /屬於內省匹配模式(TomCat默認有一個這樣的路徑),/*屬於路徑匹配。所以當控制器返回一個結果視圖訪問時,如果配置的為/*.則SrpingMVC會再次攔截,但由於找不到相關的控制器,就會報404資源找不到。
如果這里配置的為 / ,首先會覆蓋掉Tomcat中默認的,Tomcat默認的是用來處理靜態資源的,比如html,jsp等一些靜態資源。這里覆蓋掉以后,我們就要自己考慮靜態資源的處理了。
其次我發現在web.xml中又配置了這樣一些路徑,由於之前覆蓋掉了Tomcat默認的,這里應該是將一些靜態資源手動調用Tomcat的默認處理器進行處理,但是在這里面我們沒有發現jsp頁面,那么控制器返回的jsp還是會被 / 攔截進入到SpringMVC中。
所以為了防止資源找不到報404,在SpringMVC的配置文件中配置了如下的配置信息
首先的作用是對進入到SpringMVC的靜態資源進行處理,功能同Tomcat默認的DefaultServlet功能類似
其次這個的作用是當進入到SpringMVC中並且路徑為 / 時,默認跳轉到/index.html界面,這貌似就是跳轉主頁功能。
最后 是SpringMVC提供處理靜態資源的,詳細用法自行百度。
有個疑惑,假如我訪問一個js文件,web.xml里面配置了*.js交給Tomcat處理(擴展名匹配),DispatcherServlet又配置的是‘/’ (內省匹配),而擴展名優先級大於內省,所以說當我訪問一個JS靜態資源時,是不會進入SpringMVC中的,但這里又在SpringMVC中配置了一些靜態資源的處理,不知道有什么用???
總結:
1./*和/都可以攔截所有請求,但是優先級不一樣,/*的優先級要高於/,這也是為什么配置/*會報資源找不到的問題,因為根本到達不了Tomcat默認的Servlet來處理靜態資源。
2.網上說的/*攔截擴展名的,/不會攔截帶擴展名的,我覺得這總說法是不對的。還是要理解servlet的匹配規則。