Servlet中的過濾器和監聽器
1.什麼是過濾器?
Servlet規範中定義的一種特殊的元件,用來攔截容器的呼叫過程。容器收到請求之後,首先呼叫過濾器,然後再呼叫Servlet
2.生命週期:
1、servlet:servlet的生命週期始於它被裝入web伺服器的記憶體時,並在web伺服器終止或重新裝入servlet時結束。servlet一旦被裝入web伺服器,一般不會從web伺服器記憶體中刪除,直至web伺服器關閉或重新結束。
(1)、裝入:啟動伺服器時載入Servlet的例項;
(2)、初始化:web伺服器啟動時或web伺服器接收到請求時,或者兩者之間的某個時刻啟動。初始化工作有init()方法負責執行完成;
(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。
3.過濾器的執行流程
Øweb.xml中註冊過濾器
<!-- 過濾器 --> <filter> <filter-name>filter1</filter-name> <filter-class>web.CommentFilter</filter-class> </filter> <filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/comment</url-pattern> </filter-mapping>
4.什麼是監聽器?
servlet規範中定義的一種特殊的元件,用來監聽容器產生的事件並進行相應的處理。容器會為每個監聽器只建立一個例項。
5.監聽器的分類:
第一維度:
按照被監聽的物件分:ServletRequest域 HttpSession域 ServletContext域
第二維度:
按照監聽的內容分: 監聽域物件的建立與銷燬的 監聽域物件的屬性變化的
總結如圖:
6.如何編寫監聽器呢?
a)編寫一個監聽器類去實現監聽器介面
b)覆蓋監聽器的方法
c)需要在web.xml中進行配置---註冊
7.過濾器和攔截器的區別與聯絡:
a)攔截器是基於java反射機制的,而過濾器是基於函式回撥的。
b)過濾器依賴與servlet容器,而攔截器不依賴與servlet容器。
c)攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
d)攔截器可以訪問Action上下文、值棧裡的物件,而過濾器不能。
e)在Action的生命週期中,攔截器可以多次呼叫,而過濾器只能在容器初始化時被呼叫一次
成功的祕訣在於永不改變既定的目標