Jetty9源码剖析 - Handler组件 - ServletContextHandler

转载自ph0ly:http://www.ph0ly.com

一、ServletContextHandler的概念

ServletContextHandler是Handler体系的重要成员,它包装常用的SessionHandler、ServletHandler、SecurityHandler,自身同时是一个ContextHandler,集成四大Handler,形成一个接近完整J2EE的处理器(这里对war的处理还未实现)

二、应用场景

Jetty Web容器必备的一个处理器,通常由WebAppContext来创建,才具备完整的J2EE Web服务器特性

三、继承体系

ServletContextHandler组件继承体系

可以看到ServletContextHandler是一个ContextHandler,具备ContextHandler相关的特性(如果这里有疑问,可以阅读之前关于ContextHandler的文章)

ServletContextHandler周边组件关系

ServletContextHandler会集成SessionHandler、ServletHandler、SecurityHandler,会根据配置主动创建,而自身是一个ContextHandler,因此可以说它是具备4大组件的一个Handler

四、源码剖析

1 、ServetContextHandler的创建

ServletContextHandler构造函数

父类先初始化,覆盖父类创建的ServletContext,替换为ServletContextHandler自己的Context(包含对Filter、Servlet的操作)

初始化DecoratedObjectFactory,加入DeprecationWarning,对@Deprecated注解添加日志处理

设置contextPath,并将父容器的Handler设置为当前处理器(通常parent为null)

relinkHandlers更新执行链

ServletContextHandler.relinkHandlers

relinkHandlers,这个是构建我们的ScopedHandler的核心方法,通常对于一个WebAppContext会开启Session、Security,因此这里会将SessionHandler设置为ServletConextHandler的处理器,SecurityHandler设置为SessionHandler的处理器,而SecurityHandler设置为ServletHandler的处理器,根据ScopedHandler的doStart规则,将会构建一个ServletConextHandler -> SessionHandler -> SecurityHandler -> ServletHandler

2、ServetContextHandler的启动

ServletContextHandler.doStart

启动比较简单,设置了一个装饰器工厂到ServletContext(这个工厂没看出比较核心的价值),之后调了ContextHandler的启动,这里就不在多讲了

3 、ServetContextHandler.Context的实现

ServletContextHandler.Context实现1

ServletContextHandler.Context实现2

ServetContextHandler.Context这个类主要是实现了Servlet3.0动态编程方式添加Filter、Servlet,可以通过FilterRegistration.Dynamic、ServletRegistration.Dynamic添加Filter或Servlet,后面可以在继续配置路径或者其他配置,Spring Boot在集成时会使用这种方式来操作Filter或者Servlet,并且Spring Boot自己实现了一套Order机制,还能将Filter按照一定顺序加入到容器

这里就不在细讲了,其实这个类就是利用ServletHandler提供的能力,包装一些常用的addFilter、addServlet等操作,方便外部使用

五、总结

ServletContextHandler作为一个半成熟的处理器,主要对外包装很多接口,例如添加Filter、添加Servlet、安全相关,实现上没什么特别的。后面我们会研究WebAppContext这个处理器,它是最核心的一个Handler,实现了完整的Web服务需要的逻辑,特别是类加载器,到时候我们一起来学习下~

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值