2011-09-26 158 views
14

作爲探索/學習Struts2,JSP和Servlets的一部分,我從herethere可以看出,可以在web.xml中使用servlet和servlets-mapping。但是,Struts2也提到了web.xml的過濾器和過濾器映射。servlet/servlet映射和過濾器/過濾器映射之間的區別?

兩者有什麼區別?這些是相互排斥的嗎?我應該什麼時候使用哪些?爲什麼?有人能澄清這些概念嗎?謝謝。

澄清

我也是剛剛纔明白,我需要了解的Struts2和Servlet是如何關聯的:http://www.coderanch.com/t/57899/Struts/Difference-between-servlet-struts

+0

您是否閱讀過有關servlet和servlet過濾器的內容?任何資源覆蓋過濾器應該清除你的東西 – Bozho

+0

@Bozho我做了,但我想我需要http://www.coderanch.com/t/57899/Struts/Difference-between-servlet-struts瞭解我不知道什麼我不明白 (...) – JVerstry

回答

9

Servlet過濾器實現intercepting filter模式。儘管servlet是Web請求的最終目標,但每個請求都會經過一系列過濾器。每個過濾器都可以在進一步傳遞請求之前修改請求,或者在從servlet接收請求之後進行響應。它甚至可以放棄進一步傳遞請求並像Servlet一樣完全處理它(並不少見)。例如緩存過濾器可以返回結果而不調用實際的servlet。

6

過濾器的使用類似Servlet過濾器。例如,如果您需要對某些URL進行安全檢查,則可以爲這些頁面添加一個篩選器。例如,你可以說/secure/pages/*.do需要被securityFilter攔截。然後,SecurityFilter類(實現Filter接口的類)的doFilter()方法將在將其轉發給實際請求的servlet之前處理安全審計。

Servlets幾乎是標準的東西。您定義一個servlet,然後讓servlet容器知道需要將哪種類型的請求映射到該servlet。

它們並不相互排斥。它們都可以同時使用。想象過濾器就像這個詞的意思 - 在進行下一個servlet /動作之前,它會「過濾」事物(記錄,安全等)。

3

根據servlet規範的請求生命週期在最終由servlet執行之前經過一系列過濾器。

,當你在簽名的doFilter方法在Filter接口

doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 

也就是說,你可以訪問請求和響應鏈中的過濾器這是相當直觀。合同是,作爲實施者,您應該在您在過濾器中執行的操作之前或之後調用chain,或者如果希望不繼續執行,則根本不執行。調用chain.doFilter(...)將導致過濾器中的下一個過濾器的映射與要求的URL匹配,並被執行。鏈的最後一個成員是映射與請求的URL匹配的servlet。

從技術上講,您可以在servlet中的過濾器中執行所有操作。您可以構建您的應用程序以在過濾器中執行所有處理和呈現操作,並擁有一個空白的servlet,該servlet無所作爲。主要區別在於,如果沒有servlet映射到給定的URL,那麼容器必須響應一個404錯誤,所以必須始終存在一個servlet,用於映射您想要服務的任何URL。您也可以只有一個servlet映射到一個URL,但您可以有任意數量的過濾器。