深入拆解Tomcat&Jetty(九)

673 阅读3分钟

回顾Jetty架构

Jetty核心就是三大部分,Connector处理连接,IO,读写数据,Handler处理后续的Servlet请求,线程池管理所有的异步任务.

Handler

当Connector将数据包装成Request对象后,会交给Handler进行处理.

Handler接口
Handler接口定义很简单

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

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

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

Handler内部的逻辑

对比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的精髓就是微内核+插件化