1. 程式人生 > >Servlet、Filter 和Listener 工作原理

Servlet、Filter 和Listener 工作原理

Servlet工作原理 一、Servlet生命週期分為三個階段:      1、初始化階段,呼叫init()方法      2、響應客戶請求階段,呼叫service()方法      3、終止階段,呼叫destroy()方法 二、Servlet初始化階段,在下列時刻Servlet容器裝載Servlet:      1、Servlet容器啟動時自動裝載某些Servlet,這些Servlet在web.xml檔案中的<Servlet></Servlet>內添加了如下程式碼:           <loadon-startup>1</loadon-startup>       2、在Servlet容器啟動後,客戶首次向Servlet傳送請求。      3、Servlet類檔案被更新後,重新裝載Servlet。 三、Servlet接收和響應客戶請求的過程:      1、首先客戶傳送一個請求。      2、Servlet容器會建立特定於這個請求的ServletRequest物件和ServletResponse物件,然後呼叫Servlet的service()方法對請求進行響應。      3、service()方法中,對請求的方式進行了匹配,選擇呼叫doGet,doPost等這些方法      4、在doGet、doPost等方法中呼叫邏輯層的方法,實現對客戶的響應。 注:      在Servlet介面和GenericServlet類中是沒有doGet、doPost等等這些方法的,HttpServlet中定義了這些方法,但是都是返回error資訊,所以我們每次定義一個Servlet的時候,都必須實現doGet或doPost等這些方法。      Servlet介面和GenericServlet是不特定於任何協議的,而HttpServlet是特定於HTTP協議的類,所以HttpServlet中實現了service()方法,並將請求ServletRequest,ServletResponse強轉為HttpRequest和HttpResponse。 Filter工作原理
     Filter可以使使用者修改 request 和response。Filter 不是一個servlet,它不能產生一個response,它能夠在一個request到達servlet之前預處理request,也可以在離開 servlet時處理response。換種說法,filter其實是一個servlet chaining”(servlet 鏈).      每一個filter從doFilter()方法中得到當前的request及response。在這個方法裡,可以進行任何的針對request及 response的操作(包括收集資料、包裝資料等)。filter呼叫chain.doFilter()方法把控制權交給下一個filter。如果一個filter想停止request處理而獲得對response的完全的控制,那它可以不呼叫下 一個filter。 例如: 複製程式碼
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
     HttpServletRequest httpServletRequest = (HttpServletRequest)request;
     
     //在servlet被呼叫之前截獲,此時可以檢查、修改request頭和request資料;
     logger.info( "Intercept Url="+httpServletRequest.getRequestURI());
     
