JAVA學習之 淺析Filter

來源:互聯網
上載者:User

標籤: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體現一種模板方法還是沒辦法參透。。默默地哀傷中。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.