servlet/filter/listener/interceptor區別與聯絡
下面從幾個方面闡述一下題目中四個概念的區別與聯絡:
1、概念
2、生命週期
3、職責
4、執行過程
一、概念:
1、servlet:servlet是一種執行伺服器端的java應用程式,具有獨立於平臺和協議的特性,並且可以動態的生成web頁面,它工作在客戶端請求與伺服器響應的中間層。
2、filter:filter是一個可以複用的程式碼片段,可以用來轉換HTTP請求、響應和頭資訊。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。
3、listener:監聽器,從字面上可以看出listener主要用來監聽只用。通過listener可以監聽web伺服器中某一個執行動作,並根據其要求作出相應的響應。通俗的語言說就是在application,session,request三個物件建立消亡或者往其中新增修改刪除屬性時自動執行程式碼的功能元件。
4、interceptor:是在面向切面程式設計的,就是在你的service或者一個方法,前呼叫一個方法,或者在方法後呼叫一個方法,比如動態代理就是攔截器的簡單實現,在你呼叫方法前打印出字串(或者做其它業務邏輯的操作),也可以在你呼叫方法後打印出字串,甚至在你丟擲異常的時候做業務邏輯的操作。
5、servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的攔截器配置到struts.xml中。spring的攔截器配置到spring.xml中。
二、生命週期:
1、servlet:servlet的生命週期始於它被裝入web伺服器的記憶體時,並在web伺服器終止或重新裝入servlet時結束。servlet一旦被裝入web伺服器,一般不會從web伺服器記憶體中刪除,直至web伺服器關閉或重新結束。
(1)、裝入:啟動伺服器時載入Servlet的例項;
(2)、初始化:web伺服器啟動時或web伺服器接收到請求時,或者兩者之間的某個時刻啟動。初始化工作有init()方法負責執行完成;
(3)、呼叫:從第一次到以後的多次訪問,都是隻呼叫doGet()或doPost()方法;
(4)、銷燬:停止伺服器時呼叫destroy()方法,銷燬例項。
2、filter:(一定要實現javax.servlet包的Filter介面的三個方法init()、doFilter()、destroy(),空實現也行)
(1)、啟動伺服器時載入過濾器的例項,並呼叫init()方法來初始化例項;
(2)、每一次請求時都只調用方法doFilter()進行處理;
(3)、停止伺服器時呼叫destroy()方法,銷燬例項。
3、listener:類似於servlet和filter
web.xml 的載入順序是:context- param -> listener -> filter -> servlet
4、interceptor:以struts的攔截器為例,載入了struts.xml以後,初始化相應攔截器。當action請求來時呼叫intercept方法,伺服器停止銷燬interceptor。
三、職責
1、servlet:
建立並返回一個包含基於客戶請求性質的動態內容的完整的html頁面;
建立可嵌入到現有的html頁面中的一部分html頁面(html片段);
讀取客戶端發來的隱藏資料;
讀取客戶端發來的顯示資料;
與其他伺服器資源(包括資料庫和java的應用程式)進行通訊;
通過狀態程式碼和響應頭向客戶端傳送隱藏資料。
2、filter:
filter能夠在一個請求到達servlet之前預處理使用者請求,也可以在離開servlet時處理http響應:
在執行servlet之前,首先執行filter程式,併為之做一些預處理工作;
根據程式需要修改請求和響應;
在servlet被呼叫之後截獲servlet的執行
3、listener:職責如概念。
servlet2.4規範中提供了8個listener介面,可以將其分為三類,分別如下:
第一類:與servletContext有關的listner介面。包括:ServletContextListener、ServletContextAttributeListener
第二類:與HttpSession有關的Listner介面。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener;
第三類:與ServletRequest有關的Listener介面,包括:ServletRequestListner、ServletRequestAttributeListener
4、interceptor:與過濾器十分相似,通過層層攔截,處理使用者的請求和響應。
備註:web.xml 的載入順序是:context-param -> listener -> filter -> servlet 。瞭解了這幾個概念的區別以後,不難理論這個載入順序了。
四、幾個區別:
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的生命週期中,攔截器可以多次呼叫,而過濾器只能在容器初始化時被呼叫一次。
五、執行流程圖:
1、servlet:
2、filter:
3、listener:
4、interceptor: