当请求到达后,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,就不会再日后面找了