1. 程式人生 > >Springmvc專案web.xml中servlet-mapping的路徑對映配置注意事項

Springmvc專案web.xml中servlet-mapping的路徑對映配置注意事項

今天準備在IDEA編輯器下建立個通過maven管理的springMVC工程來測試一些功能,按照記憶中的方式以及配合百度完成了工程的建立,但在訪問web.xml中配置的首頁時,無論如何都無法訪問,試了很多方式,但都不是很理想,無意間仔細看了下下的對映規則,再結合自己的嘗試,算是解決了心中的疑惑,也總結下自己的心得: 其他的配置暫且略去,主要關注屬性的配置; 最初的配置:

  <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

可以正常訪問controller層的對映處理函式,但是無法訪問web.xml中設定的首頁; 嘗試的方法:

(1)因為無法找到首頁index.xml,首先懷疑是路徑不對,改了各種位置,甚至重建了一遍工程還是不行,最後仔細分析報錯,如下:

 org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/spring] in
  DispatcherServlet with name 'dispatcher'

無法通過DispatcherServlet 找到合適的對映,因此懷疑把首頁的請求也當成對映來處理了,於是改成如下的匹配模式,精確匹配路徑:

   <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/test/*</url-pattern>
        </servlet-mapping>

雖然首頁能正常顯示了,但是controller層的對映卻匹配不到了,訪問路徑為:http://localhost:8080/spring/test/first controller層的對映匹配模式如下:@RequestMapping("/test/first")

報錯仍是找不到對映處理函式,然後嘗試了很多次,發現採用精確匹配模式後,在dispatcher查詢對映處理函式時,會把路徑中"test/“之前的部分去除,只匹配之後的路徑部分,改為如下模式即可匹配: @RequestMapping(”/first")

(2)然後再次改變精確匹配模式,改為如下配置:

            <servlet-mapping>
                <servlet-name>dispatcher</servlet-name>
                <url-pattern>*.do</url-pattern>
            </servlet-mapping>

controller層的對映改為 @RequestMapping("/test/firstdo"),這樣首頁和controller層都可以正常訪問了,當然原理與上一個方法一樣,改變DispatcherServlet匹配規則,讓首頁訪問不再經過DispatcherServlet匹配,那麼就能訪問到了;

(3)無意間參考了之前的一個工程配置,發現採用如下對映模式:

           <servlet-mapping>
                <servlet-name>dispatcher</servlet-name>
                <url-pattern>/</url-pattern>
            </servlet-mapping>

發現也解決了首頁和congtroller層的訪問問題,因此就搜了下"/“和”/*"區別:

 1、<url-pattern>/ </ url-pattern >   不會匹配到*.jsp,即:*.jsp不會進入spring的 DispatcherServlet類 。
 2、在配置了< url-pattern > /* </ url-pattern >的情況下自然會攔截所有請求(包括/login,*.jsp,*.js和*.html等),
 控制器根據你的請求傳遞引數給檢視解析器 , 檢視解析器解析了控制器的請求,準備返回給你檢視的時候,又一次被servlet攔截了,然後又傳給了控制器,然後控制器沒找到對應的請求,就報錯了。

也嘗試了下,確實如此,當設定的首頁返回時,如果設定的匹配模式為“/*”時,如果再次查詢index.jsp的路徑匹配處理函式,找不到即報了404錯誤,而“/”不匹配“ *.jsp”等字尾的檔案,因此能正常返回首頁;

PS:但是“/”其實能攔截“.js”,“.css”,".png"等靜態資源的訪問,因此如果採用“/”的配置時,需要在主配置檔案中配置放行靜態資源(即DispatcherServlet對應的配置檔案),這樣才不會出現意想不到的匹配錯誤404.

<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/> 

<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>

 <mvc:resources location="/WEB-INF/images/" mapping="/images/**"/>