在web.xml中<servlet-mapping>和<filter-mapping>都有<url-pattern>配置項,它們的作用都是匹配一次請求是否會執(zhí)行這個Servlet或Filter。
url-pattern配置驗證
在web.xml加載時,會首先檢查<url-pattern>配置是否符合規(guī)則,這個檢查是在StandardContext的validateURLPattern方法中檢查的;如果檢查不成功,Context容器啟動會失敗,并且報java.lang.IllegalArgumentException:Invalid<url-pattern> ... ... in Servlet mapping錯誤。
url-pattern匹配規(guī)則
匹配規(guī)則有三種:
<url-pattern>的其他寫法,如/foo/ ,/*.htm ,*/foo 都是不對的。
Servlet的匹配規(guī)則在prg.apache.tomcat.util.http.mapper.Mapper.internalMapWrapper中定義。
對Servlet的匹配來說,如果同時定義了多個<url-pattern>,那么到底匹配哪個Servlet?這個匹配順序是:
注:
對于如下設置:
"/" 的設置將會將當前指定的 servlet 設為web應用的默認servlet,原來web容器的默認servlet將被覆蓋。
參見: web容器的默認servlet 和 spring dispatcherservlet 設置一節(jié)
Filter的匹配規(guī)則定義在AppplicationFilterFactory,matchFiltersURL方法中定義。
Filter的匹配原則和Servlet有些不同,只要匹配成功,這些Filter都會在請求鏈上被調(diào)用。