當請求到達後,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中,前人種樹後人乘涼。
像存放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,能夠看做一個「鏈」,服務器會按照順序對請求進行依次過濾處理
對於Filter的Map而言,會查詢過濾全部的Key,將全部符合匹配的都裝入到數組中
而Servlet的Map的查詢過程是,只要找到一個匹配的Key,就不會再日後面找了