最基本的servlet中,jsp頁面向對應Servlet對象請求時,會根據web.xml中匹配規則,匹配對應的Servlet。
匹配規則有三種:
- 精確匹配 —— 如/findAll.htm,只會匹配foo.htm這個URL
- 路徑匹配 —— 如/service/*,會匹配以service爲前綴的URL
- 後綴匹配 —— 如*.htm,會匹配所有以.htm爲後綴的URL
<url-pattern>的其他寫法,如/findAll/ ,/*.htm ,*/foo 都是不對的。
Servlet的匹配原則
Servlet的匹配規則在prg.apache.tomcat.util.http.mapper.Mapper.internalMapWrapper中定義。
對Servlet的匹配來說,如果同時定義了多個<url-pattern>,那麼到底匹配哪個Servlet?這個匹配順序是:
- 首先精確匹配,如定義了兩個Servlet,Servlet1爲/foo.htm,Servlet2是/*,請求URL爲http://localhost/foo.htm,那麼只有Servlet1匹配成功;
- 如果精確匹配不成功,那麼會使用第二個原則“最長路徑匹配”,如Servlet1爲/foo/*,Servlet2爲/*,這時請求的URL爲http://localhost/foo/foo.htm,那麼Servlet1匹配成功;
- 最後根據後綴進行匹配;
- 但是一次請求只會成功匹配到一個Servlet