下面主要從幾個方面闡述一下題目中四個概念的區別與聯繫:
- 概念
- 生命週期
- 職責
- 執行過程
一、概念
1、servlet
servlet是一種運行服務器端的java應用程序,具有獨立於平臺和協議的特性,並且可以動態的生成web頁面,它工作在客戶端請求與服務器響應的中間層。
2、filter
filter是實現了javax.servlet.Filter接口的服務器端程序,主要的用途是設置字符集、控制權限、控制轉向、做一些業務邏輯判斷等。其工作原理是,只要你在web.xml文件配置好要攔截的客戶端請求,它都會幫你攔截到請求,此時你就可以對請求或響應(Request、Response)統一設置編碼,簡化操作;同時還可進行邏輯判斷,如用戶是否已經登陸、有沒有權限訪問該頁面等等工作。
Filter可以認爲是Servlet的一種“加強版”,它主要用於對用戶請求進行預處理,也可以對HttpServletResponse進行後處理,是個典型的處理鏈。Filter也可以對用戶請求生成響應,這一點與Servlet相同,但實際上很少會使用Filter向用戶請求生成響應。使用Filter完整的流程是:Filter對用戶請求進行預處理,接着將請求交給Servlet進行處理並生成響應,最後Filter再對服務器響應進行後處理。
3、listener
listener監聽器,從字面上可以看出listener主要用來監聽只用。通過listener可以監聽web服務器中某一個執行動作,並根據其要求作出相應的響應。通俗的語言說就是在application,session,request三個對象創建消亡或者往其中添加修改刪除屬性時自動執行代碼的功能組件。
4、interceptor
interceptor是在面向切面編程的,就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法,比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法後打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。
注: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
servlet 流程是短的,url傳來之後,就對其進行處理,之後返回或轉向到某一自己指定的頁面。它主要用來在 業務處理之前進行控制,如:
- 創建並返回一個包含基於客戶請求性質的動態內容的完整的html頁面;
- 創建可嵌入到現有的html頁面中的一部分html頁面(html片段);
- 讀取客戶端發來的隱藏數據;
- 讀取客戶端發來的顯示數據;
- 與其他服務器資源(包括數據庫和java的應用程序)進行通信;
- 通過狀態代碼和響應頭向客戶端發送隱藏數據。
2、filter
filter流程是線性的,url傳來檢查之後,可保持原來的流程繼續向下執行,被下一個filter或servlet接收等,而servlet 處理之後,不會繼續向下傳遞。servlet的功能主要用來主導流程,而filter功能可用來保持流程繼續按照原來的方式進行下去或者主導流程。如:
- filter能夠在一個請求到達servlet之前預處理用戶請求,也可以在離開servlet時處理http響應;
- 在執行servlet之前,首先執行filter程序,併爲之做一些預處理工作;
- 根據程序需要修改請求和響應;
- 在servlet被調用之後截獲servlet的執行
3、listener
servlet,filter都是針對url之類的,而listener是針對對象的操作的,如session的創建,session.setAttribute的發生,在這樣的事件發生時做一些事情。一般就是在application,session,request三個對象創建消亡或者往其中添加修改刪除屬性時自動執行代碼的功能組件。
注:servlet2.4規範中提供了8個listener接口,可以將其分爲三類,分別如下:
- 第一類:與servletContext有關的listner接口。包括:ServletContextListener、ServletContextAttributeListener
- 第二類:與HttpSession有關的Listner接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、HttpSessionActivationListener;
- 第三類:與ServletRequest有關的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener
4、interceptor
與過濾器十分相似,通過層層攔截,處理用戶的請求和響應。以Spring的攔截器爲例,interceptor歸Spring管理,配置在spring文件中,因此能使用Spring裏的任何資源、對象,例如 Service對象、數據源、事務管理等,通過IoC注入到攔截器即可。
注:web.xml 的加載順序是:context-param -> listener -> filter -> servlet 。瞭解了這幾個概念的區別以後,不難理論這個加載順序了。