深入拆解 Tomcat & Jetty
李号双
eBay 技术主管
38890 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
深入拆解 Tomcat & Jetty
15
15
1.0x
00:00/00:00
登录|注册

10 | 比较:Jetty架构特点之Handler组件

WebAppContext
ServletContextHandler
SessionHandler
ContextHandler
ServletHandler
ScopedHandler
Server
HandlerCollection
HandlerWrapper
GzipHandler
SecurityHandler
SessionHandler
ServletHandler
ContextHandler
AbstractHandlerContainer
AbstractHandler
destroy方法
getServer方法
setServer方法
handle方法
WebAppContext
内容Handler
过滤器Handler
协调Handler
Handler继承关系
Handler接口
如何实现Servlet规范
Handler的类型
Handler是什么
Jetty架构特点之Handler组件

该思维导图由 AI 生成,仅供参考

在专栏上一期,我们学习了 Jetty 的整体架构。先来回顾一下,Jetty 就是由多个 Connector(连接器)、多个 Handler(处理器),以及一个线程池组成,整体结构图如下。
上一期我们分析了 Jetty Connector 组件的设计,Connector 会将 Servlet 请求交给 Handler 去处理,那 Handler 又是如何处理请求的呢?
Jetty 的 Handler 在设计上非常有意思,可以说是 Jetty 的灵魂,Jetty 通过 Handler 实现了高度可定制化,那具体是如何实现的呢?我们能从中学到怎样的设计方法呢?接下来,我就来聊聊这些问题。

Handler 是什么

