当一个请求发送到服务器的时候,服务器首先会解析请求路径。将请求的 URL 去掉“HOST + ContextPath”,即去掉“服务器路径 + 当前应用上下文的路径”,然后将 URL的剩余部分作为要与<url-pattern/>进行匹配的 URI。例如,用户提交的请求为http://localhost:8080/oa/xxx/ooo,则去掉“HOST + ContextPath”后剩余部分为/xxx/ooo。服务器会将这个/xxx/ooo 与 web.xml 中所有的<url-pattern/>进行匹配。这个映射匹配过程是有顺序的,而且当有一个 servlet 匹配成功以后,就不会再去与其它 Servlet 进行匹配了。具体的匹配原则为:
(1 ) 路径优先 后辍 匹配原则
例如 SomeServlet 的<url-pattern/>为*.do,OtherServlet 的<url-pattern/>为 /xxx/*。若用户提交的请求 URL 为 http://localhost:8080/oa/xxx/abc.do,此时服务器发现 SomeServlet 的*.do 与 OtherServlet 的/xxx/*都可以与用户提交请求的/xxx/abc.do 相匹配。那么服务器会按照“路径优先后辍匹配”的原则选择 OtherServlet。
(2 ) 精确路径 优先 匹配 原则
例如 SomeServlet 的<url-pattern/>为/some,OtherServlet 的<url-pattern/>为 /*。若用户提交的请求 URL 为 http://localhost:8080/oa/some,此时服务器发现SomeServlet 的/some 与 OtherServlet 的/*都可以与用户提交请求的/some 相匹配。那么服务器会按照“精确路径优先匹配”的原则选择 SomeServlet。
(3 ) 最长路径 优先 匹配 原则
例如 SomeServlet 的<url-pattern/>为/some/*,OtherServlet 的<url-pattern/>为 /some/other/*。若用户提交的请求 URL 为http://localhost:8080/oa/some/other,此时服务器发现 SomeServlet 的/some/*与 OtherServlet 的/some/other/*都可以与用户提交请求的/some/other 相匹配。那么服务器会按照“最长路径优先匹配”的原则选择 OtherServlet。