java學習-servlet/filter/listener/interceptor區別與聯系(轉)


我的博客:www.while0.com

我的博客:www.shishangguan.net 

原文章地址:http://www.2cto.com/kf/201301/186681.html

由於最近兩個月工作比較清閑,個人也比較“上進”,利用工作空余時間,也繼續學習了一下,某天突然想起struts2和struts1的區別的時候,發現 為什么struts1要用servlet,而struts2要用filter呢?一時又發現,servlet和filter有什么區別呢?於是看了看 web.xml,一時又發現,咦,servlet、filter、listener?還有個interceptor?對於這幾個概念,本應是初學者就掌握 的東東了,可惜本人基礎學的不好,只能是現在補課。於是就有了這篇博客。

 
         慢慢來吧,需要補課的地方還有很多很多呀。初學的時候都不知道他們存在呢。呵呵。
 
         下面從幾個方面闡述一下題目中四個概念的區別與聯系:
 
         1、概念
 
         2、生命周期
 
         3、職責
 
         4、執行過程
 
        
 
         一、概念:
 
         1、servlet:servlet是一種運行服務器端的java應用程序,具有獨立於平台和協議的特性,並且可以動態的生成web頁面,它工作在客戶端請求與服務器響應的中間層。
 
         2、filter:filter是一個可以復用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。
 
        3、listener:監聽器,從字面上可以看出listener主要用來監聽只用。通過listener可以監聽web服務器中某一個執行動作,並根據 其要求作出相應的響應。通俗的語言說就是在application,session,request三個對象創建消亡或者往其中添加修改刪除屬性時自動執 行代碼的功能組件。
 
         4、interceptor:是在面向切面 編程的,就是在你的service或者一個方法,前調用一個方法,或者在方法后調用一個方法,比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法后打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。
 
      5、servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的攔截器配置到struts.xml中。spring的攔截器配置到spring.xml中。 
 
 
        二、生命周期:
 
        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()方法,銷毀實例。
\
         3、listener:類似於servlet和filter
 
           web.xml 的加載順序是:context- param -> listener -> filter -> servlet 
 
       4、interceptor:以struts的攔截器為例,加載了struts.xml以后,初始化相應攔截器。當action請求來時調用intercept方法,服務器停止銷毀interceptor。
 
       三、職責
 
       1、servlet:
 
        創建並返回一個包含基於客戶請求性質的動態內容的完整的html頁面;
        創建可嵌入到現有的html頁面中的一部分html頁面(html片段);
        讀取客戶端發來的隱藏數據;
        讀取客戶端發來的顯示數據;
        與其他服務器資源(包括 數據庫和java的應用程序)進行通信;
        通過狀態代碼和響應頭向客戶端發送隱藏數據。
 
       2、filter:
 
        filter能夠在一個請求到達servlet之前預處理用戶請求,也可以在離開servlet時處理http響應:
        在執行servlet之前,首先執行filter程序,並為之做一些預處理工作;
        根據程序需要修改請求和響應;
        在servlet被調用之后截獲servlet的執行
 
         3、listener:職責如概念。
 
          servlet2.4規范中提供了8個listener接口,可以將其分為三類,分別如下:
         第一類:與servletContext有關的listner接口。包括:ServletContextListener、ServletContextAttributeListener
         第二類:與HttpSession有關的Listner接口。包括:HttpSessionListner、 HttpSessionAttributeListener、HttpSessionBindingListener、                      HttpSessionActivationListener;
         第三類:與ServletRequest有關的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener
 
        4、interceptor:與過濾器十分相似,通過層層攔截,處理用戶的請求和響應。
 
 
 
 
        四、幾個區別:
 
        1,servlet 流程是短的,url傳來之后,就對其進行處理,之后返回或轉向到某一自己指定的頁面。它主要用來在 業務處理之前進行控制.
        2,filter 流程是線性的, url傳來之后,檢查之后,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等,而servlet 處理之后,不會繼續向下傳遞。filter功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能主要用來主導流程。
         filter可用來進行字符編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等
        3, servlet,filter都是針對url之類的,而listener是針對對象的操作的,如session的創建,session.setAttribute的發生,在這樣的事件發生時做一些事情。
     可用來進行:Spring整合Struts,為Struts的action注入屬性,web應用定時任務的實現,在線人數的統計等
 
       4,interceptor 攔截器,類似於filter,不過在struts.xml中配置,不是在web.xml,並且不是針對URL的,而是針對action,當頁面提交 action時,進行過濾操作,相當於struts1.x提供的plug-in機制,可以看作,前者是struts1.x自帶的filter,而 interceptor 是struts2 提供的filter.
    與filter不同點:(1)不在web.xml中配置,而是在struts.xml中完成配置,與action在一起
                            ( 2  ) 可由action自己指定用哪個interceptor 來在接收之前做事    
 
        5,struts2中的過濾器和攔截器的區別與聯系:
 
      (1)、攔截器是基於java反射機制的,而過濾器是基於函數回調的。
      (2)、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器。
      (3)、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
      (4)、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。
      (5)、在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。
 
        
 
        五、執行流程圖:
 
         1、servlet:
 
            \
 
 
          2、filter:
 
          
\
               
 
             
 
 
           3、listener:
 
              \
 
           4、interceptor:
 
            
\


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM