servlet和filter的異同

之前總覺得filter就是一種特殊servlet,因此他們在web.xml中配置因該是同樣的,可是事實並不是如此!html


請看下文:java

看Servelt規範: 
web

引用
A filter is a reusable piece of code that can transform the content of HTTP requests, responses, and header information. Filters do not generally create a response or respond to a request as servlets do, rather they modify or adapt the requests for a resource, and modify or adapt responses from a resource.



簡要翻譯下: 
filter是一個能夠複用的代碼片斷,能夠用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。 

再在看Filter的繼承體系(不繼承Servlet接口):
 
app

Java代碼 
  1. public interface Filter  




因此第一個結論:Servlet和Filter沒有關係!可是2者能夠很好的協同工做。
 
url






還有不一樣的就是, servlet容器對url匹配過程spa

當一個請求發送到servlet容器中,容器就會將減去上下文的路徑做爲匹配servlet的映射url 。.net

好比  我我訪問的是http://localhost:8088/test/aa.html.  servlet容器就誰去掉上下文test翻譯

獲得/aa.html 這個就是servlet的映射url。 這個映射的過程仍是有順序的(這就和filter不一樣了下面會體會到)。code


當一個servlet匹配成功後就不會在往下去匹配了, 。 其餘還有其餘的匹配規則:orm


1, 精確路徑的匹配;例子:好比servletA url-pattern爲 /testservletBurl-pattern爲 /* ,這個時候,若是我訪問的urlhttp://localhost/test ,這個時候容器就會先 進行精確路徑匹配,發現/test正好被servletA精確匹配,那麼就去調用servletA,也不會去理會其餘的servlet了。



2, 最長路徑的匹配:例子:servletAurl-pattern/test/*,而servletBurl-pattern/test/a/*,此時訪問http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這裏的servletB

3. 擴展匹配,若是url最後一段包含擴展,容器將會根據擴展選擇合適的servlet。例子:servletAurl-pattern*.action



4 ,對於filter ,它沒有映射的路徑,在配置文件中不須要寫url,只須要寫filter類就行了,不會像servlet那樣只匹配一個servlet,由於filter的集合是一個鏈,因此只要考慮執行的順序就能夠,而不會出現只選擇一個filter,寫的每一個filter都會執行Filter的處理順序和filter-mappingweb.xml中定義的順序相同。

 



已有 0 人發表留言,猛擊->>這裏<<-參與討論


JavaEye推薦
相關文章
相關標籤/搜索