深入拆解Tomcat & Jetty
李号双
eBay技术主管
立即订阅
6067 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | Java程序员如何快速成长?
免费
模块一 必备基础 (4讲)
01 | Web容器学习路径
02 | HTTP协议必知必会
03 | 你应该知道的Servlet规范和Servlet容器
04 | 实战:纯手工打造和运行一个Servlet
模块二 整体架构 (9讲)
05 | Tomcat系统架构(上): 连接器是如何设计的?
06 | Tomcat系统架构(下):聊聊多层容器的设计
07 | Tomcat如何实现一键式启停?
08 | Tomcat的“高层们”都负责做什么?
09 | 比较:Jetty架构特点之Connector组件
10 | 比较:Jetty架构特点之Handler组件
11 | 总结:从Tomcat和Jetty中提炼组件化设计规范
12 | 实战:优化并提高Tomcat启动速度
13 | 热点问题答疑(1):如何学习源码?
模块三 连接器 (9讲)
14 | NioEndpoint组件:Tomcat如何实现非阻塞I/O?
15 | Nio2Endpoint组件:Tomcat如何实现异步I/O?
16 | AprEndpoint组件:Tomcat APR提高I/O性能的秘密
17 | Executor组件:Tomcat如何扩展Java线程池?
18 | 新特性:Tomcat如何支持WebSocket?
19 | 比较:Jetty的线程策略EatWhatYouKill
20 | 总结:Tomcat和Jetty中的对象池技术
21 | 总结:Tomcat和Jetty的高性能、高并发之道
22 | 热点问题答疑(2):内核如何阻塞与唤醒进程?
模块四 容器 (8讲)
23 | Host容器:Tomcat如何实现热部署和热加载?
24 | Context容器(上):Tomcat如何打破双亲委托机制?
25 | Context容器(中):Tomcat如何隔离Web应用?
26 | Context容器(下):Tomcat如何实现Servlet规范?
27 | 新特性:Tomcat如何支持异步Servlet?
28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?
29 | 比较:Jetty如何实现具有上下文信息的责任链?
30 | 热点问题答疑(3):Spring框架中的设计模式
模块五 通用组件 (4讲)
31 | Logger组件:Tomcat的日志框架及实战
32 | Manager组件:Tomcat的Session管理机制解析
33 | Cluster组件:Tomcat的集群通信原理
特别放送 | 如何持续保持对学习的兴趣?
模块六 性能优化 (8讲)
34 | JVM GC原理及调优的基本思路
35 | 如何监控Tomcat的性能?
36 | Tomcat I/O和线程池的并发调优
37 | Tomcat内存溢出的原因分析及调优
38 | Tomcat拒绝连接原因分析及网络优化
39 | Tomcat进程占用CPU过高怎么办?
40 | 谈谈Jetty性能调优的思路
41 | 热点问题答疑(4): Tomcat和Jetty有哪些不同?
结束语 (1讲)
结束语 | 静下心来,品味经典
深入拆解Tomcat & Jetty
登录|注册

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

李号双 2019-07-09
我们知道,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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(16)

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

    作者回复: 说的对

    2019-07-09
    11
  • calljson
    请教下老师,serverlet的service方法作用是什么?仅仅是分发请求吗?

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

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

    作者回复: 😄

    2019-08-21
    2
  • Monday
    思考题两种数据结构我能区分开来,但是还是回答不上来。。。
    2019-07-11
    2
  • nightmare
    生命周期相关的类比如session一个用户分配一个,用完了就会销毁,用对象数组,可以适应增删改操作,而属性变化,写不会那么频繁,读取比较频繁
    2019-07-09
    2
  • Nu11PointerEx
    老师我想问一下,对应的filter是怎么注册到servlet中去的

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

    2019-07-19
    1
  • 靠人品去赢
    想问一下Tomcat会给每一个请求都生成一个Filter链,比如说很多请求的Filter链都差不多,Tomcat会不会对这些一样的链有一个处理,还是一个请求一条链调用完Servlet就把这个链上的Filter都释放掉?
    2019-11-05
  • 石妖
    李老师好,有个问题不太明白:每个Filter的doFilter调用Filter链的doFilter方法,那么这个调用是如何保证调用按照Filter链的顺序调用的?
    2019-10-02
  • 听雨
    这里感觉Filter是递归调用呀,网上为什么说是基于函数回调呢
    2019-08-13
  • 飞翔
    private Map<String, FilterDef> filterDefs = new HashMap<>();
    老师 您说 filter放在map里边,由context管理,然后我看 您后边永硕 filter是wrapper管理的 这个不是矛盾嘛

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

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

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

    2019-07-23
  • 草戊
    filter是有wrapper管理的?servlet吧,是不是手误回答错了?
    2019-07-17
  • z.l
    反向推导猜下,生命状态变化都在单线程中,没有并发问题。属性变化有线程安全问题,但又不频繁。
    2019-07-12
  • 飞翔
    老师我需要手动加一个filter,不能用annotation或是xml、我是不是需要调用standardcontext里边的addfilterdef和addfiltermap这两个函数就行了?

    作者回复: 对的

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

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

    2019-07-09
    1
  • Liam
    我记得pip-val是用单向链表实现的,filters chain是用数组实现的;另外,pipe节点自己负责调用下一个节点,而filter则是委派chain来调度
    2019-07-09
收起评论
16
返回
顶部