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

一、ServletContextHandler的概念

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

二、应用场景

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

三、继承体系

Jetty9源码剖析 - Handler组件 - ServletContextHandler

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

Jetty9源码剖析 - Handler组件 - ServletContextHandler

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

四、源码剖析

1 、ServetContextHandler的创建

Jetty9源码剖析 - Handler组件 - ServletContextHandler

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

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

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

relinkHandlers更新执行链

Jetty9源码剖析 - Handler组件 - ServletContextHandler

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

2、ServetContextHandler的启动

Jetty9源码剖析 - Handler组件 - ServletContextHandler

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

3 、ServetContextHandler.Context的实现

Jetty9源码剖析 - Handler组件 - ServletContextHandler

Jetty9源码剖析 - Handler组件 - ServletContextHandler

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服务需要的逻辑,特别是类加载器,到时候我们一起来学习下~

 

相关文章:

  • 2022-01-17
  • 2021-05-15
  • 2021-12-25
  • 2021-11-25
  • 2021-08-27
  • 2022-01-09
  • 2021-04-03
  • 2021-08-18
猜你喜欢
  • 2021-06-30
  • 2021-05-07
  • 2021-05-07
  • 2021-08-01
  • 2021-07-28
  • 2021-09-29
  • 2021-05-02
相关资源
相似解决方案