Servlet & Filter 執行原理

1、Servlet的兩個Map

  當請求到達後,web容器是如何查找Servlet的呢?執行流程又是什麼?web

  可能不少人和我同樣,只知道在web,xml中配置攔截規則,而後反射+映射就完事了?數組

  當Servlet實列被建立後,會將該Servlet實列的引用存放到一個Map中,該Map的K是url,V是Servlet的實列引用+服務器

  即Map<String,Servlet>url

  當Web容器從用戶請求中分離出URI 後,會首先在這個Map查找是否又對應的Value,即Servlet引用spa

  若是存在的話,就會調用其的service方法,若不存在,則須要建立該Servlet實列xml

  若請求的Servlet實列不存在,就有下面這一波操做內存

  在web容器的內存中,還存了一個Map集合該Map的K爲URI,V爲在web.xml中配置的與之對應的Servlet的全限定名資源

  即Map<String,String>servlet

  當Web容器從用戶的請求中分離出URI後,到第一個Map中又沒有找到對應的Servlet引用,容器

  因而跑到第二個Map中去找,從中找到其所對應的類名,再根據反射機制,創造這個Servlet實列,

  最後還得把這個實列引用存入到第一個Map中,前人種樹後人乘涼。

2、Filter的一個Map一個數組

  像存放Servlet信息的兩個Map同樣,在服務器中一樣存在用於存放Filter相關信息的Map

  但Map只有一個,由於Filter的建立時機不一樣於Servlet,其是由在服務器啓動時由Web容器自動建立的

  這個Map的K是Filter的<url-pattern/>

  固然,若Filter沒有設置<url-pattern>,而是使用了<servlet-name/>

  則會將制定的Servlet的<url-pattern>值放到Map中做爲K

  Map的V爲該Filter的引用

  在應用被啓動時,服務器會自動的建立全部的Filter實列,並將他們一一存入Map

  在服務器中,對於每個請求還存在一個數組,用於存儲知足當前請求的全部Filter及最終的目標資源

  當請求到達服務器後,服務器會解析出URI,首先查詢Map中與該請求匹配的Filter

  每找到一個知足要求的Filter,就將其放入到數組中,直到過濾完全部的Filter

  這個數組中存放的是與請求匹配的Filter,能夠看做一個「鏈」,服務器會按照順序對請求進行依次過濾處理

3、注意

  對於Filter的Map而言,會查詢過濾全部的Key,將全部符合匹配的都裝入到數組中

  而Servlet的Map的查詢過程是,只要找到一個匹配的Key,就不會再日後面找了

相關文章
相關標籤/搜索