天天看點

Servlet Mapping 中/ 和 /*的差別

首先它們的共同點在于:作用都是用于攔截http://ip:port/context下的所有請求

不同點在于:(1)/ 模式下,Servlet不會攔截 .jsp(僅限于此,.html仍會被攔截)格式的請求;而 /* 模式才是真正意義上的攔截所有形式的請求。

(2)在 /*模式下,通過調用HttpServletRequest 對象的getPathInfo()方法,将得到不包含context名稱的通路路徑;而在 / 模式下,該方法傳回始終為null,此時隻能轉而使用getRequestURI()等方法得到包含context名稱的請求路徑。

是以在MVC架構中,例如SpringMVC中,如果你把DispatcherServlet對應的Servlet-Mapping比對模式配置為 /* 時,即使經過視圖解析器得到的通路jsp頁面的請求也會再次被攔截,進而無法得到将要通路的頁面而報錯。是以應配置為 /。

原因探讨:參考社群http://stackoverflow.com/questions/4140448/difference-between-and-in-servlet-mapping-url-pattern關于這一點的讨論

我大緻将社群中的讨論結果總結陳列如下:

(1)web server有幾個預設的servlet,其Servlet-Mapping映射路徑包括“*.jsp”(用于處理jsp頁面響應),以及“”(用于預設頁面響應)等

(2)“/*”會覆寫掉以上所有的預設servlet,進而将所有的請求都攔截了下來

(3)“/”不會覆寫預設servlet,是以預設的“*.jsp”servlet仍然可以正常工作,(精确比對優先)優先攔截jsp頁面請求,并響應。

繼續閱讀