簡述servlet與filter的異同點
概念
servlet
:
是一種執行伺服器端的Java應用程式,具有獨立於平臺和協議的特性,可動態的生成web頁面,工作在客戶端請求與伺服器響應的中間層。
filter
:
是一個可複用的程式碼片段,可用來轉換HTTP請求、響應和頭資訊,但不能產生一個請求或者響應,只是修改對某一資源的請求,或者修改從某一的響應。
生命週期
過濾器的生命週期比servlet長
servlet生命週期
servlet的生命週期始於它被裝入web伺服器的記憶體時,並在web伺服器終止或重新裝入 servlet時結束;
servlet一旦被裝入web伺服器,一般不會從web伺服器記憶體中刪除,直至web伺服器關閉或重新開始。
- 裝入:啟動伺服器時載入Servlet的例項;
- 初始化:web伺服器啟動時或web伺服器接收到請求時,或者兩者之間的某個時刻啟動,初始化工作由
init()
方法負責執行完成; - 呼叫:從第一次到以後的多次訪問,都是隻呼叫
doGet()
或doPost()
方法; - 銷燬:停止伺服器時呼叫
destroy()
方法,銷燬例項。
filter生命週期
過濾器一定要實現javax.servlet包
的Filter介面的三個方法init()
、doFilter()
、destroy()
,空實現也行。
- 啟動伺服器時載入過濾器的例項,並呼叫
init()
方法來初始化例項; - 每一次請求時都只調用方法
doFilter()
- 停止伺服器時呼叫
destroy()
方法,銷燬例項。
共同之處:都有
init()
、destroy()
方法,都需配置WEB-INF/web.xml
職責
servlet
:
- 建立並返回一個包含基於客戶請求性質的動態內容的完整的html頁面;
- 建立可嵌入到現有的html頁面中的一部分html頁面(html片段);
- 讀取客戶端發來的隱藏資料;
- 讀取客戶端發來的顯示資料;
- 與其他伺服器資源(包括資料庫和java的應用程式)進行通訊;
- 通過狀態程式碼和響應頭向客戶端傳送隱藏資料。
filter
:
- 能夠在一個請求到達servlet之前預處理使用者請求,也可以在離開servlet時處理http響應;
- 在執行servlet之前,首先執行filter程式,併為之做一些預處理工作;
- 根據程式需要修改請求和響應;
- 在servlet被呼叫之後截獲servlet的執行。
區別
servlet
:流程是短的,url傳來之後,就對其進行處理,之後返回或轉向到某一自己指定的頁面。它主要用來在業務處理之前進行控制。
filter
:流程是線性的,url傳來之後,檢查之後,可保持原來的流程繼續向下執行,被下一個filter、 servlet接收等,而servlet 處理之後,不會繼續向下傳遞。
filter功能
可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能
主要用來主導流程 。
filter
可用來進行字元編碼的過濾,檢測使用者是否登陸的過濾,禁止頁面快取等
呼叫順序
servlet
:按照web.xml
中的對映配置順序按照配置條件從後向前呼叫第一個滿足條件的Servlet
,呼叫之前事先執行滿足條件的Filter
,不存在層次呼叫Servlet
問題
filter
:
a.按照web.xml
中的對映配置順序按照配置條件從後向前呼叫;
b.層次呼叫doFilter()
方法中FilterChain.doFilter()
之前的內容;
c. 呼叫Servlet
中的service()
方法;
d.service()
方法執行完畢後,層次呼叫doFilter()
中FilterChain.doFilter()
之後的方法,順序與之前的相反。