Servlet & Filter 執行原理


一、Servlet的兩個Map

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

  可能很多人和我一樣,只知道在web,xml中配置攔截規則,然后反射+映射就完事了?

  當Servlet實列被創建后,會將該Servlet實列的引用存放到一個Map中,該Map的K是url,V是Servlet的實列引用+

  即Map<String,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,就不會再往后面找了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM