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

  • 相关阅读:
    最牛B的编码套路
    CRM运维工程师主要职责
    SQL ROUND函数用法
    VMware不能完全卸载问题
    如何建立真正支持业务的高效运维体系?
    【TensorFlow】tf.nn.softmax_cross_entropy_with_logits的用法
    L1正则化与L2正则化详解及解决过拟合的方法
    TensorFlow学习笔记之--[tf.clip_by_global_norm,tf.clip_by_value,tf.clip_by_norm等的区别]
    TensorFlow学习笔记之--[compute_gradients和apply_gradients原理浅析]
    Windows10+Tensorflow1.12-gpu+CUDA+cudnn+Anaconda3.5+Pycharm3.5 离线GPU开发环境搭建
  • 原文地址:https://www.cnblogs.com/msi-chen/p/10976691.html
Copyright © 2020-2023  润新知