servlet和filter的uri是如何過濾url的?

以下是大家熟悉的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容器使用一個直接了當的映射過程去決定最優的匹配。匹配過程有四個規則:

  1.  首先匹配精確的路徑;
  2. 其次匹配最長模式;
  3. 再次是匹配文件類型;
  4. 最後<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>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章