Servlet、Listener、Filter、Interceptor

Servlet、Listener、Filter、Interceptor

1、tomcat 和 Servlet 關係

  Java的Web應用是基於Servlet規範運轉的,而Servlet規範的核心接口即是Servlet接口,它是所有Servlet類必須實現的接口,描述了Servlet 生命週期爲從創建直到銷燬的整個過程。
  有的人往往以爲就是servlet直接處理客戶端的http請求,其實並不是這樣,servlet並不會去監聽80端口;直接與客戶端打交道是“容器”,比如常用的tomcat。
  客戶端的請求直接打到tomcat,它監聽端口,請求過來後,根據url等信息,確定要將請求交給哪個servlet去處理,所以一個Tomcat中可以起多個servlet,然後調用那個servlet的service方法,service方法返回一個response對象,tomcat再把這個response返回給客戶端。
在這裏插入圖片描述
在這裏插入圖片描述

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

  當請求來容器第一次調用某個servlet時,需要先初始化init(),但當某個請求再次打到給servlet時,容器會起多個線程同時訪問一個servlet的service()方法,提供web服務。

2、Servlet和ServletContext

  ServletContext代表是一個web應用的上下文對象(web應用對象),裏面封裝的都是web應用信息,一個ServletContext對應一個應用(可以這麼理解)。
  一個web應用中可以會有多個Servlet,每個Servlet有其獨立的ServletConfig,用於配置該Servlet(項目載入<servlet.init-param>),多個ServletConfig相互獨立。如果希望所配置的參數,能夠被應用中的各個servlet和jsp訪問到。這時候,就需要用到ServletContext(項目載入<context-param>)。

3、web.xml加載順序

  1. 啓動WEB項目的時候,容器首先會去讀取web.xml配置文件中的兩個節點: <listener>和<context-param>
  2. 緊接着,容器創建一個ServletContext(application),這個web項目的所有部分都將共享這個上下文。容器以<context-param>的name作爲鍵,value作爲值,將其轉化爲鍵值對,存入ServletContext。
  3. 容器創建<listener>中的類實例,根據配置的<listener-class>類來創建監聽,在監聽中會有初始化方法,啓動Web應用時,系統調用Listener的該方法 contextInitialized(ServletContextEvent args),在這個方法中獲得:
ServletContext application =ServletContextEvent.getServletContext(); 
context-param的值= application.getInitParameter(“context-param的鍵”);
  1. 容器會讀取<filter>,根據指定的類路徑來實例化過濾器
  2. Servlet並沒有實例化,直到第一個http請求來的時候再實例化

  總結:web.xml加載順序,<context-param> -> <listener> -> <filter> -> <servlet>,如果web.xml中出現了相同的元素,則按照在配置文件中出現的先後順序來加載。

4、Filter

  Filter可認爲是Servlet的一種“變種”,它主要用於對用戶請求進行預處理,也可以對HttpServletResponse進行後處理,是個典型的處理鏈。它與Servlet的區別在於:它不能直接向用戶生成響應。完整的流程是:Filter對用戶請求進行預處理,接着將請求交給 Servlet進行處理並生成響應,最後Filter再對服務器響應進行後處理。所以他一定是在Servlet之前的架構。
在這裏插入圖片描述
  當客戶端請求目標資源的時候,容器會篩選出符合 filter-mapping 中的 url-pattern 的 filter,並按照聲明 filter-mapping 的順序依次調用這些 filter 的 doFilter 方法。在這個鏈式調用過程中,可以調用 chain.doFilter(ServletRequest, ServletResponse) 將請求傳給下一個過濾器(或目標資源),web服務器會檢查FilterChain對象中是否還有filter,如果有,則調用第2個filter,如果沒有,則調用目標資源。

5、Listener

  Listener可以理解爲比較獨立部分。Servlet,Filter都是針對url之類的,而Listener是響應事件的操作的,如session的創建,session.setAttribute的發生,或者在啓動服務器的時候將你需要的數據加載到緩存等,在這樣的事件發生時做一些事情。下面是幾個例子。

  • ServletContextAttributeListener:監聽Web應用上下文中是否增加、刪除或者替換了一個屬性。
  • HttpSessionListener:跟蹤會話活動。
  • ServletRequestListener:監聽請求到來,以便建立日誌。
  • ServletRequestAttributeListener:監聽請求屬性是否有增加、替換或者刪除。
  • HttpSessionAttributeListener:監聽會話屬性是否被刪除、替換或者新增。
  • HttpSessionBindingListener:有一個屬性類,如果希望這個類型的對象在綁定到一個會話,或者從一個會話刪除時得到通知。應使用這個監聽。
  • ServletContextListener:監聽應用上下文創建或者撤銷。

6、Interceptor

  攔截器(Interceptor)是Spring框架中的一個功能。它常常拿來和Filter對比。官方解釋說:
  HandlerInterceptor基本上類似於Servlet Filter,但與後者相反,它僅允許自定義預處理以及禁止執行處理程序本身和自定義後處理的選項。Filter功能更強大,例如,它們允許交換傳遞到鏈中的請求和響應對象。 請注意,在應用程序上下文中的HandlerInterceptor web.xml中配置了Filter。
  作爲基本準則,與處理程序相關的細粒度預處理任務是HandlerInterceptor實現的候選對象,尤其是分解出的公共處理程序代碼和授權檢查。 另一方面,Filter非常適合請求內容和視圖內容處理,例如多部分表單和GZIP壓縮。 這通常顯示何時需要將Filter映射到某些內容類型(例如圖像)或所有請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章