1. 程式人生 > >簡述servlet與filter的異同點

簡述servlet與filter的異同點

概念

servlet
是一種執行伺服器端的Java應用程式,具有獨立於平臺和協議的特性,可動態的生成web頁面,工作在客戶端請求與伺服器響應的中間層。

filter
是一個可複用的程式碼片段,可用來轉換HTTP請求、響應和頭資訊,但不能產生一個請求或者響應,只是修改對某一資源的請求,或者修改從某一的響應。

生命週期

過濾器的生命週期比servlet長

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()方法,銷燬例項。

共同之處:都有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()之後的方法,順序與之前的相反。