一、Servlet的兩個Map
當請求到達后,web容器是如何查找Servlet的呢?執行流程又是什么?
可能很多人和我一樣,只知道在web,xml中配置攔截規則,然后反射+映射就完事了?
當Servlet實列被創建后,會將該Servlet實列的引用存放到一個Map中,該Map的K是url,V是Servlet的實列引用+
當Web容器從用戶請求中分離出URI 后,會首先在這個Map查找是否又對應的Value,即Servlet引用
如果存在的話,就會調用其的service方法,若不存在,則需要創建該Servlet實列
若請求的Servlet實列不存在,就有下面這一波操作
在web容器的內存中,還存了一個Map集合該Map的K為URI,V為在web.xml中配置的與之對應的Servlet的全限定名
即Map<String,String>
當Web容器從用戶的請求中分離出URI后,到第一個Map中又沒有找到對應的Servlet引用,
於是跑到第二個Map中去找,從中找到其所對應的類名,再根據反射機制,創造這個Servlet實列,
最后還得把這個實列引用存入到第一個Map中,前人種樹后人乘涼。
二、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,可以看作一個“鏈”,服務器會按照順序對請求進行依次過濾處理
三、注意
對於Filter的Map而言,會查詢過濾所有的Key,將所有符合匹配的都裝入到數組中
而Servlet的Map的查詢過程是,只要找到一個匹配的Key,就不會再往后面找了