servlet過濾器和監聽器
1. Servlet、過濾器、監聽器實例化對象的優先順序和銷毀的優先順序
創建: 監聽器-->過濾器-->Servlet.
項目啟動後,容器會首先創建聲明的各種監聽器,為後繼的各個事件監聽做准備,然後創建過濾器,最後是Servlet.
銷毀的時候是反序進行的....
2. java中servlet,filter,listener為什麼優先順序listener>filter>servlet,面試時候怎麼回答
個人感覺哈,我也是新手一枚。
listener是監聽本servlet的,那麼既然是監聽,那麼應該是可以第一時間響專應servlet,所屬以它第一個。
而filter是過濾,這個過濾樓主應該也學過怎麼用,那麼就是在跳轉servlet之前他需要過濾一遍,servlet返回的時候還是得從它的類走一遍,所以它優先順序比servlet也是要高的。
而上面兩個都排除了,就只剩下servlet了,SO,不用我講了吧?
以上內容純屬個人瞎掰,懇請了解的大大給予更精準的正確的回答。
3. Java中的過濾器、攔截器、監聽器分別是什麼意思
王朝*說的很全面了,翻閱了幾本資料後,從J2EE的角度略作補充吧。
1)首先是攔截器,攔截器是一種面向方面/切面編程(AOP Aspect-Oriented Programming),而面向切面就是將多個模塊的的通用服務進行分離,如許可權管理、日誌服務,他們在多個模塊中都會用到,就可以將其各自封裝為一個可重用模塊。而這些通用服務的具體實現是通過攔截器來完成,比如用戶客戶端訪問一些保密模塊都應先通過許可權審查的攔截器來進行許可權審查,確定用戶是否具有該項操作的許可權後方能向下執行。
2)過濾器,過濾器處於客戶端與Web資源(Servlet、JSP、HTML)之間,客戶端與Web資源之間的請求和響應都要通過過濾器進行過濾。舉例:在過濾器中定義了禁止訪問192.10.10.1這個地址,那麼當客戶端發出訪問192.10.10.1的請求時,經過過濾器後,客戶端得到的響應是出現該IP禁止訪問的提示。再舉個例子,我們J2EE項目中的許可權管理就是通過過濾器實現的,網站有不用身份的用戶(系統管理員、會員級用戶、瀏覽者臨時用戶),不用身份對系統的功能模塊具有不同的訪問許可權,可以將各功能模塊以*.do命名,然後在過濾器中配置過濾*.do,就可以控制不同級別用戶的訪問許可權了
3)監聽器,是針對事件而說的,可以說是事件監聽器,J2EE中事件主要有三類:ServletContext事件、會話事件和請求事件。以ServletContext對象的創建事件為例,利用針對ServletContext對象創建事件的監聽器來監聽,一旦監聽到有ServletContext對象的創建事件(比如項目啟動時的初化),就讀取相應的資料庫連接操作來保存供調用。簡單來說監聽器就是監聽一些對象和屬性等的增加、修改和刪除,一旦監聽到相應事件就會觸發某種活動,做出相應處理。
答案均系在圖書館查閱資料後手敲,不知滿意否,呵呵。
4. servlet,filter,listener,interceptor之間的區別和聯系
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、
(2)與 HttpSession 有關的 Listner
介面。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、
HttpSessionActivationListener
(3)與 ServletRequest 有關的 Listener 介面,包括:ServletRequestListner、
四、區別
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的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。
5. java中攔截器 過濾器 監聽器都有什麼區別尤其是攔截器和過濾器
過濾器,是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts2的
action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者
struts2的action前統一設置字元集,或者去除掉一些非法字元
攔截器,是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
攔截器與過濾器的區別 :
攔截器是基於java的反射機制的,而過濾器是基於函數回調。
攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
執行順序 :過濾前 - 攔截前 - Action處理 - 攔截後 -
過濾後。個人認為過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登錄用戶不能訪問內部頁面的處理);過濾通過後,攔截器將檢查用戶提交數
據的驗證,做一些前期的數據處理,接著把處理後的數據發給對應的Action;Action處理完成返回後,攔截器還可以做其他過程,再向上返回到過濾器的後續操作。
監聽器:這個東西在c/s模式裡面經常用到,他會對特定的事件產生產生一個處理。監聽在很多模式下用到。比如說觀察者模式,就是一個監聽來的。又比如struts2可以用監聽來啟動。Servlet監聽器用於監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生後可以做一些必要的處理。
好比如果說Servlet的監聽器Listener,它是實現了javax.servlet.ServletContextListener
介面的伺服器端程序,它也是隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷毀。主要作用是:
做一些初始化的內容添加工作、設置一些基本的內容、比如一些參數或者是一些固定的對象等等。
6. Struts2中過濾器,攔截器,監聽器他們之間有什麼區別
1、攔截器是基於java反射機制的,而過濾器是基於函數回調的。
2、過濾器依賴與回servlet容器,而攔截答器不依賴與servlet容器。
3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。
5、在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。
7. java語言中攔截器、過濾器、監聽器都是什麼意思
過濾器,是在java web中,你傳入的,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts2的
action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者
struts2的action前統一設置字元集,或者去除掉一些非法字元
攔截器,是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
攔截器與過濾器的區別 :
攔截器是基於java的反射機制的,而過濾器是基於函數回調。
攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
執行順序 :過濾前 - 攔截前 - Action處理 - 攔截後 -
過濾後。個人認為過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登錄用戶不能訪問內部頁面的處理);過濾通過後,攔截器將檢查用戶提交數
據的驗證,做一些前期的數據處理,接著把處理後的數據發給對應的Action;Action處理完成返回後,攔截器還可以做其他過程,再向上返回到過濾器的後續操作。
監聽器:這個東西在c/s模式裡面經常用到,他會對特定的事件產生產生一個處理。監聽在很多模式下用到。比如說觀察者模式,就是一個監聽來的。又比如struts2可以用監聽來啟動。Servlet監聽器用於監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生後可以做一些必要的處理。
好比如果說Servlet的監聽器Listener,它是實現了javax.servlet.ServletContextListener
介面的伺服器端程序,它也是隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷毀。主要作用是:
做一些初始化的內容添加工作、設置一些基本的內容、比如一些參數或者是一些固定的對象等等。
8. 請分別描述Servlet中監聽器和過濾器的含義,並指出二者之間的區別與聯系。
web開發中會用抄到,在web.xml中配置監聽和過濾器。在java代碼中實現。
監聽是把滿足監聽條件的jsp之類的請求送到監聽服務中去執行,即交給別的代碼託管。可以任意配置*.do,*.jsp。過濾器是排除某些資源的
9. java中攔截器、過濾器、監聽器都有什麼區別
1、過濾器,是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數專,然後再傳入屬servlet或者struts2的。
2、action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者struts2的action前統一設置字元集,或者去除掉一些非法字元。
3、攔截器,是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
10. servlet中的監聽器到底是什麼意思
監聽web容器的有效事件