一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|

服務器之家 - 編程語言 - JAVA教程 - Java servlet、filter、listener、interceptor之間的區別和聯系

Java servlet、filter、listener、interceptor之間的區別和聯系

2020-06-30 11:25Java編程思想 JAVA教程

這篇文章主要介紹了Java servlet、filter、listener、interceptor之間的區別和聯系的相關資料,需要的朋友可以參考下

servletfilterlistenerinterceptor之間的區別和聯系

一、概念

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中。

二、加載順序

web.xml 的加載順序是:context- param -> listener -> filter -> servlet

三、職責

1.servlet:

(1)創建并返回一個包含基于客戶請求性質的動態內容的完整的html頁面

(2)創建可嵌入到現有的html頁面中的一部分html頁面(html片段)

(3)讀取客戶端發來的隱藏數據

(4)讀取客戶端發來的顯示數據

(5)與其他服務器資源(包括數據庫和java的應用程序)進行通信

(6)通過狀態代碼和響應頭向客戶端發送隱藏數據。

2.filter:

(1)filter能夠在一個請求到達servlet之前預處理用戶請求,也可以在離開servlet時處理http響應

(2)在執行servlet之前,首先執行filter程序,并為之做一些預處理工作

(3)根據程序需要修改請求和響應

(4)在servlet被調用之后截獲servlet的執行。

3.listener:

servlet2.4規范中提供了8個 listener 接口,可以將其分為三類,分別如下:

(1)與 servletContext 有關的 listne r接口。包括:ServletContextListener、ServletContextAttributeListener

(2)與 HttpSession 有關的 Listner 接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener

(3)與 ServletRequest 有關的 Listener 接口,包括:ServletRequestListner、ServletRequestAttributeListener

四、區別

1.servlet:servlet 流程是短的,url傳來之后,就對其進行處理,之后返回或轉向到某一自己指定的頁面。它主要用來在業務處理之前進行控制。

2.filter:流程是線程性的,url傳來之后,檢查之后,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等,而 servlet 處理之后,不會繼續向下傳遞。

filter 功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能主要用來主導流程。可以將 Filter 看成是 servlet 的一個補充(擦屁股的)。

Filter可認為是Servlet的一種“變種”,它主要用于對用戶請求進行預處理,也可以對HttpServletResponse進行后處理,是個典型的處理鏈。

它與Servlet的區別在于:它不能直接向用戶生成響應。

完整的流程是:Filter對用戶請求進行預處理,接著將請求交給Servlet進行處理并生成響應,最后Filter再對服務器響應進行后處理。

3.匹配規則

當一個請求發送到servlet容器的時候,容器先會將請求的url減去當前應用上下文的路徑作為servlet的映射url,比如我訪問的是http://localhost/test/aaa.html(我的應用上下文是test),

容器會將http://localhost/tes去掉,將剩下的/aaa.html部分拿來做servlet的映射匹配,也就是拿這剩下的部分與web.xml中配置的servlet的url-pattern進行匹配。

注意:這個映射匹配過程是有一定的規則的,而且每次匹配最終都只匹配一個 servlet。(這一點和filter不同)

servlet 匹配規則:當一個servlet匹配成功后就不會在往下去匹配了

精確路徑的匹配:

