Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系
servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系
一、概念
1.servlet:servlet是一種運(yùn)行服務(wù)器端的java應(yīng)用程序,具有獨(dú)立于平臺和協(xié)議的特性,并且可以動(dòng)態(tài)的生成web頁面,它工作在客戶端請求與服務(wù)器響應(yīng)的中間層。
2.filter:filter是一個(gè)可以復(fù)用的代碼片段,可以用來轉(zhuǎn)換HTTP請求、響應(yīng)和頭信息。Filter不像Servlet,它不能產(chǎn)生一個(gè)請求或者響應(yīng),它只是修改對某一資源的請求,或者修改從某一的響應(yīng)。
3.listener:監(jiān)聽器,從字面上可以看出listener主要用來監(jiān)聽只用。通過listener可以監(jiān)聽web服務(wù)器中某一個(gè)執(zhí)行動(dòng)作,并根據(jù)其要求作出相應(yīng)的響應(yīng)。
通俗的語言說就是在application,session,request三個(gè)對象創(chuàng)建消亡或者往其中添加修改刪除屬性時(shí)自動(dòng)執(zhí)行代碼的功能組件。
4.interceptor:是在面向切面編程的,就是在你的service或者一個(gè)方法,前調(diào)用一個(gè)方法,或者在方法后調(diào)用一個(gè)方法。
比如動(dòng)態(tài)代理就是攔截器的簡單實(shí)現(xiàn),在你調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作),也可以在你調(diào)用方法后打印出字符串,甚至在你拋出異常的時(shí)候做業(yè)務(wù)邏輯的操作。
5.servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的攔截器配置到struts.xml中。spring的攔截器配置到spring.xml中。
二、加載順序
web.xml 的加載順序是:context- param -> listener -> filter -> servlet
三、職責(zé)
1.servlet:
(1)創(chuàng)建并返回一個(gè)包含基于客戶請求性質(zhì)的動(dòng)態(tài)內(nèi)容的完整的html頁面
(2)創(chuàng)建可嵌入到現(xiàn)有的html頁面中的一部分html頁面(html片段)
(3)讀取客戶端發(fā)來的隱藏?cái)?shù)據(jù)
(4)讀取客戶端發(fā)來的顯示數(shù)據(jù)
(5)與其他服務(wù)器資源(包括數(shù)據(jù)庫和java的應(yīng)用程序)進(jìn)行通信
(6)通過狀態(tài)代碼和響應(yīng)頭向客戶端發(fā)送隱藏?cái)?shù)據(jù)。
2.filter:
(1)filter能夠在一個(gè)請求到達(dá)servlet之前預(yù)處理用戶請求,也可以在離開servlet時(shí)處理http響應(yīng)
(2)在執(zhí)行servlet之前,首先執(zhí)行filter程序,并為之做一些預(yù)處理工作
(3)根據(jù)程序需要修改請求和響應(yīng)
(4)在servlet被調(diào)用之后截獲servlet的執(zhí)行。
3.listener:
servlet2.4規(guī)范中提供了8個(gè) listener 接口,可以將其分為三類,分別如下:
(1)與 servletContext 有關(guān)的 listne r接口。包括:ServletContextListener、ServletContextAttributeListener
(2)與 HttpSession 有關(guān)的 Listner 接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener
(3)與 ServletRequest 有關(guān)的 Listener 接口,包括:ServletRequestListner、ServletRequestAttributeListener
四、區(qū)別
1.servlet:servlet 流程是短的,url傳來之后,就對其進(jìn)行處理,之后返回或轉(zhuǎn)向到某一自己指定的頁面。它主要用來在業(yè)務(wù)處理之前進(jìn)行控制。
2.filter:流程是線程性的,url傳來之后,檢查之后,可保持原來的流程繼續(xù)向下執(zhí)行,被下一個(gè)filter, servlet接收等,而 servlet 處理之后,不會繼續(xù)向下傳遞。
filter 功能可用來保持流程繼續(xù)按照原來的方式進(jìn)行下去,或者主導(dǎo)流程,而servlet的功能主要用來主導(dǎo)流程??梢詫?Filter 看成是 servlet 的一個(gè)補(bǔ)充(擦屁股的)。
Filter可認(rèn)為是Servlet的一種“變種”,它主要用于對用戶請求進(jìn)行預(yù)處理,也可以對HttpServletResponse進(jìn)行后處理,是個(gè)典型的處理鏈。
它與Servlet的區(qū)別在于:它不能直接向用戶生成響應(yīng)。
完整的流程是:Filter對用戶請求進(jìn)行預(yù)處理,接著將請求交給Servlet進(jìn)行處理并生成響應(yīng),最后Filter再對服務(wù)器響應(yīng)進(jìn)行后處理。
3.匹配規(guī)則
當(dāng)一個(gè)請求發(fā)送到servlet容器的時(shí)候,容器先會將請求的url減去當(dāng)前應(yīng)用上下文的路徑作為servlet的映射url,比如我訪問的是http://localhost/test/aaa.html(我的應(yīng)用上下文是test),
容器會將http://localhost/tes去掉,將剩下的/aaa.html部分拿來做servlet的映射匹配,也就是拿這剩下的部分與web.xml中配置的servlet的url-pattern進(jìn)行匹配。
注意:這個(gè)映射匹配過程是有一定的規(guī)則的,而且每次匹配最終都只匹配一個(gè) servlet。(這一點(diǎn)和filter不同)
servlet 匹配規(guī)則:當(dāng)一個(gè)servlet匹配成功后就不會在往下去匹配了
精確路徑的匹配:
例子:比如servletA 的url-pattern為 /test,servletB的url- pattern為 /* ,這個(gè)時(shí)候,如果我訪問的url為http://localhost/test ,
這個(gè)時(shí)候容器就會先 進(jìn)行精確 路徑匹配,發(fā)現(xiàn)/test正好被servletA精確匹配,那么就去調(diào)用servletA,也不會去理會其他的servlet了。
最長路徑的匹配:
例子:servletA的url-pattern為/test/*,而servletB的url-pattern為/test/a/*,此時(shí)訪問http://localhost/test/a時(shí),
容器會選擇路徑最長的servlet來匹配,也就是這里的servletB。
擴(kuò)展匹配:如果url最后一段包含擴(kuò)展,容器將會根據(jù)擴(kuò)展選擇合適的servlet。
例子:servletA的url-pattern:*.action
4.servlet,filter 都是針對 url 之類的,而 listener 是針對對象的操作的,如 session 的創(chuàng)建,session.setAttribute 的發(fā)生,在這樣的事件發(fā)生時(shí)做一些事情。
可用來進(jìn)行:Spring整合Struts,為Struts的action注入屬性,web應(yīng)用定時(shí)任務(wù)的實(shí)現(xiàn),在線人數(shù)的統(tǒng)計(jì)等
5.interceptor 攔截器,類似于filter,不過在struts.xml中配置,不是在web.xml,并且不是針對URL的,而是針對action,當(dāng)頁面提交action時(shí),
進(jìn)行過濾操作,相當(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 來在接收之前做事
6.struts2中的過濾器和攔截器的區(qū)別與聯(lián)系:
(1)攔截器是 Struts2 提供的,而過濾器是由 Servlet 標(biāo)準(zhǔn)提供的
(2)攔截器攔截目標(biāo) Action 的目標(biāo)方法,而過濾器針對各種 web 資源
(3)攔截器在 struts.xml 中配置,而過濾器在 web.xml文件中配置
(4)攔截器使用攔截器棧組織在一起,而過濾器是根據(jù)被攔截的資源聯(lián)系在一起,由他們在配置文件中的位置決定了先后執(zhí)行順序
(5)攔截器是基于java反射機(jī)制的,而過濾器是基于函數(shù)回調(diào)的。
(6)過濾器依賴與servlet容器,而攔截器不依賴與servlet容器。
(7)攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
(8)攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。
(9)在Action的生命周期中,攔截器可以多次調(diào)用,而過濾器只能在容器初始化時(shí)被調(diào)用一次。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Java中mkdir()和mkdirs()的區(qū)別及說明
這篇文章主要介紹了Java中mkdir()和mkdirs()的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11jenkins中如何集成commander應(yīng)用的完整步驟
jenkins是一個(gè)用java編寫的開源的持續(xù)集成工具,在與oracle發(fā)生爭執(zhí)后,項(xiàng)目從hudson項(xiàng)目獨(dú)立出來,下面這篇文章主要給大家介紹了關(guān)于jenkins中如何集成commander應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-05-05SpringBoot2零基礎(chǔ)到精通之自動(dòng)配置底層分析及小技巧
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時(shí)也是簡化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)自動(dòng)配置的底層分析與一些開發(fā)中的小技巧2022-03-03Spring Boot集成springfox-swagger2構(gòu)建restful API的方法教程
這篇文章主要給大家介紹了關(guān)于Spring Boot集成springfox-swagger2構(gòu)建restful API的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06Spring中的@Autowired注解深入解析與實(shí)戰(zhàn)指南
本文介紹了Spring框架中的@Autowired注解,詳細(xì)講解了其基本用法、高級用法以及實(shí)際應(yīng)用場景,通過@Autowired注解,Spring容器可以自動(dòng)將依賴的Bean注入到目標(biāo)Bean中,從而簡化代碼并提高可維護(hù)性,需要的朋友可以參考下2024-11-11Spring學(xué)習(xí)筆記之bean的基礎(chǔ)知識
ean在Spring和SpringMVC中無所不在,將這個(gè)概念內(nèi)化很重要,所以下面這篇文章主要給大家介紹了關(guān)于Spring學(xué)習(xí)筆記之bean基礎(chǔ)的相關(guān)資料,文中通過示例代碼介紹的非常詳解,需要的朋友可以參考下。2017-12-12java?Export大量數(shù)據(jù)導(dǎo)出和打包
這篇文章主要為大家介紹了java?Export大量數(shù)據(jù)的導(dǎo)出和打包實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06