long start=System. currentTimeMillis(); //Causes the next filter in the chain to be invoked, or if the calling filter is the last filter in the chain, causes the resource at the end of the chain to be invoked. chain.doFilter(request, response); //在servlet被呼叫之後截獲,此時可以修改response頭和response資料; long end=System. currentTimeMillis(); logger.info(request.getRemoteAddr()+ ": time used :"+(end-start)); response.getWriter().write( "[email protected] Mr.Shao" ); }
複製程式碼 Listener和Event:      Listener是Servlet的監聽器,它可以監聽客戶端的請求、服務端的操作等。通過監聽器,可以自動激發一些操作,比如監聽線上的使用者的數量。當增加一個HttpSession時,就激發sessionCreated(HttpSessionEvent se)方法,這樣就可以給線上人數加1。    Servlet、Filter都是針對請求的,而listener是針對物件的操作的,如session的建立,session.setAttribute的發生,在這樣的事件發生時做一些事情。   在javax.servlet和javax.servlet.http兩個包下,能夠找到一共8個以Listener結尾的介面以及6個以Event結尾的類,它們共同構成了Servlet的事件處理模型。 1. ServletContextListener介面  [介面方法] contextInitialized()與 contextDestroyed()  [接收事件] ServletContextEvent  [觸發場景] 在Container載入Web應用程式時(例如啟動 Container之後),會呼叫contextInitialized(),而當容器移除Web應用程式時,會呼叫contextDestroyed ()方法。 2. ServletContextAttributeListener  [介面方法] attributeAdded()、 attributeReplaced()、attributeRemoved()  [接收事件] ServletContextAttributeEvent  [觸發場景] 若有物件加入為application(ServletContext)物件的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分別呼叫attributeReplaced()、attributeRemoved()。 3. HttpSessionListener  [介面方法] sessionCreated()與sessionDestroyed ()  [接收事件] HttpSessionEvent  [觸發場景] 在session (HttpSession)物件建立或被消滅時,會分別呼叫這兩個方法。 4. HttpSessionAttributeListener  [介面方法] attributeAdded()、 attributeReplaced()、attributeRemoved()  [接收事件] HttpSessionBindingEvent  [觸發場景] 若有物件加入為session(HttpSession)物件的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分別呼叫attributeReplaced()、 attributeRemoved()。 5. HttpSessionActivationListener  [介面方法] sessionDidActivate()與 sessionWillPassivate()  [接收事件] HttpSessionEvent  [觸發場景] Activate與Passivate是用於置換物件的動作,當session物件為了資源利用或負載平衡等原因而必須暫時儲存至硬碟或其它儲存器時(透 過物件序列化),所作的動作稱之為Passivate,而硬碟或儲存器上的session物件重新載入JVM時所採的動作稱之為Activate,所以容 易理解的,sessionDidActivate()與 sessionWillPassivate()分別於Activeate後與將Passivate前呼叫。 6. ServletRequestListener  [介面方法] requestInitialized()與 requestDestroyed()  [接收事件] RequestEvent  [觸發場景] 在request(HttpServletRequest)物件建立或被消滅時,會分別呼叫這兩個方法。 7. ServletRequestAttributeListener  [介面方法] attributeAdded()、 attributeReplaced()、attributeRemoved()  [接收事件] HttpSessionBindingEvent  [觸發場景] 若有物件加入為request(HttpServletRequest)物件的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分別呼叫attributeReplaced()、 attributeRemoved()。 8. HttpSessionBindingListener  [介面方法] valueBound()與valueUnbound()  [接收事件] HttpSessionBindingEvent  [觸發場景] 實現HttpSessionBindingListener介面的類別,其例項如果被加入至session(HttpSession)物件的屬性中,則會 呼叫 valueBound(),如果被從session(HttpSession)物件的屬性中移除,則會呼叫valueUnbound(),實現 HttpSessionBindingListener介面的類別不需在web.xml中設定。

相關推薦

ServletFilter Listener 工作原理

Servlet工作原理 一、Servlet生命週期分為三個階段:      1、初始化階段,呼叫init()方法      2、響應客戶請求階段,呼叫service()方法      3、終止階段,呼叫destroy()方法 二、Servlet初始化階段,在下列時刻Servlet容器裝載Servlet:

註冊ServletFilterListener(程式碼註解兩種方式)

由於SpringBoot預設是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應用,沒有web.xml檔案。 故而採用其他方式來註冊三大元件:程式碼註冊和註解註冊。 【1】ServletRegistrationBean註冊Se

Spring Boot使用ServletFilterListener的方式

false listener tex 使用 fig java one 註入 ont 根據官方文檔說明,有兩種方式可以在你的Spring Boot應用中使用Servlet、Filter或Listener。 其一:將Servlet、Filter或Listener註冊成Sprin

Spring Boot 學習系列(08)—自定義servletfilterlistener

此文已由作者易國強授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 傳統的filter及listener配置 在傳統的Java web專案中,servlet、filter和listener的配置很簡單,直接在web.xml中按順序配置好即可,程式啟動時,就會按照你配置的順序依次載入

Servletfilterlistener,重點了解ServletContext

一 filter是servlet2.3新增加的功能,功能是在請求到達servlet之前和返回之前可以修改request和response。 還可以通過繼承HttpServletRequestWrapper去重寫request和response的一些方法 二 listener的作用查了一些

