jetty的ServletHandler分析(servlet最终调用前的一些流程)

本文深入剖析Jetty的ServletHandler在HTTP处理中的角色,它位于Connector到Servlet的路径中,负责匹配HTTP请求路径并调度正确Servlet。ServletHandler的重要属性如servletPathMap存储Servlet与URL映射关系。doStart方法创建了name与过滤器或Servlet的映射,并通过updateNameMappings和updateMappings方法处理配置。通过对filter和servlet的映射管理,ServletHandler确保HTTP请求到达正确的处理者。
摘要由CSDN通过智能技术生成

前面很多文章都提到过ServletHandler这种类型,它在整个http的处理中所占的位置如下:

(1)connector -> (2)server->(3)contextHandlerCollection->(4)WebAppContext->(5)ServletHandler->(6)Servlet

从上面整个http的处理过程来看,ServletHandler应该算得上是最接近用户定义的servlet的了。。。

一般情况下context收到http请求之后,这个请求最终都会直接交到servletHandler来处理,因此它也需要负责对http请求的path进行处理,从而才能将这个http请求交给正确的servlet。。。。


好了,先来看看ServletHandler的一些重要的属性的定义吧:

    private ContextHandler _contextHandler;   //这个servlet所属的contextHandler
    private ContextHandler.SContext _servletContext;  //当前这个context的servletcontext
    private FilterHolder[] _filters;   //filter数组
    private FilterMapping[] _filterMappings;  //xml中的filter的map信息
    private boolean _filterChainsCached=true;
    private int _maxFilterChainsCacheSize=1000;
    private boolean _startWithUnavailable=true;
    
    private ServletHolder[] _servlets;   //servletholder数组,一般情况下用户定义的servlet都会被servletholder包装一下
    private ServletMapping[] _servletMappings;   //用于保存从xml中读取出来的servlet的map信息
    
    private transient Map _filterNameMap= new HashMap();    //filter的name对应
    private transient List _filterPathMappings;   //将filter与特定的path对应起来
    private transient MultiMap _filterNameMappings;  //servlet的name与filter的对应,有的filter可能会指定特定的servlet
    
    private transient Map _servletNameMap=new HashMap();   //servlet与名字进行对应
    private transient PathMap _servletPathMap;   //pathmap,这个很重要,当请求来了之后,就会通过它来匹配出合适的servlet来处理
    
    protected transient HashMap _chainCache[];   //请求访问path与fitlerchain的缓存,防止每次都要创建

这里最为重要的一个属性应该就是servletPathMap了吧,我们在web.xml文件中会定义许多servlet,最后都会通过  <servlet-mapping> 元素将某个servlet与一个或者多个path对应起来。。。而这最终的对应关系都会在servletPathMap里面。。。另外还有许多其他的属性,具体他们是干什么的,应该注释就说的很清楚了吧。。。

那么接下来我们来看看ServletHandler的doStart方法吧:

    //servlethandler的启动过程
    protected synchronized void doStart()
        throws Exception {
        _servletContext=ContextHandler.getCurrentContext();  //获取当前的servletcontext
        _contextHandler=_servletContext==null?null:_servletContext.getContextHandler(); //保存其所属的contextHandler

        updateNameMappings();   //名字对应map的更新,也就是我们在xml文件中定义的servlet名字与servletholder对象的对应,当然这里还有filter
       
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值