回顾Jetty架构
Jetty核心就是三大部分,Connector
处理连接,IO,读写数据,Handler
处理后续的Servlet请求,线程池管理所有的异步任务.
Handler
当Connector将数据包装成Request对象后,会交给Handler进行处理.

- handle()处理任务
- get,setServer()关联Server组件,由Server统一管理Handler
- destory()清理资源
Handler的继承关系

接口-抽象类实现接口-具体实现类
,这是非常常见的一种封装抽象逻辑,所以AbstractHandler一定是存在的,而AbstractHandlerContainer为了实现链式调用,所以会持有其他Handler的引用.
HandlerWrapper和HandlerCollection都是继承自AbstractHandlerContainer,前者只包含一个Handler的引用,而后者会持有一个Handler数组.

Server和ScopedHandler
Server
继承自HandlerWrapper,它是Handler模块的入口,所以必然会持有另一个Handler对象,将请求传递下去.
ScopedHandler
实现了责任链的调用,并且持有请求的上下文信息.
上下文信息是Servlet规范规定Servlet在执行过程必须有上下文.
ScopedHandler
的子类就是用来实现Servlet规范的,例如ServletHanndler
,ContextHandler
,SessionHandler
,ServletContextHandler
HandlerCollection HandlerCollection维护了一个Handler数组,目的是为部署多个Web应用时候可以根据请求URL选取相应Handler进行处理.
Handler的类型
Handler具体实现虽然有很多,但是主要分为三大类
协调Handler
将请求路由到一组Handler,例如HandlerCollection内部持有一个Hanlder数组,请求过来后,会转发到数组中的某一个Handler.
过滤器Handler
这种Handler会处理请求,内部会持有另一个Handler的引用,自身处理完之后再交给下一个hanlder,例如继承HandlerWrapper的都有过滤器的特征.即ContextHandler,SessionHandler都是过滤器Handler.
内容Handler
这些Handler就是真正调用Servlet处理请求,生成响应内容,例如ServletHandler,也有静态资源请求对应的ResourceHandler.
Jetty实现Servlet规范
为了帮助记忆与理解,先了解一下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();
- 1.创建WebAppContext(即Handler),然后为Handler设置一些参数,如war包的位置,web应用的访问路径(和Tomcat的Context路径一个意思)
- 2.将WebAppContext(Handler)添加到Server,然后启动Server
Servlet规范中定义了Context,Servlet,Filter,Listener等组件,Jetty需要支持这些组件,所以就需要相应的Handler,因此就会有对应的
ContextHandler
,ServletHandler
,SessionHandler
. WeAppContext自身就是一个Handler,同时负责管理ServletHandler和SessionHandler
ContextHanndler
ContextHandler负责初始化Servlet规范中的ServletContext对象,同时也会包含一组让Web应用运行起来的Handler.
可以理解为ContextHandler包含了一组能够处理特定URL请求的Handler.
ServletHandler
ServletHandler实现了Servlet规范中的三大组件,Servlet
,Filter
,Listener
.会由ServlerHolder,FilterHolder,ListenerHolder进行封装.然后每一个URL与其对应的Servlet会被ServletMapping包装起来,Filter与拦截的URL被FilterMapping包装起来.
其他Handler
SessionHandler管理Session,SecurityHandler负责安全控制,Gziphandler负责解压缩.
最终WebAppContext会将所有Handler构成一个执行链,最终调用到业务Servlet

对比Tomcat,可以发现Jetty中的Handler和Tomcat的Container其实是类似的,Jetty中的
WebAppContext
相当于Tomcat的Context
组件,都是对应一个Web应用;Jetty中的ServletHandler
对应Tomcat的Wrapper
,负责初始化和调用Servlet,并负责调用Filter链.
Handler与Servlet的区别
虽然Handler与Servlet都可以用于处理具体的业务逻辑,但是Handler可以持有别的Handler,并且实现了Servlet规范中的三大组件,而Servlet的调用和处理由Servlet容器控制,不会涉及Filter和Handler.
最本质的区别其实就是Handler是Servlet的超集
Jetty结构小结
对于Jetty来说,大部分的通用模块和逻辑处理都被抽象成了Handler组件,而Handler组件能任意组合实现高度扩展性和定制化.所以Jetty的精髓就是微内核+插件化