Handler 就是一个接口,它有一堆实现类,Jetty 的 Connector 组件调用这些接口来处理 Servlet 请求,我们先来看看这个接口定义成什么样子。
public interface Handler extends LifeCycle, Destroyable
{
//处理请求的方法
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException;
//每个Handler都关联一个Server组件,被Server管理
public void setServer(Server server);
public Server getServer();
//销毁方法相关的资源
public void destroy();
}
你会看到 Handler 接口的定义非常简洁,主要就是用 handle 方法用来处理请求,跟 Tomcat 容器组件的 service 方法一样,它有 ServletRequest 和 ServletResponse 两个参数。除此之外,这个接口中还有 setServer 和 getServer 方法,因为任何一个 Handler 都需要关联一个 Server 组件,也就是说 Handler 需要被 Server 组件来管理。一般来说 Handler 会加载一些资源到内存,因此通过设置 destroy 方法来销毁。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Jetty架构特点之Handler组件,通过对Handler接口及其子类的分析,展现了Jetty的高度可定制化特性。Handler作为Jetty的灵魂,负责处理请求并实现了Servlet容器的功能。文章介绍了Handler的继承关系,包括协调Handler、过滤器Handler和内容Handler,以及如何实现Servlet规范的具体方法。Jetty的Handler设计体现了“微内核 + 插件”的设计思想,允许用户自定义Handler来添加到Jetty中,实现高度的可定制化。Jetty的Handler架构与Tomcat的容器组件对等,但Jetty通过Handler实现了更灵活的功能扩展和定制。通过对比Tomcat的架构图,读者可以更好地理解Jetty的Handler组件。文章深入浅出地介绍了Jetty的Handler架构特点,为读者提供了全面的了解和思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Tomcat & Jetty 》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • 秋天
    hadler只算是一层wrapper,真正处理得还是真正处理servlet逻辑的servlet

    作者回复: Handler实现的是Web容器本身的功能,Servlet实现的是具体业务逻辑。

    2019-07-16
    20
  • 夏天
    想学习tomcat架构,大佬有没有推荐的书籍

    作者回复: How tomcat works 还不错

    2019-06-01
    2
    15
  • 易儿易
    老师讲的这篇知识点脉络清晰,看完之后能够明确课程内容,但是考虑到开发使用,我却更迷糊了,web开发要怎样跟Jetty这样的容器相结合呢?我们跑在tomcat上的项目能拿下来直接放到Jetty上吗?感觉Jetty需要在项目中增加很多配置才行,对开发的要求也多……没有用过Jetty

    作者回复: 在Tomcat可以跑的War包可以直接放到Jetty里跑

    2019-07-01
    2
    7
  • -W.LI-
    老师有jetty源码下载地址链接么?git的下不动😂

    作者回复: 源码github上都有的,但是我建议用内嵌式的方式跑Jetty,体会一下SpringBoot是怎么用Jetty的,可以用IDE把源码下载下来,加断点调试。 https://github.com/jetty-project/embedded-jetty-jsp

    2019-06-02
    6
  • -W.LI-
    Handler实现了 Servlet 规范中的 Servlet、Filter 和 Listener 功能中的一个或者多个。handler可以持有别的handle,servlet不持有别的servlet。servlet的调用关系通过servlet容器来控制。handler的调用关系通过wabappcontext控制。老师好! Tomcat通过连接器来区分协议和端口号,host区分虚拟主机(二级域名)。jetty里面是怎么绑定的呢?jetty的连接器和容器没有对应关系,所有的容器都可以处理各种的协议么?mapping具体又是在哪里起作用的呢?是handlecollection通过mapping找到对应的wabappcontext吗?

    作者回复: 可以给一个wabappcontext配置多个虚拟主机地址,在Jetty中,请求进来后,可以在所有的wabappcontext上进行匹配,首先是虚拟主机名,然后是访问路径。

    2019-06-03
    3
  • 空知
    老师问下 server是一个 handlerWrapper 内部应该只有一个hanlder 可是他内部又维护一个handlerCollection,当请求过来时候 去handlerCollection 里面根据url判断是哪个项目 那定义的那个 单独的hanlder 有啥用?

    作者回复: 单独的Handler的handle方法也会处理一些自己的逻辑,再调用下一个Handler的handle方法

    2019-06-03
    1
  • why
    - Handler 是一个接口, 有一堆实现类 - Handler 接口用 handle 方法处理请求, 类似 Tomcat 的 service - 有 set/getServer 用于关联一个 Server - 用 destroy 销毁释放资源 - Handler 继承关系 - Handler→AbstractHandler→AbstractHandlerContainer - AbstractHandlerContainer 中有其他 handler 的引用, 可实现链式调用 - AbstractHandlerContainer 子类有 HandlerWrapper 和 HandlerCollection. HandlerWrapper 包含一个 Handler 引用; HandlerCollection 包含多个 Handler 引用, 存于数组中 - HandlerWrapper 有两个子类: Server 和 ScopedHandler - Server, 是 Handler 的入口, 必须将请求传递给其他的 Handler 处理 - ScopedHandler 实现具有上下文信息的责任链调用; 有一堆子类来实现 Servlet 规范: ServletHandler; ContextHandler; ContextHandler; ServletContextHandler; WebAppContext - HandlerCollection 用于支持多个 Web 应用, 每个 Web 应用对应一个 Handler 入口 - Server 中有 HandlerCollection, Server 根据 URL 从数组中选择 Handler 处理请求 - Handler 的类型 - 协调 Handler: 负责将请求路由到一组 handler, 如 HandlerCollection - 过滤器 Handler: 自己会处理请求, 再转发给下一个 Handler, 如 HandlerWrapper 及其子类 - 内容 Handler: 调用真正 Servlet 处理请求, 响应内容, 如 ServletHandler, 或 ResourceHandler 响应静态资源请求 - 实现 Servlet 规范 - ServletHandler, ContextHandler, WebAppContext - Jetty 启动 Web 应用分为两步 - 创建 WebAppContext 并配置 WAR 包和应用路径 - 将 WebAppContext 添加到 Server, 并启动 Server - Servlet 规范有: Context, Servlet, Filter, Listen, Session, Jetty 对应的实现为 ContextHandler, ServletHandler, SessionHandler - WebAppContext 是一个 ContextHandler, 并负责管理 ServletHandler 和 SessionHandler - ContextHandler 负责创建并初始化 ServletContext 对象, 另外还包含一组 Handler, 处理特定 URL 的请求(ServletHandler) - ServletHandler 实现 Servlet, Filter, Listen 的功能; 其依赖 Filter/ServletHandler(Filter 和 Serlvet 的包装类) 以及 Filter/ServletMapping 封装 Filter/Servlet 及其映射的路径 - SessionHandler 管理 Session - WebAppContext 将这些 Handler 构成执行链: Connection→SessionHandler→SecurityHandler→...→SevletHandler→Servlet.
    2019-06-07
    11
  • Wipeher
    老师。看了下源码。Server中并没有HandlerCollection。而只有一个private final List<Connector> _connectors = new CopyOnWriteArrayList<>(); 所以不太明白,文中为何提到Server有HandlerCollection,而且,从类图上来说,也不符合逻辑,已经声明为HandleWrapper了,为何要维护一个HandlerCollection,不如一开始直接实现一个HandlerCollection就可以了。望老师指教
    2020-06-19
    1
    2
  • east
    1.H和S都能处理请求, 2.H可以调用S,S不能调用H, 3.H更多处理通用的处理并且是抽象的,S是处理具体的且比较特定化请求
    2019-06-01
    2
  • 完美世界
    Jetty Server 就是由多个 Connector、多个 Handler,以及一个线程池组成。 Jetty 的 Handler 设计是它的一大特色,Jetty 本质就是一个 Handler 管理器,Jetty 本身就提供了一些默认 Handler 来实现 Servlet 容器的功能,你也可以定义自己的 Handler 来添加到 Jetty 中,这体现了“微内核 + 插件”的设计思想。 handler 应该会把请求字节流转换为servlet request
    2019-06-04
    1
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部