自己动手写一个tomcat之5wrapper和container
写在前面源码 。本文引入负责维护servlet信息的container组件以及负责管理servlet生命周期的wrapper组件。1正文为了方便管理servlet的生命周期以及简化其他组件执行servlet的复杂度我们来引入wrapper组件对应如下类packagemonitomcat.server;// ...publicclassServletWrapper{privateServletinstancenull;privateStringservletClass;privateClassLoaderloader;privateStringname;protectedServletContainerparentnull;publicServletWrapper(StringservletClass,ServletContainerparent){this.parentparent;this.servletClassservletClass;try{loadServlet();}catch(ServletExceptione){e.printStackTrace();}}// ...publicServletloadServlet()throwsServletException{// ...}publicvoidinvoke(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{if(instance!null){instance.service(request,response);}}}接着定义负责管理servlet们的container组件当然这里是管理servlet的wrapper们了如下packagemonitomcat.server;// ...publicclassServletContainer{// ...publicvoidinvoke(HttpRequestrequest,HttpResponseresponse)throwsIOException,ServletException{ServletWrapperservletWrappernull;Stringurirequest.getUri();StringservletNameuri.substring(uri.lastIndexOf(/)1);StringservletClassNameservletName;servletWrapperservletInstanceMap.get(servletName);if(servletWrappernull){servletWrappernewServletWrapper(servletClassName,this);//servletWrapper.setParent(this);this.servletClsMap.put(servletName,servletClassName);this.servletInstanceMap.put(servletName,servletWrapper);}try{HttpServletRequestrequestFacadenewHttpRequestFacade(request);HttpServletResponseresponseFacadenewHttpResponseFacade(response);System.out.println(Call service());servletWrapper.invoke(requestFacade,responseFacade);}catch(Exceptione){System.out.println(e.toString());}catch(Throwablee){System.out.println(e.toString());}}}接着要调整负责调用servlet的servletprocessor类packagemonitomcat.server;importjavax.servlet.ServletException;importjava.io.IOException;publicclassServletProcessor{privateHttpConnectorconnector;publicServletProcessor(HttpConnectorconnector){this.connectorconnector;}publicvoidprocess(HttpRequestrequest,HttpResponseresponse)throwsIOException,ServletException{this.connector.getContainer().invoke(request,response);}}是不是简单多了代码也清新多了最后调整总指挥HttpServer类维护新增的container组件如下/** * 总的服务器对象负责管理类工作的对象类似于公司的管理层负责管理但不负责具体干活但管理本身不也是一种职责嘛所以也可以用单一职责来进行说明 */publicclassHttpServer{// public static final String WEB_ROOT System.getProperty(user.dir) File.separator webroot;publicstaticfinalStringWEB_ROOTSystem.getProperty(user.dir)File.separatortargetFile.separatorclassesFile.separatorwebroot;publicstaticfinalStringWEB_ROOT_SERVLETSystem.getProperty(user.dir)File.separatortargetFile.separatorclassesFile.separatormonitomcatFile.separatorserver;publicstaticvoidmain(String[]args){// 启动连接器试用连接器组件HttpConnectorconnectornewHttpConnector();connector.start();ServletContainerservletContainernewServletContainer();connector.setContainer(servletContainer);}}测试C:\Users\dell9020curl http://localhost:8080/servlet/monitomcat.server.TestServlet !DOCTYPE html html headmeta charsetutf-8titleTest/title/head body bgcolor#f0f0f0 h1 aligncentercongratulation, when you see me, indicate that your wrapper and container work well!!!/h12引入容器的概念首先做如下修改:ServletContext改为StandardContext ServletWrapper改为StandardWrapper Session改为StandardSession SessionFacade改为StandardSessionFacade HttpRequest改为HttpRequestImpl HttpResponse改为HttpResponseImpl HttpServer改为Bootstrap这里我们引入容器的概念使得各个组件更加方便管理。为了避免和当前的Container区分出来将当前的类ServletContainer修改为StandardContext。首相定义容器接口Containerpackagemonitomcat.server;// ...publicinterfaceContainer{publicstaticfinalStringADD_CHILD_EVENTaddChild;publicstaticfinalStringREMOVE_CHILD_EVENTremoveChild;publicStringgetInfo();publicClassLoadergetLoader();publicvoidsetLoader(ClassLoaderloader);publicStringgetName();publicvoidsetName(Stringname);publicContainergetParent();publicvoidsetParent(Containercontainer);publicvoidaddChild(Containerchild);publicContainerfindChild(Stringname);publicContainer[]findChildren();publicvoidinvoke(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException;publicvoidremoveChild(Containerchild);}给出公共的基础实现publicabstractclassContainerBaseimplementsContainer{}让servlet的wrapper成为容器:publicclassStandardWrapperextendsContainerBaseimplementsWrapper{}让context成为容器publicclassStandardContextextendsContainerBaseimplementsContext{}3调整目录结构更接近tomcat调整目录为如下调整不影响功能。源码 。写在后面在进行软件设计的时候其实可以类比现实场景中的公司公司中有很多的职责不同的职责对应的就是不同的岗位当增加新职责时比如新增了晚上守夜的职责时就新增一个守夜人的岗位。软件设计也是这个道理同样有很多的职责而这里每个职责对应的就是一个类当增加新职责时就新增一个类。这样做的好处是职责清晰程序也更好维护扩展性更好。总之就是大家一起协作把活干好参考文章列表手把手带你写一个 MiniTomcat 。

