servlet/filter/listener/interceptor区别与联系(转)
由于最近兩個月工作比較清閑,個人也比較“上進”,利用工作空余時間,也繼續(xù)學(xué)習(xí)了一下,某天突然想起struts2和struts1的區(qū)別的時候,發(fā)現(xiàn)為什么struts1要用servlet,而struts2要用filter呢?一時又發(fā)現(xiàn),servlet和filter有什么區(qū)別呢?于是看了看web.xml,一時又發(fā)現(xiàn),咦,servlet、filter、listener?還有個interceptor?對于這幾個概念,本應(yīng)是初學(xué)者就掌握的東東了,可惜本人基礎(chǔ)學(xué)的不好,只能是現(xiàn)在補課。于是就有了這篇博客。
? ? ? ? ?慢慢來吧,需要補課的地方還有很多很多呀。初學(xué)的時候都不知道他們存在呢。呵呵。
? ? ? ? ?下面從幾個方面闡述一下題目中四個概念的區(qū)別與聯(lián)系:
? ? ? ? ?1、概念
? ? ? ? ?2、生命周期
? ? ? ? ?3、職責(zé)
? ? ? ? ?4、執(zhí)行過程
? ? ? ??
? ? ? ? ?一、概念:
? ? ? ? ?1、servlet:servlet是一種運行服務(wù)器端的java應(yīng)用程序,具有獨立于平臺和協(xié)議的特性,并且可以動態(tài)的生成web頁面,它工作在客戶端請求與服務(wù)器響應(yīng)的中間層。
? ? ? ? ?2、filter:filter是一個可以復(fù)用的代碼片段,可以用來轉(zhuǎn)換HTTP請求、響應(yīng)和頭信息。Filter不像Servlet,它不能產(chǎn)生一個請求或者響應(yīng),它只是修改對某一資源的請求,或者修改從某一的響應(yīng)。
? ? ? ? 3、listener:監(jiān)聽器,從字面上可以看出listener主要用來監(jiān)聽只用。通過listener可以監(jiān)聽web服務(wù)器中某一個執(zhí)行動作,并根據(jù)其要求作出相應(yīng)的響應(yīng)。通俗的語言說就是在application,session,request三個對象創(chuàng)建消亡或者往其中添加修改刪除屬性時自動執(zhí)行代碼的功能組件。
? ? ? ? ?4、interceptor:是在面向切面編程的,就是在你的service或者一個方法,前調(diào)用一個方法,或者在方法后調(diào)用一個方法,比如動態(tài)代理就是攔截器的簡單實現(xiàn),在你調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作),也可以在你調(diào)用方法后打印出字符串,甚至在你拋出異常的時候做業(yè)務(wù)邏輯的操作。
? ? ? 5、servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的攔截器配置到struts.xml中。spring的攔截器配置到spring.xml中。?
? ? ? ? 二、生命周期:
? ? ? ? 1、servlet:servlet的生命周期始于它被裝入web服務(wù)器的內(nèi)存時,并在web服務(wù)器終止或重新裝入servlet時結(jié)束。servlet一旦被裝入web服務(wù)器,一般不會從web服務(wù)器內(nèi)存中刪除,直至web服務(wù)器關(guān)閉或重新結(jié)束。
? ? ? ? ??(1)、裝入:啟動服務(wù)器時加載Servlet的實例;?
? ? ? ? (2)、初始化:web服務(wù)器啟動時或web服務(wù)器接收到請求時,或者兩者之間的某個時刻啟動。初始化工作有init()方法負責(zé)執(zhí)行完成;?
? ? ? ? (3)、調(diào)用:從第一次到以后的多次訪問,都是只調(diào)用doGet()或doPost()方法;?
? ? ? ? (4)、銷毀:停止服務(wù)器時調(diào)用destroy()方法,銷毀實例。?
? ? ? ??
? ? ? ? ? ?2、filter:(一定要實現(xiàn)javax.servlet包的Filter接口的三個方法init()、doFilter()、destroy(),空實現(xiàn)也行)?
? ? ? ? ?(1)、啟動服務(wù)器時加載過濾器的實例,并調(diào)用init()方法來初始化實例;?
? ? ? ? ?(2)、每一次請求時都只調(diào)用方法doFilter()進行處理;?
? ? ? ? ?(3)、停止服務(wù)器時調(diào)用destroy()方法,銷毀實例。
? ? ? ? ?3、listener:類似于servlet和filter
? ? ? ? ? ?web.xml?的加載順序是:context- param?->?listener?->?filter?->?servlet?
? ? ? ?4、interceptor:以struts的攔截器為例,加載了struts.xml以后,初始化相應(yīng)攔截器。當(dāng)action請求來時調(diào)用intercept方法,服務(wù)器停止銷毀interceptor。
? ? ? ?三、職責(zé)
? ? ? ?1、servlet:
? ? ? ? 創(chuàng)建并返回一個包含基于客戶請求性質(zhì)的動態(tài)內(nèi)容的完整的html頁面;
? ? ? ? 創(chuàng)建可嵌入到現(xiàn)有的html頁面中的一部分html頁面(html片段);
? ? ? ? 讀取客戶端發(fā)來的隱藏數(shù)據(jù);
? ? ? ? 讀取客戶端發(fā)來的顯示數(shù)據(jù);
? ? ? ? 與其他服務(wù)器資源(包括數(shù)據(jù)庫和java的應(yīng)用程序)進行通信;
? ? ? ? 通過狀態(tài)代碼和響應(yīng)頭向客戶端發(fā)送隱藏數(shù)據(jù)。
? ? ? ?2、filter:
? ? ? ??filter能夠在一個請求到達servlet之前預(yù)處理用戶請求,也可以在離開servlet時處理http響應(yīng):
? ? ? ? 在執(zhí)行servlet之前,首先執(zhí)行filter程序,并為之做一些預(yù)處理工作;
? ? ? ? 根據(jù)程序需要修改請求和響應(yīng);
? ? ? ? 在servlet被調(diào)用之后截獲servlet的執(zhí)行
? ? ? ? ?3、listener:職責(zé)如概念。
? ? ? ? ??servlet2.4規(guī)范中提供了8個listener接口,可以將其分為三類,分別如下:
? ? ? ? ?第一類:與servletContext有關(guān)的listner接口。包括:ServletContextListener、ServletContextAttributeListener
? ? ? ? ?第二類:與HttpSession有關(guān)的Listner接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 ? ? ? ? ? ? ? ? ? ? ?HttpSessionActivationListener;
? ? ? ? ?第三類:與ServletRequest有關(guān)的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener
? ? ? ? 4、interceptor:與過濾器十分相似,通過層層攔截,處理用戶的請求和響應(yīng)。
?
? ? ? ? 備注:web.xml 的加載順序是:context-param -> listener -> filter -> servlet?。了解了這幾個概念的區(qū)別以后,不難理論這個加載順序了。
?
? ? ? ? 四、幾個區(qū)別:
? ? ? ??1,servlet 流程是短的,url傳來之后,就對其進行處理,之后返回或轉(zhuǎn)向到某一自己指定的頁面。它主要用來在?業(yè)務(wù)處理之前進行控制.
? ? ? ? 2,filter 流程是線性的, url傳來之后,檢查之后,可保持原來的流程繼續(xù)向下執(zhí)行,被下一個filter, servlet接收等,而servlet 處理之后,不會繼續(xù)向下傳遞。filter功能可用來保持流程繼續(xù)按照原來的方式進行下去,或者主導(dǎo)流程,而servlet的功能主要用來主導(dǎo)流程。
? ? ? ? ?filter可用來進行字符編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等
? ? ? ? 3, servlet,filter都是針對url之類的,而listener是針對對象的操作的,如session的創(chuàng)建,session.setAttribute的發(fā)生,在這樣的事件發(fā)生時做一些事情。
???? 可用來進行:Spring整合Struts,為Struts的action注入屬性,web應(yīng)用定時任務(wù)的實現(xiàn),在線人數(shù)的統(tǒng)計等
?
? ? ? ?4,interceptor 攔截器,類似于filter,不過在struts.xml中配置,不是在web.xml,并且不是針對URL的,而是針對action,當(dāng)頁面提交action時,進行過濾操作,相當(dāng)于struts1.x提供的plug-in機制,可以看作,前者是struts1.x自帶的filter,而interceptor 是struts2 提供的filter.
??? 與filter不同點:(1)不在web.xml中配置,而是在struts.xml中完成配置,與action在一起
??????????????????????????? ( 2? ) 可由action自己指定用哪個interceptor 來在接收之前做事? ??
? ? ? ? 5,struts2中的過濾器和攔截器的區(qū)別與聯(lián)系:
? ? ? (1)、攔截器是基于java反射機制的,而過濾器是基于函數(shù)回調(diào)的。
? ? ? (2)、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器。
? ? ? (3)、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
? ? ? (4)、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。
? ? ? (5)、在Action的生命周期中,攔截器可以多次調(diào)用,而過濾器只能在容器初始化時被調(diào)用一次。
? ? ? ??
? ? ? ? 五、執(zhí)行流程圖:
? ? ? ? ?1、servlet:
? ? ? ? ? ?
? ? ? ? ? 2、filter:
? ? ? ? ??
? ? ? ? ? ? ? ?
? ? ? ? ? ? ?
? ? ? ? ? ?3、listener:
? ? ? ? ? ? ?
? ? ? ? ? ?4、interceptor:
? ? ? ? ? ??
轉(zhuǎn)載于:https://www.cnblogs.com/mingf123/p/3760025.html
總結(jié)
以上是生活随笔為你收集整理的servlet/filter/listener/interceptor区别与联系(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac os 显示文件列表命令 ls -
- 下一篇: MySQL中主键的选择与磁盘性能