以下是大家熟悉的servlet配置:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
下面是大家熟悉的filter配置:
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其中url-pattern元素會關聯到一個servlet或filter上面,當一個請求到來時,容器使用一種非常簡單的匹配過程將一個請求匹配到web.xml中的一個url-pattern上。
url-pattern中的值必須是標準的ASCII碼,否則就必須進行轉義。
URL模式語法
url模式使用一個非常簡單的語法,它的值必須和瀏覽器中輸入的url完全一致。其中有兩個例外,在模式的最後,用/*結尾匹配任何以那一點開始的任意字符(前綴匹配),以*.extension結尾的,匹配任何以extension結尾的文件名。除此之外,沒有別的通配符可以支持,在其他任何位置的*都是非法的。比如:
後綴匹配
<url-pattern>/status/*</url-pattern>
http://example.com/examples/status/synopsis | 匹配 |
http://example.com/examples/status/complete?date=today | 匹配 |
http://example.com/examples/status | 匹配 |
http://example.com/examples/server/status | 不匹配 |
<url-pattern>*.map</url-pattern>
http://example.com/examples/US/Oregon/Portland.map | 匹配 |
http://example.com/examples/US/Washington/Seattle.map | 匹配 |
http://example.com/examples/Paris.France.map | 匹配 |
http://example.com/examples/US/Oregon/Portland.MAP | 不匹配,後綴是大寫 |
http://example.com/examples/interface/description/mail.mapi | 不匹配,後綴是mapi而不是map |
在一個上下文中,經常有不同的過濾器使用相同的url-pattern,這種情況下,每個匹配請求的過濾器,都會執行。相反的,在一個應用中不會有兩個servlet使用同一樣url-pattern。如果web.xml中包含了兩個相同的映射到不同的servlet上,那麼容器將不獲取去執行哪個了。然而兩個servlet可以使用交叉的url-pattern元素,這種情況下,匹配到的處理器決定去執行哪個servlet。
Servlet映射過程
一個請求可能匹配到多於一個servlet-mapping,servlet容器使用一個直接了當的映射過程去決定最優的匹配。匹配過程有四個規則:
- 首先匹配精確的路徑;
- 其次匹配最長模式;
- 再次是匹配文件類型;
- 最後<url-pattern>/</url-pattern>在沒有其他匹配的情況下會匹配任意的請求。
Default Servlet
包含<url-pattern>/</url-pattern>的映射如果其他模式時匹配一個請求。這個即是默認映射,映射到這個模式上的servlet叫做默認Servlet。
這種映射經常作爲一個應用的默認首頁。
<servlet-mapping>
<servlet-name>Welcome</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>