相关新闻

构建高可用机场服务系统:Spring Cloud微服务架构与韧性设计实践

构建高可用机场服务系统:Spring Cloud微服务架构与韧性设计实践

在机场技术系统的设计与开发中,我们常常面临一个核心挑战:如何在用户处于时间紧迫、环境陌生、流程复杂的“压力情境”下,依然提供稳定、流畅、可靠的数字化服务体验。这里的“压力”并非指强制,而是指在航班延误、安检排队、转机…

2026/8/23 0:07:24 阅读更多 →
VIA 图像标注工具:5 分钟上手目标标注的简单指南

VIA 图像标注工具:5 分钟上手目标标注的简单指南

VIA 图像标注工具:5 分钟上手目标标注的简单指南 【免费下载链接】via (MIRROR) see https://gitlab.com/vgg/via/ 项目地址: https://gitcode.com/gh_mirrors/via/via 给检测模型准备训练数据,最磨人的环节不是写训练脚本,而是一张一…

2026/8/23 0:08:00 阅读更多 →
自动化工具“抱着酒狐”实战指南:从原理到安全落地的工程实践

自动化工具“抱着酒狐”实战指南:从原理到安全落地的工程实践

你看到这个标题,可能会觉得有点奇怪,甚至有点不知所云。它不像一个标准的工具名,也不像一个技术概念。这恰恰是很多人在面对互联网上那些“野生”但实用的工具时,第一时间的真实感受——名字看不懂,功能猜不透&#xf…

2026/8/23 0:08:38 阅读更多 →

最新新闻

Mastra 工作流重试机制与错误处理:3 步实现零失败的完整指南

Mastra 工作流重试机制与错误处理:3 步实现零失败的完整指南

Mastra 工作流重试机制与错误处理:3 步实现零失败的完整指南 【免费下载链接】mastra Mastra is the modern TypeScript framework for AI-powered applications and agents. 项目地址: https://gitcode.com/GitHub_Trending/ma/mastra 一次上游接口抖动&…

2026/8/24 3:14:04 阅读更多 →
Ruflo 完整指南:多智能体蜂群编排,让 Claude Code 从单兵变军团

Ruflo 完整指南:多智能体蜂群编排,让 Claude Code 从单兵变军团

Ruflo 完整指南:多智能体蜂群编排,让 Claude Code 从单兵变军团 【免费下载链接】ruflo 🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI syst…

2026/8/24 3:14:04 阅读更多 →
PCB可靠性设计:泪滴与敷铜在Altium Designer中的关键应用

PCB可靠性设计:泪滴与敷铜在Altium Designer中的关键应用

1. 从“连上”到“可靠”:为什么需要滴泪与敷铜在AD(Altium Designer)里画PCB,很多新手朋友容易陷入一个误区:以为把原理图里的网络用线(Track)在PCB上连起来,电路就能工作了。这就像…

2026/8/24 3:14:04 阅读更多 →
滴滴AI Agent面试真题解析:RAG架构与安全机制设计

滴滴AI Agent面试真题解析:RAG架构与安全机制设计

如果你正在准备大厂AI Agent方向的面试,特别是像滴滴这样的一线互联网公司,那么这篇文章可能会帮你少走很多弯路。很多人在准备Agent面试时容易陷入两个误区:要么过度关注算法细节而忽略了工程架构,要么只背概念而缺乏实际项目经验…

2026/8/24 3:14:04 阅读更多 →
STM32外挂W25Qxx实现可靠掉电保存的工程实践

STM32外挂W25Qxx实现可靠掉电保存的工程实践

1. 项目概述:为什么STM32外挂W25Qxx是嵌入式掉电保存的“黄金组合” 在做STM32项目时,你有没有遇到过这样的问题:系统突然断电,刚采集的传感器数据没了;用户调好的PID参数一重启就归零;设备运行日志只存了最…

2026/8/24 3:14:04 阅读更多 →
基于Claude Code与Agent Teams构建AI驱动Web任务管理应用

基于Claude Code与Agent Teams构建AI驱动Web任务管理应用

在团队协作开发中,如何高效地管理任务、分配职责并跟踪进度,一直是开发者面临的挑战。传统的项目管理工具往往需要手动维护,而AI辅助开发又常常停留在单点问答层面。本文将带你体验一种全新的开发范式:利用Claude Code和Agent Tea…

2026/8/24 3:13:04 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →