本篇內(nèi)容介紹了“servlet/filter/listener/interceptor區(qū)別與聯(lián)系是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)長(zhǎng)期為1000+客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏(yíng)平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為雄縣企業(yè)提供專(zhuān)業(yè)的網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,雄縣網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
從以下幾個(gè)方面闡述一下題目中四個(gè)概念的區(qū)別與聯(lián)系:
1、概念 2、生命周期 3、職責(zé) 4、區(qū)別 5、執(zhí)行流程圖
servlet:servlet是一種運(yùn)行服務(wù)器端的java應(yīng)用程序,具有獨(dú)立于平臺(tái)和協(xié)議的特性,并且可以動(dòng)態(tài)的生成web頁(yè)面,它工作在客戶(hù)端請(qǐng)求與服務(wù)器響應(yīng)的中間層。
filter:filter是一個(gè)可以復(fù)用的代碼片段,可以用來(lái)轉(zhuǎn)換HTTP請(qǐng)求、響應(yīng)和頭信息。Filter不像Servlet,它不能產(chǎn)生一個(gè)請(qǐng)求或者響應(yīng),它只是修改對(duì)某一資源的請(qǐng)求,或者修改從某一的響應(yīng)。
listener:監(jiān)聽(tīng)器,從字面上可以看出listener主要用來(lái)監(jiān)聽(tīng)只用。通過(guò)listener可以監(jiān)聽(tīng)web服務(wù)器中某一個(gè)執(zhí)行動(dòng)作,并根據(jù)其要求作出相應(yīng)的響應(yīng)。通俗的語(yǔ)言說(shuō)就是在application,session,request三個(gè)對(duì)象創(chuàng)建消亡或者往其中添加修改刪除屬性時(shí)自動(dòng)執(zhí)行代碼的功能組件。
interceptor:是在面向切面編程的,就是在你的service或者一個(gè)方法,前調(diào)用一個(gè)方法,或者在方法后調(diào)用一個(gè)方法,比如動(dòng)態(tài)代理就是攔截器的簡(jiǎn)單實(shí)現(xiàn),在你調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作),也可以在你調(diào)用方法后打印出字符串,甚至在你拋出異常的時(shí)候做業(yè)務(wù)邏輯的操作。
servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的攔截器配置到struts.xml中。spring的攔截器配置到spring.xml中。
servlet:servlet的生命周期始于它被裝入web服務(wù)器的內(nèi)存時(shí),并在web服務(wù)器終止或重新裝入servlet時(shí)結(jié)束。servlet一旦被裝入web服務(wù)器,一般不會(huì)從web服務(wù)器內(nèi)存中刪除,直至web服務(wù)器關(guān)閉或重新裝入。
(1). 裝入:?jiǎn)?dòng)服務(wù)器時(shí)加載Servlet的實(shí)例(如果你設(shè)置
(2). 初始化:web服務(wù)器啟動(dòng)時(shí)或web服務(wù)器接收到請(qǐng)求時(shí),或者兩者之間的某個(gè)時(shí)刻啟動(dòng)。初始化工作有init方法負(fù)責(zé)執(zhí)行完成;(init方法只執(zhí)行一次)
(3). 調(diào)用:從第一次到以后的多次訪(fǎng)問(wèn),都是只調(diào)用doGet()或doPost()方法;
(4). 銷(xiāo)毀:停止服務(wù)器時(shí)調(diào)用destroy()方法,銷(xiāo)毀實(shí)例。
image.png
filter:(一定要實(shí)現(xiàn)javax.servlet包的Filter接口的三個(gè)方法init()、doFilter()、destroy(),空實(shí)現(xiàn)也行)
(1). 啟動(dòng)服務(wù)器時(shí)加載過(guò)濾器的實(shí)例,并調(diào)用init()方法來(lái)初始化實(shí)例;
(2). 每一次請(qǐng)求時(shí)都只調(diào)用方法doFilter()進(jìn)行處理;
(3). 停止服務(wù)器時(shí)調(diào)用destroy()方法,銷(xiāo)毀實(shí)例。
listener:類(lèi)似于servlet和filter
web.xml 的加載順序是:context- param -> listener -> filter -> servlet
interceptor:以struts的攔截器為例,加載了struts.xml以后,初始化相應(yīng)攔截器。當(dāng)action請(qǐng)求來(lái)時(shí)調(diào)用intercept方法,服務(wù)器停止銷(xiāo)毀interceptor。
servlet:
創(chuàng)建并返回一個(gè)包含基于客戶(hù)請(qǐng)求性質(zhì)的動(dòng)態(tài)內(nèi)容的完整的html頁(yè)面;
創(chuàng)建可嵌入到現(xiàn)有的html頁(yè)面中的一部分html頁(yè)面(html片段);
讀取客戶(hù)端發(fā)來(lái)的隱藏?cái)?shù)據(jù);
讀取客戶(hù)端發(fā)來(lái)的顯示數(shù)據(jù);
與其他服務(wù)器資源(包括數(shù)據(jù)庫(kù)和java的應(yīng)用程序)進(jìn)行通信;
通過(guò)狀態(tài)代碼和響應(yīng)頭向客戶(hù)端發(fā)送隱藏?cái)?shù)據(jù)。
filter:
filter能夠在一個(gè)請(qǐng)求到達(dá)servlet之前預(yù)處理用戶(hù)請(qǐng)求,也可以在離開(kāi)servlet時(shí)處理http響應(yīng);
在執(zhí)行servlet之前,首先執(zhí)行filter程序,并為之做一些預(yù)處理工作;
根據(jù)程序需要修改請(qǐng)求和響應(yīng);
在servlet被調(diào)用之后截獲servlet的執(zhí)行
listener:職責(zé)如概念。
servlet2.4規(guī)范中提供了8個(gè)listener接口,可以將其分為三類(lèi),分別如下:
第一類(lèi):與servletContext有關(guān)的listner接口。
包括:ServletContextListener、ServletContextAttributeListener
第二類(lèi):與HttpSession有關(guān)的Listner接口。
包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、HttpSessionActivationListener;
第三類(lèi):與ServletRequest有關(guān)的Listener接口,
包括:ServletRequestListner、ServletRequestAttributeListener
interceptor:
與過(guò)濾器十分相似,通過(guò)層層攔截,處理用戶(hù)的請(qǐng)求和響應(yīng)。
servlet 流程是短的,url傳來(lái)之后,就對(duì)其進(jìn)行處理,之后返回或轉(zhuǎn)向到某一自己指定的頁(yè)面。它主要用來(lái)在 業(yè)務(wù)處理之前進(jìn)行控制.
filter 流程是線(xiàn)性的, url傳來(lái)之后,檢查之后,可保持原來(lái)的流程繼續(xù)向下執(zhí)行,被下一個(gè)filter, servlet接收等,而servlet 處理之后,不會(huì)繼續(xù)向下傳遞。filter功能可用來(lái)保持流程繼續(xù)按照原來(lái)的方式進(jìn)行下去,或者主導(dǎo)流程,而servlet的功能主要用來(lái)主導(dǎo)流程。
filter可用來(lái)進(jìn)行字符編碼的過(guò)濾,檢測(cè)用戶(hù)是否登陸的過(guò)濾,禁止頁(yè)面緩存等.
servlet,filter都是針對(duì)url之類(lèi)的,而listener是針對(duì)對(duì)象的操作的,如session的創(chuàng)建,session.setAttribute的發(fā)生,在這樣的事件發(fā)生時(shí)做一些事情。
可用來(lái)進(jìn)行:Spring整合Struts,為Struts的action注入屬性,web應(yīng)用定時(shí)任務(wù)的實(shí)現(xiàn),在線(xiàn)人數(shù)的統(tǒng)計(jì)等.
interceptor 攔截器,類(lèi)似于filter,不過(guò)在struts.xml中配置,不是在web.xml,并且不是針對(duì)URL的,而是針對(duì)action,當(dāng)頁(yè)面提交action時(shí),進(jìn)行過(guò)濾操作,相當(dāng)于struts1.x提供的plug-in機(jī)制,可以看作,前者是struts1.x自帶的filter,而interceptor 是struts2 提供的filter.
與filter不同點(diǎn):
(1) 不在web.xml中配置,而是在struts.xml中完成配置,與action在一起
(2) 可由action自己指定用哪個(gè)interceptor 來(lái)在接收之前做事
struts2中的過(guò)濾器和攔截器的區(qū)別與聯(lián)系:
(1)攔截器是基于java反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)的。
(2)過(guò)濾器依賴(lài)與servlet容器,而攔截器不依賴(lài)與servlet容器。
(3)攔截器只能對(duì)Action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有請(qǐng)求起作用。
(4)攔截器可以訪(fǎng)問(wèn)Action上下文、值棧里的對(duì)象,而過(guò)濾器不能。
(5)在A(yíng)ction的生命周期中,攔截器可以多次調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次。
“servlet/filter/listener/interceptor區(qū)別與聯(lián)系是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!