例子:比如servletA 的url-pattern為 /test,servletB的url-  pattern為 /* ,這個時候,如果我訪問的url為http://localhost/test ,

這個時候容器就會先 進行精確 路徑匹配,發現/test正好被servletA精確匹配,那么就去調用servletA,也不會去理會其他的servlet了。

最長路徑的匹配:

例子:servletA的url-pattern為/test/*,而servletB的url-pattern為/test/a/*,此時訪問http://localhost/test/a時,

容器會選擇路徑最長的servlet來匹配,也就是這里的servletB。

擴展匹配:如果url最后一段包含擴展,容器將會根據擴展選擇合適的servlet。

例子:servletA的url-pattern:*.action

4.servlet,filter 都是針對 url 之類的,而 listener 是針對對象的操作的,如 session 的創建,session.setAttribute 的發生,在這樣的事件發生時做一些事情。

可用來進行:Spring整合Struts,為Struts的action注入屬性,web應用定時任務的實現,在線人數的統計等

5.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 來在接收之前做事

6.struts2中的過濾器和攔截器的區別與聯系:

(1)攔截器是 Struts2 提供的,而過濾器是由 Servlet 標準提供的

(2)攔截器攔截目標 Action 的目標方法,而過濾器針對各種 web 資源

(3)攔截器在 struts.xml 中配置,而過濾器在 web.xml文件中配置

(4)攔截器使用攔截器棧組織在一起,而過濾器是根據被攔截的資源聯系在一起,由他們在配置文件中的位置決定了先后執行順序

(5)攔截器是基于java反射機制的,而過濾器是基于函數回調的。
(6)過濾器依賴與servlet容器,而攔截器不依賴與servlet容器。
(7)攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
(8)攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。
(9)在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
  • JAVA教程Java中抓取 Thread Dumps 的方式匯總

    Java中抓取 Thread Dumps 的方式匯總

    Thread dumps(線程轉儲)能幫助我們判斷 CPU 峰值、死鎖、內存異常、應用反應遲鈍、響應時間變長和其他系統問題。在這篇文章當中,總結了7中抓取 Java ...

    java教程網2542020-05-18
  • JAVA教程java線程并發semaphore類示例

    java線程并發semaphore類示例

    Java 5.0里新加了4個協調線程間進程的同步裝置,它們分別是Semaphore, CountDownLatch, CyclicBarrier和Exchanger,本例主要介紹Semaphore,Semaphore是用來管理一個資源池的工...

    java教程網4872019-10-31
  • JAVA教程精致小巧的java相冊制作方法

    精致小巧的java相冊制作方法

    這篇文章主要為大家詳細介紹了精致小巧的java相冊制作方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xanlv2842020-06-22
  • JAVA教程java制作簡單的坦克大戰

    java制作簡單的坦克大戰

    坦克大戰是我們小時候玩紅白機時代的經典游戲,看到有不少小伙伴都使用各種語言實現了一下,手癢癢,也使用java做的一個比較簡單的坦克大戰,主要面...

    hebedich1332019-12-14
  • JAVA教程MyBatis學習教程(七)-Mybatis緩存介紹

    MyBatis學習教程(七)-Mybatis緩存介紹

    MyBatis緩存分為一級緩存和二級緩存一級緩存,本文給大家介紹mybatis緩存知識,非常不錯具有參考借鑒價值,感興趣的朋友一起學習吧 ...

    孤傲蒼狼4072020-05-04
  • JAVA教程Java線程池框架核心代碼解析

    Java線程池框架核心代碼解析

    這篇文章主要針對Java線程池框架核心代碼進行詳細解析,分析Java線程池框架的實現ThreadPoolExecutor,感興趣的小伙伴們可以參考一下 ...

    java教程網2372020-05-28
  • JAVA教程java實現網頁解析示例

    java實現網頁解析示例

    這篇文章主要介紹了java實現網頁解析示例,需要的朋友可以參考下 ...

    Java教程網1862019-11-20
  • JAVA教程java 四舍五入保留小數的實現方法

    java 四舍五入保留小數的實現方法

    下面小編就為大家帶來一篇java 四舍五入保留小數的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ...

    jingxian3012020-06-17
主站蜘蛛池模板: 美女国内精品自产拍在线播放 | 我的绝色岳每雯雯 | 1024国产高清精品推荐 | 欧乱色国产精品兔费视频 | 刺客女仆| 91专区| 日产乱码卡1卡2卡三卡四在线 | 亚洲天堂视频在线观看免费 | 办公室恋情在线 | 国内精品久久久久久不卡影院 | 日本免费v片一二三区 | 精东影业传媒全部作品 | 亚洲v日韩v欧美在线观看 | 免费a视频在线观看 | 5g影院天天5g天天爽大陆 | 波多野结衣无码 | 国产va免费精品高清在线 | 久久精品视频在线看 | 欧美xxxxx性 欧美xxxbrazzers | 免费特黄一级欧美大片在线看 | 九九成人免费视频 | 青青草原伊人网 | 亚洲性综合网 | 免费a视频在线观看 | 修修视频在线观看 | 日本黄色高清视频网站 | 青青在线香蕉国产精品 | 欧美精品超清在线播放 | 国产亚洲精品美女2020久久 | 337p大尺度啪啪人体午夜2020 | 无码国产成人777爽死在线观看 | 国产成人精视频在线观看免费 | 欧美vpswindowssex| 国产资源一区 | 成人精品一区二区三区中文字幕 | 亚洲系列国产系列 | 国产精品视频视频久久 | 国产精品久久免费观看 | 国产99视频精品免费视频7 | 亚洲欧美日韩一区成人 | 高肉h护士办公室play |