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

12|Pipeline与Valve:如何实现容器间的调用、事务管理、权限验证?

你好,我是郭屹。今天我们继续手写 MiniTomcat。
上一节课我们把项目结构进一步抽象成两层 Container,分别是 Context 和 Wrapper,从而实现一个服务器管理多个容器,而容器又可以管理多个 Servlet,层层嵌套,提升了容器的扩展性。然后我们在这个基础上,参考 Tomcat 的项目结构,进行对应的调整,让它更贴近 Tomcat 源码本身。
接下来我们再转向通用部分的组件,首先考虑的就是日志。日志可以有效帮助我们调试程序运行过程中的问题,在合理的地方打印日志也可以帮助我们了解服务器的运行情况,所以我们接下来会定义通用的日志组件
在日志组件定义完毕后,我们紧接着会学习职责链模式在 Tomcat 中的应用,当服务器要调用某个具体的 Servlet 时,是经过这些 Contaienr 一层一层调用的,所以 Tomcat 中每个 Container 的 invoke() 都是通过职责链模式调用的。
我们一起来动手实现。

项目结构

这节课我们新增 Logger、Pipeline、Valve、ValveContext 接口,以及处理日志 Logger 与 Valve 的实现类等众多 Java 文件,具体内容后面我们会详细说明。你可以看一下现在这个项目的目录结构。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了在MiniTomcat中实现容器间的调用、事务管理和权限验证的方法。作者首先介绍了项目结构,并新增了Logger、Pipeline、Valve、ValveContext接口等多个Java文件。在项目结构的基础上,作者讲解了日志组件的定义以及职责链模式在Tomcat中的应用。通过职责链模式,服务器可以经过多个Container层层调用具体的Servlet。文章内容涉及技术性较强,适合对Java开发和服务器管理有一定了解的读者阅读。 在文章中,作者详细介绍了日志组件的定义,包括Logger接口的定义和Container接口中与Logger相关的Getter和Setter方法定义。此外,还介绍了LoggerBase抽象实现类和StringManager工具类的定义,以及Constants常量类、SystemErrLogger标准错误日志类和SystemOutLogger标准输出日志类的定义。作者还详细讲解了FileLogger实现类的属性和方法,以及在BootStrap中创建Logger并指派给Container使用的过程。 最后,文章还介绍了在ContainerBase、StandardContext和HttpConnector中增加与日志相关的代码,以及如何在MiniTomcat中实现容器间的调用、事务管理和权限验证。整篇文章内容丰富,涵盖了日志组件的定义和实现,以及在MiniTomcat中的具体应用,对于想要深入了解MiniTomcat内部实现的读者来说,是一篇值得阅读的文章。

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

全部留言(2)

  • 最新
  • 精选
  • peter
    请教老师几个问题: Q1:Logger接口定义中FATAL 为什么用 Integer.MIN_VALUE? 用0不就可以了吗? Q2:“后端”是指什么? “存在 Exception 异常时,后端会调用 printStackTrace 抛出异常”这句话中用到的“后端”是指什么?有“后端”就有“前端”,“前端”和“后端”分别指什么? Q3:为什么先调用next再调用自身业务? AccessLogValve的invoke方法中,先调用context中的invokeNext,实现职责链调用,再调用自己的业务。那就是先处理下一个,再处理自己,如此迭代下去,变成倒序了,类似于堆栈了。假设有3个业务,先到业务1,业务1调用业务2,业务2调用业务3,;业务3处理完以后再处理业务2,最后处理业务1。为什么这样设计? Q4:Tomcat中的日志处理有什么特别之处?

    作者回复: Q1,一般能用常量就不要用魔法值 Q2,我说后端指两种,一个是web系统中的服务器端,还有一种是指调用的下层,比如controller这一层,用到了service,则会把service堪称controller的后端 Q3,先用next是模仿的Tomcat Q4,没什么特别的,就是比较系统,按照日期区分,按照不同的container分开,access也分开的,比较有层次

    2024-01-04归属地:北京
    1
  • HH🐷🐠
    个人理解是 Valve 先添加先执行,可以当做为 Filter,在 Servlet 前面拦截先执行; Basic 属于自身业务最后执行, 可以当做 Servlet。

    作者回复: 概念是对的。你再注意一下几个valve之间的先后次序。

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