Jetty核心就是三大部分, Connector
处理连接,IO,读写数据, Handler
处理后续的Servlet请求,线程池管理所有的异步任务.
当Connector将数据包装成Request对象后,会交给Handler进行处理.
Handler接口定义很简单
接口-抽象类实现接口-具体实现类
,这是非常常见的一种封装抽象逻辑,所以AbstractHandler一定是存在的,而AbstractHandlerContainer为了实现链式调用,所以会持有其他Handler的引用.
HandlerWrapper和HandlerCollection都是继承自AbstractHandlerContainer,前者只包含一个Handler的引用,而后者会持有一个Handler数组.
Server和ScopedHandler Server
继承自HandlerWrapper,它是Handler模块的入口,所以必然会持有另一个Handler对象,将请求传递下去.
ScopedHandler
实现了责任链的调用,并且持有请求的上下文信息.
上下文信息是Servlet规范规定Servlet在执行过程必须有上下文. ScopedHandler
的子类就是用来实现Servlet规范的,例如 ServletHanndler
, ContextHandler
, SessionHandler
, ServletContextHandler
HandlerCollectionHandlerCollection维护了一个Handler数组,目的是为部署多个Web应用时候可以根据请求URL选取相应Handler进行处理.
Handler具体实现虽然有很多,但是主要分为三大类
将请求路由到一组Handler,例如HandlerCollection内部持有一个Hanlder数组,请求过来后,会转发到数组中的某一个Handler.
这种Handler会处理请求,内部会持有另一个Handler的引用,自身处理完之后再交给下一个hanlder,例如继承HandlerWrapper的都有过滤器的特征.即ContextHandler,SessionHandler都是过滤器Handler.
这些Handler就是真正调用Servlet处理请求,生成响应内容,例如ServletHandler,也有静态资源请求对应的ResourceHandler.
为了帮助记忆与理解,先了解一下Jetty如何启动Web应用
//新建⼀个WebAppContext,WebAppContext是⼀个Handler WebAppContext webapp = new WebAppContext(); webapp.setContextPath("/mywebapp"); webapp.setWar("mywebapp.war"); //将Handler添加到Server中去 server.setHandler(webapp); //启动Server server.start(); server.join(); 复制代码
Servlet规范中定义了Context,Servlet,Filter,Listener等组件,Jetty需要支持这些组件,所以就需要相应的Handler,因此就会有对应的 ContextHandler
, ServletHandler
, SessionHandler
. WeAppContext自身就是一个Handler,同时负责管理ServletHandler和SessionHandler
ContextHandler负责初始化Servlet规范中的ServletContext对象,同时也会包含一组让Web应用运行起来的Handler.
可以理解为ContextHandler包含了一组能够处理特定URL请求的Handler.
ServletHandler实现了Servlet规范中的三大组件, Servlet
, Filter
, Listener
.会由ServlerHolder,FilterHolder,ListenerHolder进行封装.然后每一个URL与其对应的Servlet会被ServletMapping包装起来,Filter与拦截的URL被FilterMapping包装起来.
SessionHandler管理Session,SecurityHandler负责安全控制,Gziphandler负责解压缩.
对比Tomcat,可以发现Jetty中的Handler和Tomcat的Container其实是类似的,Jetty中的 WebAppContext
相当于Tomcat的 Context
组件,都是对应一个Web应用;Jetty中的 ServletHandler
对应Tomcat的 Wrapper
,负责初始化和调用Servlet,并负责调用Filter链.
虽然Handler与Servlet都可以用于处理具体的业务逻辑,但是Handler可以持有别的Handler,并且实现了Servlet规范中的三大组件,而Servlet的调用和处理由Servlet容器控制,不会涉及Filter和Handler.
最本质的区别其实就是Handler是Servlet的超集
对于Jetty来说,大部分的通用模块和逻辑处理都被抽象成了Handler组件,而Handler组件能任意组合实现高度扩展性和定制化.所以Jetty的精髓就是 微内核+插件化