基於註解的SpringMVC添加其他的ServletFilter以及Listener

etc patch ping dispatch 重寫 ppi gist ota tex 我們可以在AbstractAnnotationConfigDispatcherServletInitializer的實現類中重寫onStartup(ServletContext serv

基於註解的SpringMVC新增其他的ServletFilter以及Listener

我們可以在AbstractAnnotationConfigDispatcherServletInitializer的實現類中重寫onStartup(ServletContext servletContext)方法新增其他的Servlet、Filter以及Listener 1 public class

web.xml中的配置,servletfilterlistener的作用原理

首先介紹servlet,filter和listen的原理: servlet可以說是動態頁面的基石,現在很多開發都是基於spring等各種框架,所以對servlet的瞭解可能少點,下面先用簡單的例子,說明下servlet的作用 MyFirstServlet.java class MyF

servletfilterlistener繼承的基類獲得作用域的方式

一、servlet:  1、servlet屬於j2ee的元件,構建servlet的web project不需要匯入專案框架jar包  2、servlet的體系結構:   在j2ee API中,提供給servlet的支援介面和基類都位於javax.servlet.*和java

Java Web組件ServletFilterListener

繼承 一個 tex 請求 父類 服務器 監聽 alt tco 一、Servlet 類javax.servlet.http.HttpServlet; 1.是單例模式,一個web容器中只有一個實例。服務器調用它的service方法進行請求處理, service方法

Spring Boot-- ServletFilterListenerInterceptor

Spring Boot-- Servlet、Filter、Listener、Interceptor 在Spring Boot中讓Servlet、Listener、Filter生效的方法: 在Application上使用@ServletComponentSc

【WEB 三大核心 Servlet Filter Listener 的生命週期 執行流程 】

1. Servlet 的 生命週期 和 執行流程 1.1 Servlet 的執行流程 1. 客戶端傳送請求 (以 GET 或者 Post 方式傳送請求 ) 超連結 : <a href="servl

Spring Boot 註冊Servlet三大元件ServletFilterListener

由於SpringBoot預設是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應用,沒有web.xml檔案 public class MyServlet extends HttpServlet { protected void doPost(HttpS

JavaWeb 三大器--ListenerFilter Interceptor 總結

說明:web.xml的載入順序是:【Context-Param】->【Listener】->【Filter】->【Servlet】,而同個型別之間的實際程式呼叫的時候的順序是根據對應的Mapping的順序進行呼叫。 詳細介紹:web.xml載入順序與web.xml常用節點解析 轉自:ht

Java三大器之過濾器(Filter)的工作原理代碼演示

應用 項目 isp 抽象類 con 存在 nis window rec 一、Filter簡介   Filter也稱之為過濾器,它是Servlet技術中最激動人心的技術之一,WEB開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp,Servlet,

SpringBoot1.5.12.RELEASE註冊Servlet三大元件【ServletFilterListener

SpringBoot1.5.12.RELEASE註冊Servlet三大元件【Servlet、Filter、Listener】 1.理由:由於SpringBoot預設是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應用,沒有web.xml檔案。 2.註

SpringBoot初始教程之ServletFilterListener配置

1.介紹通過之前的文章來看,SpringBoot涵蓋了很多配置,但是往往一些配置是採用原生的Servlet進行的,但是在SpringBoot中不需要配置web.xml的 因為有可能打包之後是一個jar包的形式,這種情況下如何解決?SpringBoot 提供了兩種方案進行解決 2.快速開始2.1 方案一方案一

Spring Boot學習筆記(二)使用ServletFilterListener

Servlet 還是得整合HttpServlet,然後重寫父類方法。 類的上方增加了@WebServlet註解,其實就是代替了xml的配置,可以被spring boot掃描、註冊到。 package org.test.Controll; import javax.servlet.Servl

04-SpringBoot之WEB(二)——整合ServletFilterListener

1. Servlet 1.1 自定義Servlet import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.

23 Servlet三大元件(ServletFilterListener)註冊

1 傳統註冊方式 1.1 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="