转载自ph0ly:http://www.ph0ly.com
一、ServletContextHandler的概念
ServletContextHandler是Handler体系的重要成员,它包装常用的SessionHandler、ServletHandler、SecurityHandler,自身同时是一个ContextHandler,集成四大Handler,形成一个接近完整J2EE的处理器(这里对war的处理还未实现)
二、应用场景
Jetty Web容器必备的一个处理器,通常由WebAppContext来创建,才具备完整的J2EE Web服务器特性
三、继承体系
可以看到ServletContextHandler是一个ContextHandler,具备ContextHandler相关的特性(如果这里有疑问,可以阅读之前关于ContextHandler的文章)
ServletContextHandler会集成SessionHandler、ServletHandler、SecurityHandler,会根据配置主动创建,而自身是一个ContextHandler,因此可以说它是具备4大组件的一个Handler
四、源码剖析
1 、ServetContextHandler的创建
父类先初始化,覆盖父类创建的ServletContext,替换为ServletContextHandler自己的Context(包含对Filter、Servlet的操作)
初始化DecoratedObjectFactory,加入DeprecationWarning,对@Deprecated注解添加日志处理
设置contextPath,并将父容器的Handler设置为当前处理器(通常parent为null)
relinkHandlers更新执行链
relinkHandlers,这个是构建我们的ScopedHandler的核心方法,通常对于一个WebAppContext会开启Session、Security,因此这里会将SessionHandler设置为ServletConextHandler的处理器,SecurityHandler设置为SessionHandler的处理器,而SecurityHandler设置为ServletHandler的处理器,根据ScopedHandler的doStart规则,将会构建一个ServletConextHandler -> SessionHandler -> SecurityHandler -> ServletHandler
2、ServetContextHandler的启动
启动比较简单,设置了一个装饰器工厂到ServletContext(这个工厂没看出比较核心的价值),之后调了ContextHandler的启动,这里就不在多讲了
3 、ServetContextHandler.Context的实现
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服务需要的逻辑,特别是类加载器,到时候我们一起来学习下~