在javaweb開發中,Servlet和Filter是很重要的兩個概念,我們平時進行javaweb開發的時候,會經常和Servlet和Filter打交道,但我們真的瞭解Servlet和Filter嗎? 一、基本概念 Servlet: Servlet 是在WEB伺服器上運行的程式。這個詞是在 Java ...
在javaweb開發中,Servlet和Filter是很重要的兩個概念,我們平時進行javaweb開發的時候,會經常和Servlet和Filter打交道,但我們真的瞭解Servlet和Filter嗎?
一、基本概念
Servlet:
Servlet 是在WEB伺服器上運行的程式。這個詞是在 Java applet的環境中創造的,Java applet 是一種當作單獨文件跟網頁一起發送的小程式,它通常用於在客戶端運行,結果得到為用戶進行運算或者根據用戶互作用定點陣圖形等服務。
伺服器上需要一些程式,常常是根據用戶輸入訪問資料庫的程式。這些通常是使用公共網關介面(Common Gateway Interface,CGI)應用程式完成的。然而,在伺服器上運行 Java,這種程式可使用 Java 編程語言實現。在通信量大的伺服器上,JavaServlet 的優點在於它們的執行速度更快於 CGI 程式。各個用戶請求被激活成單個程式中的一個線程,而無需創建單獨的進程,這意味著伺服器端處理請求的系統開銷將明顯降低。
Servlet創建並返回一個包含基於客戶請求性質的動態內容的完整的html頁面;
創建可嵌入到現有的html頁面中的一部分html頁面(html片段);
讀取客戶端發來的隱藏數據;
讀取客戶端發來的顯示數據;
與其他伺服器資源(包括資料庫和java的應用程式)進行通信;
通過狀態代碼和響應頭向客戶端發送隱藏數據。
Filter:
filter是一個可以復用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。
二、生命周期:
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()方法,銷毀實例。
三、職責
1、servlet:
創建並返回一個包含基於客戶請求性質的動態內容的完整的html頁面;
創建可嵌入到現有的html頁面中的一部分html頁面(html片段);
讀取客戶端發來的隱藏數據;
讀取客戶端發來的顯示數據;
與其他伺服器資源(包括資料庫和java的應用程式)進行通信;
通過狀態代碼和響應頭向客戶端發送隱藏數據。
2、filter:
filter能夠在一個請求到達servlet之前預處理用戶請求,也可以在離開servlet時處理http響應:
在執行servlet之前,首先執行filter程式,併為之做一些預處理工作;
根據程式需要修改請求和響應;
在servlet被調用之後截獲servlet的執行
四、區別:
1,servlet 流程是短的,url傳來之後,就對其進行處理,之後返回或轉向到某一自己指定的頁面。它主要用來在 業務處理之前進行控制.
2,filter 流程是線性的, url傳來之後,檢查之後,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等,而servlet 處理之後,不會繼續向下傳遞。filter功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能主要用來主導流程。
filter可用來進行字元編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等
五、執行流程圖:
1、servlet:
2、filter:
javaweb開發我們常用到的後臺框架有Struts2和Springmvc。其中Struts2的入口filter,而Springmvc的入口是servlet;
我們在使用Struts2進行開發時,web.xml中的核心控制器是這樣配置的
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
而使用Springmvc進行開發時,其web.xml是這樣配置的
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>