因爲最近兩個月工做比較悠閒,我的也比較「上進」,利用工做空餘時間,也繼續學習了一下,某天忽然想起struts2和struts1的區別的時 候,發現爲何struts1要用servlet,而struts2要用filter呢?一時又發現,servlet和filter有什麼區別呢?因而看 了看web.xml,一時又發現,咦,servlet、filter、listener?還有個interceptor?對於這幾個概念,本應是初學者就 掌握的東東了,惋惜本人基礎學的很差,只能是如今補課。因而就有了這篇博客。html
慢慢來吧,須要補課的地方還有不少不少呀。初學的時候都不知道他們存在呢。呵呵。java
下面從幾個方面闡述一下題目中四個概念的區別與聯繫:web
一、概念spring
二、生命週期數據庫
三、職責緩存
四、執行過程服務器
1、概念:session
一、servlet:servlet是一種運行服務器端的java應用程序,具備獨立於平臺和協議的特性,而且能夠動態的生成web頁面,它工做在客戶端請求與服務器響應的中間層。app
二、filter:filter是一個能夠複用的代碼片斷,能夠用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。函數
三、listener:監聽器,從字面上能夠看出listener主要用來監聽只用。經過listener能夠監聽web服務器中某一個執行動做,並根據 其要求做出相應的響應。通俗的語言說就是在application,session,request三個對象建立消亡或者往其中添加修改刪除屬性時自動執 行代碼的功能組件。
四、interceptor: 五、servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的攔截器配置到struts.xml中。spring的攔截器配置到spring.xml中。
2、生命週期:
一、servlet:servlet的生命週期始於它被裝入web服務器的內存時,並在web服務器終止或從新裝入servlet時結束。servlet一旦被裝入web服務器,通常不會從web服務器內存中刪除,直至web服務器關閉或從新結束。
(1)、裝入:啓動服務器時加載Servlet的實例;
(2)、初始化:web服務器啓動時或web服務器接收到請求時,或者二者之間的某個時刻啓動。初始化工做有init()方法負責執行完成;
(3)、調用:從第一次到之後的屢次訪問,都是隻調用doGet()或doPost()方法;
(4)、銷燬:中止服務器時調用destroy()方法,銷燬實例。
二、filter:(必定要實現javax.servlet包的Filter接口的三個方法init()、doFilter()、destroy(),空實現也行)
(1)、啓動服務器時加載過濾器的實例,並調用init()方法來初始化實例;
(2)、每一次請求時都只調用方法doFilter()進行處理;
(3)、中止服務器時調用destroy()方法,銷燬實例。
三、listener:相似於servlet和filter
web.xml 的加載順序是:context- param -> listener -> filter -> servlet
四、interceptor:以struts的攔截器爲例,加載了struts.xml之後,初始化相應攔截器。當action請求來時調用intercept方法,服務器中止銷燬interceptor。
3、職責
一、servlet:
建立並返回一個包含基於客戶請求性質的動態內容的完整的html頁面;
建立可嵌入到現有的html頁面中的一部分html頁面(html片斷);
讀取客戶端發來的隱藏數據;
讀取客戶端發來的顯示數據;
與其餘服務器資源(包括數據庫和java的應用程序)進行通訊;
經過狀態代碼和響應頭向客戶端發送隱藏數據。
二、filter:
filter可以在一個請求到達servlet以前預處理用戶請求,也能夠在離開servlet時處理http響應:
在執行servlet以前,首先執行filter程序,併爲之作一些預處理工做;
根據程序須要修改請求和響應;
在servlet被調用以後截獲servlet的執行
三、listener:職責如概念。
servlet2.4規範中提供了8個listener接口,能夠將其分爲三類,分別以下:
第一類:與servletContext有關的listner接口。包括:ServletContextListener、ServletContextAttributeListener
第二類:與HttpSession有關的Listner接口。包括:HttpSessionListner、 HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener;
第三類:與ServletRequest有關的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener
四、interceptor:與過濾器十分類似,經過層層攔截,處理用戶的請求和響應。
備註:web.xml 的加載順序是:context-param -> listener -> filter -> servlet 。瞭解了這幾個概念的區別之後,不難理論這個加載順序了。
4、幾個區別:
1,servlet 流程是短的,url傳來以後,就對其進行處理,以後返回或轉向到某一本身指定的頁面。它主要用來在 業務處理以前進行控制.
2,filter 流程是線性的, url傳來以後,檢查以後,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等,而servlet 處理以後,不會繼續向下傳遞。filter功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能主要用來主導流程。
filter可用來進行字符編碼的過濾,檢測用戶是否登錄的過濾,禁止頁面緩存等
3, servlet,filter都是針對url之類的,而listener是針對對象的操做的,如session的建立,session.setAttribute的發生,在這樣的事件發生時作一些事情。
可用來進行:Spring整合Struts,爲Struts的action注入屬性,web應用定時任務的實現,在線人數的統計等
4,interceptor 攔截器,相似於filter,不過在struts.xml中配置,不是在web.xml,而且不是針對URL的,而是針對action,當頁面提交 action時,進行過濾操做,至關於struts1.x提供的plug-in機制,能夠看做,前者是struts1.x自帶的filter,而 interceptor 是struts2 提供的filter.
與filter不一樣點:(1)不在web.xml中配置,而是在struts.xml中完成配置,與action在一塊兒
( 2 ) 可由action本身指定用哪一個interceptor 來在接收以前作事
5,struts2中的過濾器和攔截器的區別與聯繫:
(1)、攔截器是基於java反射機制的,而過濾器是基於函數回調的。
(2)、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器。
(3)、攔截器只能對Action請求起做用,而過濾器則能夠對幾乎全部請求起做用。
(4)、攔截器能夠訪問Action上下文、值棧裏的對象,而過濾器不能。
(5)、在Action的生命週期中,攔截器能夠屢次調用,而過濾器只能在容器初始化時被調用一次。
5、執行流程圖:
一、servlet:
二、filter:
三、listener:
四、interceptor: