一、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,就不会再往后面找了

Servlet & Filter 执行原理的更多相关文章

  1. [转]servlet的执行原理与生命周期

    一.先从servlet容器说起:大家最为熟悉的servlet容器就是Tomcat ,Servlet 容器是如何管理 Servlet? 先看一下tomcat的容器模型: 从上图可以看出 Tomcat 的 ...

  2. servlet的执行原理与生命周期

    先从servlet容器说起:大家最为熟悉的servlet容器就是Tomcat ,Servlet 容器是如何管理 Servlet?先看一下tomcat的容器模型:从上图可以看出 Tomcat 的容器分为 ...

  3. elasticsearch中filter执行原理深度剖析(bitset机制与caching机制)

    (1)在倒排索引中查找搜索串,获取document list date来举例 word doc1 doc2 doc3 2017-01-01 * *2017-02-02  *   *2017-03-03 ...

  4. 浅析Servlet执行原理

    在JavaWeb学习研究中,Servlet扮演重要的作用,学好它,是后续JavaWeb学习的良好基础.无论是SSH,还是SSM,微服务JavaWeb技术,都应先学好Servlet,从而达到事半功倍的效 ...

  5. 过滤器(filter),监听器(listener),与servlet的执行顺序

    创建: 加载顺序 监听器-->过滤器-->Servlet.项目启动后,容器会首先创建声明的各种监听器,为后继的各个事件监听做准备,然后创建过滤器,最后是Servlet.销毁的时候是反序进行 ...

  6. [转帖]浅析Servlet执行原理

    浅析Servlet执行原理 原贴地址: https://www.cnblogs.com/wangjiming/p/10360327.html 原作者画的图挺好. 自己之前看过iis的一些配置文档 但是 ...

  7. servlet/filter/listener/interceptor区别与联系

    转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...

  8. Java Servlet Filter(转)

    做web开发的人对于Filter应该不会陌生,一直在很简单的使用,但是一直没有系统的总结一下,随着年纪的慢慢长大,喜欢总结一些事情,下面说说我对Filter的理解,官方给出的Filter的定义是在请求 ...

  9. 干货,一文带你超详细了解 Filter 的原理及应用

    提出问题 1.我们在访问后台很多页面时都需要登录,只有登录的用户才能查看这些页面,我们需要   在每次请求的时候都检查用户是否登陆,这样做很麻烦,有没有一种方法可以在我们请求之   前就帮我们做这些事 ...

随机推荐

  1. 怎样在Cocos2d-x中使用Lua脚本

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013321328/article/details/25699545 笔者使用的是Cocos2d-x ...

  2. (数据科学学习手札59)从抓取数据到生成shp文件并展示

    一.简介 shp格式的文件是地理信息领域最常见的文件格式之一,很好的结合了矢量数据与对应的标量数据,而在Python中我们可以使用pyshp来完成创建shp文件的过程,本文将从如何从高德地图获取矢量信 ...

  3. javascript基础入门之js中的结构分支与循环语句

    javascript基础入门之js中的结构分支与循环语句 程序的结构①顺序结构:自上而下:②选择(分支)结构:多条路径,根据不同的条件,只执行其中一个:③循环结构:重复某些代码④配合特定的语句实现选择 ...

  4. 初识 flex 布局

    开启弹性盒模式:   display:flex / inline-flex:   inline-flex  行内弹性盒 1.设置 flex 缩放的 限定值 min-width 最小值   min-wi ...

  5. redis数据库操作

    一.String(字符串)操作 String在redis中的存储是按照key-value的形式存储 1.SET key value [EX seconds] [PX milliseconds] [NX ...

  6. Linux统计根分区使用率

    #!/bin/bash # 统计根分区使用率 # 作者: shaohsiung # 时间: // rate=$(df -h | grep "dev/sda3" | awk '{pr ...

  7. C#中反射的基础基础基础

    class Program { static void Main(string[] args) { Type t = typeof(Student);//typeof(类) 取类的类型 并且存储在Ty ...

  8. .nett Core之路由配置

    //配置路由 app.UseMvc(buider => { buider.MapRoute("Default", "{controller=home}/{actio ...

  9. Kotlin -help

    { kotlin: run Kotlin programs, scripts or REPL. Usage: kotlin <options> <command> <ar ...

  10. Dart编程布尔值

    Dart为布尔数据类型提供内置支持.Dart中的布尔数据类型仅支持两个值true和false.关键字bool用于表示DART中的布尔值. 在dart中声明布尔变量的语法如下所示 bool var_na ...