標籤:des style blog http java 使用 io ar
上一篇部落格瞭解了Servlet,這次就來瞭解一下Filter,簡單來說Filter是Servlet規範的一種技術,並不是一個Servlet。它也稱為一個過濾器,用來改變一個request和修改一個response,能夠在一個request到達servlet之前預先處理request,也可以在response離開servlet時處理response。
一、生命週期
上一篇也寫到的Servlet的生命週期,Filter與Servlet類似:
1、啟動伺服器時載入Filter的執行個體,並調用Init()方法來初始化執行個體;(Filter的執行個體先於Servlet)
2、每次請求時都只調用方法doFilter()進行處理
3、停止伺服器時調用destroy()方法,銷毀執行個體;(銷毀執行個體晚於Servlet)
(Filter實現javax.servlet包的Filter介面,包括方法:init(),doFilte(),destroy())
二、如何使用Filter
下面以添加使用者為例,對比使用前後的差別:
1、不使用Filter:
2、使用Filter:
對比一下使用Filter給我們帶來的便利:我們知道一個系統不可能只有添加使用者功能,我們還有刪除使用者,修改使用者等等很多需要實現的功能,然而設定字元集是每個功能都需要進行的,如果沒有Filter,我們每一個頁面都要進行設定字元集的操作,我們將設定字元集的方法寫在doFilter中,在request之後記性攔截,每個jsp頁面都能實現對字元集的設定。下面我們來看一個filter是如何?這個功能的:
packagecom.tgb.drp.util.filter; importjava.io.IOException; importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;/** * 採用Filter統一處理字元集 * @author YoungJong * */public classCharsetEncodingFilter implements Filter { private String encoding;/** * 銷毀方法 */publicvoid destroy() {//TODO Auto-generated method stub } /** * 實現doFilter */publicvoid doFilter(ServletRequest request, ServletResponse response,FilterChainchain) throws IOException, ServletException { //設定字元集 request.setCharacterEncoding("GB18030"); //繼續執行 chain.doFilter(request,response); } /** * 初始化方法 */publicvoid init(FilterConfig filterConfig) throws ServletException {//TODO Auto-generated method stub this.encoding=filterConfig.getInitParameter("encoding"); System.out.println("CharsetEncodingFilter.init()-->>endcoding=" + encoding); } }
當然我們還需要再web.xml中進行配置:
<filter><filter-name>CharsetEncodingFilter</filter-name><filter-class>com.tgb.drp.util.filter.CharsetEncodingFilter</filter-class><init-param> <param-name>encoding</param-name> <param-value>GBK</param-value></init-param></filter> <filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping>
三、與servlet的對比:
與servlet相同的是,他們都需要實現介面,但是Filter實現的是Filter,而Servlet實現的則是HttpServlet,他們都需要在web.xml中進行配置,然而他們最大的不相同就是他們的作用:
1.Servlet是:主要是處理用戶端的請求並將其結果發送到用戶端。
2.Filter是:在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。在HttpServletResponse到達用戶端之前,攔截HttpServletResponse。主要是進行攔截,做相應的處理後再傳遞。
差不多就這些內容,不過就這樣戛然而止不太好吧?!所以做個小結:看視頻中有這種說法:Filter體現一種模式職責鏈模式;Servlet體現了一種模式模板方法模式。關於Filter體現一種職責鏈還能夠理解,但是對於Serlet體現一種模板方法還是沒辦法參透。。默默地哀傷中。。