手把手带你写一个 MiniTomcat
郭屹
前 Sun Microsystems Java 研发工程师
1792 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 22 讲
开篇词 (1讲)
手把手带你写一个 MiniTomcat
15
15
1.0x
00:00/00:00
登录|注册

14|多应用支持:拆分Context、BootStrap与路由转发

你好,我是郭屹。今天我们继续手写 MiniTomcat。
上节课我们新增了过滤器 Filter 和监听器 Listener。利用过滤器,对每一层的对象依次进行处理,最终构建出请求对象和返回对象;而监听器的存在,则是为了配合我们目前已有的 Container、Session 等机制,通过监听相关的事件,比如启动、超时、结束等,更好地对服务器进行管理。
目前我们的测试代码,都写在 /webroot 目录下,但如果有不同的应用,那就都混合在同一路径下了,这样不利于管理。所以这节课我们进一步考虑支持多路由的转发,通过路径的区分,将请求转发到不同应用之中,我们会引入 Context 这个概念来实现应用的相互隔离。
如图所示,用户在 url 中分别输入路径 hello/ 和 another/,这就代表了两个不同的 context,以此路径分别定位于不同的应用中。
在此基础上,我们再优化 Bootstrap,去除多余的功能,确保它只是一个启动器,贯彻各司其职的设计理念。
下面我们一起来动手实现。

项目结构

这节课我们主要新增了 StandardHost、StandardHostValve,以及 WebappClassClassLoader 类。还有一个重要的变化是在 /webroot 目录下新增 app1 和 app2 目录,用来区分不同的应用。你可以看一下改动后的项目结构。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何在MiniTomcat中实现多应用支持的过程。作者首先介绍了过滤器和监听器的作用,然后讨论了通过引入Context的概念来实现应用的相互隔离。在此基础上,作者进一步优化了Bootstrap,确保它只是一个启动器。文章详细介绍了项目结构的变化,以及引入了WebappClassLoader来准备应用拆分和自定义类加载器。作者还解释了如何利用WebappClassLoader来实现应用之间的隔离,以及通过新的URI解析来管理后端应用程序。整体来说,本文通过讲解MiniTomcat的改造过程,展示了如何实现多应用支持的技术特点,为读者提供了深入了解和实践的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniTomcat》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • Twein
    老师,上条留言说错了,应该是host的start方法没有启动过滤器的代码,源码少了这块逻辑

    作者回复: 放到Context里面的

    2024-02-21归属地:海南
  • Geek_50a5cc
    感觉一路跟过来,好多概念有点模糊了,有空回头再看看

    作者回复: 要反复琢磨。再次看的时候,不要沉浸在细节,主要理解结构。

    2024-01-19归属地:北京
  • HH🐷🐠
    http://address:port/context/servlet 从一个整体出发,url --> HttpRequest, context --> StandardHost, servlet --> StandardWrapper, 当然背后还有涉及 HttpHeader、Filter 等等

    作者回复: address:port对应host,http对应connector协议处理

    2024-01-13归属地:广东
  • peter
    请教老师几个问题: Q1:不同应用对应不同的加载类吗?? 本文中有这样一句话“每一个 context 都对应一个不同的 WebappClassLoader”,对于加载类,是不同的实例?还是不同的类? 比如context1和context2,理解1:context1对应WebappClassLoaderA;context2对应WebappClassLoaderB,是不同的类。 理解2:context1对应WebappClassLoader的实例1;context2对应WebappClassLoader的实例2,即同一个类的不同实例。 Q2:webroot目录下的测试代码,在实际的Tomcat中就是具体的web应用,对吗? Q3:一个应用中,两个ClassLoader可以加载同一个类(版本也相同)吗? Q4:WebappClassLoader不需要继承已有的接口或方法吗? WebappClassLoader算是自定义ClassLoader吧。记得以前看过关于自定义ClassLoader的文章,好像要继承系统已有的接口或方法,就是说要和已有的东西建立联系。但本课中的WebappClassLoader是个单独的类,并无继承。 Q5:运行后找不到类,报错: java.lang.ClassNotFoundException: test.TestListener (StandardHost.java:120) // Instantiate a new instance of this filter and return it Class<?> clazz = classLoader.getClassLoader().loadClass(listenerClass); 还没有调试。老师那边能正常运行吗?

    作者回复: Q1,是的,不同的应用有一个不同的类加载器对应,这么设计是Tomcat的特性所要求的。因为Tomcat是一个应用服务器,它需要做到应用之间的隔离。 Q2,对,后面我改成了webapps目录,这样能更好地与Tomcat运行时对应上。 Q3,可以加载同一个类,因为用了不同的classloader。 Q4,WebappClasLoader里面包含了一个URLClassLoader Q5,所有Gitub/Gitee上的代码都是可以运行的

    2024-01-09归属地:北京
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部