1. 程式人生 > >Servlet、過濾器、監聽器與攔截器

Servlet、過濾器、監聽器與攔截器

概念

Servlet

  Servlet是一種運行於伺服器端的Java應用程式,具有獨立於平臺和協議的特性,並且可以動態的生成Web頁面,它工作在客戶端請求與伺服器響應的中間層,具有跨平臺與可移植性強等優點。

Filter

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

Listener

  Listener是監聽器,通過Listener可以監聽Web伺服器中某一個執行動作,並根據其要求作出相應的響應。通俗的來說就是在Application,Session,Request三個物件建立、消亡或者往其中新增、修改、刪除屬性時自動執行程式碼功能的元件。

Interceptor

  Interceptor是攔截器,在JavaWeb中主要是面向切面程式設計時使用,一般在呼叫一個方法前亦或是呼叫一個方法後執行該Interceptor攔截器中的方法。在JavaWeb中應用攔截器,比如說我們想得知一個完整請求的響應時間,我們就可以通過新增攔截器的方式,在請求開始前記錄一個開始時間,在請求結束後,記錄一個結束時間,用結束時間減去開始時間,即可獲取該次請求所消耗的時間。這樣以來就可以更加方便我們對於程式的優化處理。

新增位置

  Servlet、Filter、Listener是配置在web.xml中,而Interceptor則是根據程式框架不同,而配置到不同的配置檔案中,比如說我們現在在開發JavaWeb應用程式時,主流的開發框架中一般使用Spring,所以說我們一般將其配置到Spring的spring-servlet.xml中。

生命週期

Servlet生命週期

  Servlet的生命週期始於它被裝入web伺服器的記憶體時,並在web伺服器終止或重新裝入Servlet時結束。Servlet一旦被裝入web伺服器,其一般被載入到web伺服器中是不會被刪除的,只有web伺服器重啟或關閉時才會被刪除,另外Servlet生命週期包含如下4個過程:

  • 載入和例項化

  啟動伺服器時載入Servlet例項。載入和例項化Servlet是由Servlet容器來實現的。載入Servlet之後,容器會通過Java反射機制來建立Servelt例項。

  • 初始化

  在Servlet例項建立後,Servlet容器會呼叫Servlet的init() 方法來初始化該Servlet物件。初始化的目的是可以讓Servlet物件在處理客戶端請求之前完成一些初始化工作,對於每個Servlet例項,其只會呼叫一次init()方法。

  • 執行

  當客戶端請求來到後,Servlet一般會呼叫容器中的doGet()或doPost()方法。Servlet容器首先針對該請求建立ServletRequest和ServletResponse兩個物件,然後Servlet容器會自動呼叫Servelt的service()方法來響應客戶端的請求,同時把ServletRequest和ServletResponse兩個物件傳給service()方法。通過ServletRequest物件,Servlet例項可以獲取客戶端請求資訊,處理完請求後,則將資訊放置在ServletResponse物件中。最後銷燬ServletRequest和ServletResponse物件。

  • 銷燬

  當Servelt例項需要從服務中移除,容器會呼叫destroy()方法,讓該例項釋放掉它所擁有的資源,並將例項中的資料儲存到持久的儲存裝置中。之後Servlet例項便會被Java垃圾回收機制回收。

Filter生命週期

  • 每個Filter一定要實現javax.servlet.Filter介面中的init()doFilter()destroy()三個方法。
  • 啟動伺服器時載入過濾器的例項,並呼叫init()方法來初始化例項;
  • 每一次請求時都只調用方法doFilter()進行處理;
  • 停止伺服器時呼叫destroy()方法,銷燬例項。

Listener生命週期

  Listener的生命週期類似於Servlet和Filter,在這裡不做過多論述,不過在這裡,我們應該更多的關注其在web伺服器中的執行順序,在web伺服器中,它們的執行順序如下:

context-param——>listener——>filter——>servlet

Interceptor生命週期

  以Spring為例,在專案中載入了spring-servlet.xml以後,即開始初始化相應的攔截器,當頁面請求action時,在開始前呼叫preHandle(),在截止後呼叫afterCompletion(),以此完成相應的攔截操作。

職責

Servlet的職責

  • 建立並返回一個包含基於客戶請求性質完整動態的HTML頁面。
  • 建立可嵌入現有的HTML頁面中的一部分HTML頁面(HTML片段)。
  • 可以接受客戶端發來的隱藏或顯示資料。
  • 與其他伺服器資源(包括資料庫和java的應用程式)進行通訊。
  • 通過狀態程式碼和響應頭向客戶端傳送隱藏資料進行響應客戶端的請求。

Filter的職責

  • Filter可以在一個請求到達Servlet之前預處理使用者請求,也可以在離開Servlet時處理HTTP響應。
  • 在執行Servlet之前,首先執行Filter程式,並做一下處理預處理工作。
  • 根據程式需要修改響應和請求。
  • 在Servelt被呼叫之後截獲Servlet的執行。

Listener的職責

  職責跟概念差不多,他們的區別如下:

  • 與ServletContext有關的Listener介面。包括:ServletContextListener、ServletContextAttributeListener。
  • 與HttpSession有關的Listner介面。包括:HttpSessionListener、 HttpSessionAttributeListener、HttpSessionBindingListener、HttpSessionActivationListener。
  • 與ServletRequest有關的Listener介面,包括:ServletRequestListner、ServletRequestAttributeListener。

Interceptor的職責

  Interceptor的職責與過濾器十分相似,通過層層攔截,處理使用者的請求和響應。