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

26 | Context容器(下):Tomcat如何实现Servlet规范?

doFilter方法
LifecycleListener
ServletContextListener
applicationLifecycleListenersObjects
applicationEventListenersList
ApplicationFilterChain
invoke方法
触发监听器
Context容器管理
监听器类名
doFilter方法
Filter链
web.xml配置
StandardWrapperValve
BasicValve
loadServlet方法
Servlet实例
CopyOnWriteArrayList和对象数组设计
Context组件
Web容器职能
Servlet、Filter、Listener
Listener管理
Filter管理
Pipeline-Valve机制
Wrapper容器
课后思考
总结
Tomcat实现
Servlet规范

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

我们知道,Servlet 容器最重要的任务就是创建 Servlet 的实例并且调用 Servlet,在前面两期我谈到了 Tomcat 如何定义自己的类加载器来加载 Servlet,但加载 Servlet 的类不等于创建 Servlet 的实例,类加载只是第一步,类加载好了才能创建类的实例,也就是说 Tomcat 先加载 Servlet 的类,然后在 Java 堆上创建了一个 Servlet 实例。
一个 Web 应用里往往有多个 Servlet,而在 Tomcat 中一个 Web 应用对应一个 Context 容器,也就是说一个 Context 容器需要管理多个 Servlet 实例。但 Context 容器并不直接持有 Servlet 实例,而是通过子容器 Wrapper 来管理 Servlet,你可以把 Wrapper 容器看作是 Servlet 的包装。
那为什么需要 Wrapper 呢?Context 容器直接维护一个 Servlet 数组不就行了吗?这是因为 Servlet 不仅仅是一个类实例,它还有相关的配置信息,比如它的 URL 映射、它的初始化参数,因此设计出了一个包装器,把 Servlet 本身和它相关的数据包起来,没错,这就是面向对象的思想。
那管理好 Servlet 就完事大吉了吗?别忘了 Servlet 还有两个兄弟:Listener 和 Filter,它们也是 Servlet 规范中的重要成员,因此 Tomcat 也需要创建它们的实例,也需要在合适的时机去调用它们的方法。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Tomcat实现Servlet规范的关键在于管理Servlet、Filter和Listener。通过Wrapper容器管理Servlet实例,采用延迟加载策略,通过Pipeline-Valve机制调用StandardWrapperValve创建Servlet实例和调用Filter链。Filter链采用责任链模式依次调用Filter的doFilter方法。对于Listener,Tomcat通过Context容器管理并触发相应的监听器方法。文章还提到了Web容器的职能,以及Context组件通过自定义类加载器加载Web应用并实现Servlet规范。建议读者阅读Context容器的源码,以加深理解。同时,读者可以思考Context容器使用CopyOnWriteArrayList和对象数组存储监听器的设计原因。整体而言,本文深入解析了Tomcat如何实现Servlet规范,对于想深入了解Web容器内部工作原理的读者具有很高的参考价值。

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

全部留言(19)

  • 最新
  • 精选
  • -W.LI-
    属性值变化listener能动态配置,所以用CopyOnWriteArray。生命周期事件listener,不能动态改变没有线程安全问题?

    作者回复: 说的对

    2019-07-09
    2
    31
  • yang
    啊啊啊 老师再写一个深入拆解spring 或者springboot 的专栏吧 和tomcat形成兄弟专栏 定价比这个贵2~3倍 您负责写 我们和极客时间的平台负责大卖

    作者回复: 😄

    2019-08-21
    3
    9
  • calljson
    请教下老师,serverlet的service方法作用是什么?仅仅是分发请求吗?

    作者回复: service方法是留给程序员实现的,实现业务逻辑,比如数据库的增删查改

    2019-07-16
    5
  • 飞翔
    老师我需要手动加一个filter,不能用annotation或是xml、我是不是需要调用standardcontext里边的addfilterdef和addfiltermap这两个函数就行了?

    作者回复: 对的

    2019-07-09
    5
  • Nu11PointerEx
    老师我想问一下,对应的filter是怎么注册到servlet中去的

    作者回复: filter是注册到Servlet容器中,Tomcat的StandardContext类中维护了一个Filter列表,所谓的注册就是把你写的filter类实例加到这个列表中。

    2019-07-19
    4
  • 非想
    老师您好,看你的文章servlet容器中的三个组件servlet,filter,linstener都是由context容器管理的对吗?

    作者回复: filter是wrapper组件管理的

    2019-07-09
    5
    4
  • 飞翔
    private Map<String, FilterDef> filterDefs = new HashMap<>(); 老师 您说 filter放在map里边,由context管理,然后我看 您后边永硕 filter是wrapper管理的 这个不是矛盾嘛

    作者回复: Map里存的是filterDef,filter定义,不是filter类实例

    2019-07-23
    2
  • 飞翔
    话说 host engine 和context 都有pipline实现的责任链,wrapper没有pipline 而是用filter 实现的责任链是吧

    作者回复: wrapper其实也有pipeline,可以这样理解,pipeline是Tomcat内部的责任链,gei内部组件用,而filter是种扩展机制,filter可以是用户定义的。

    2019-07-23
    2
  • Monday
    思考题两种数据结构我能区分开来,但是还是回答不上来。。。
    2019-07-11
    3
  • nightmare
    生命周期相关的类比如session一个用户分配一个,用完了就会销毁,用对象数组,可以适应增删改操作,而属性变化,写不会那么频繁,读取比较频繁
    2019-07-09
    2
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部