自己动手写一个tomcat之2拆分httpserver职责
写在前面源码 。本文目标使用标准的servlet以及拆分httpserver职责。1使用标准的servlet引入标准servlet的pomdependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/version/dependency让HttpServlet实现javax.servlet.Servlet接口使其成为标准的servletpublicclassHelloServletimplementsServlet{}同样的request和response成为规范内的请求和响应对象importjavax.servlet.ServletRequest;publicclassRequestimplementsServletRequest{}importjavax.servlet.ServletResponse;publicclassResponseimplementsServletResponse{}2拆分httpserver职责当前连接处理请求职责都在http server这显然不符合单一职责的原则来拆分下对于连接引入Connector组件对于处理请求引入processor组件。Connector组件定义类HttpConnectorpackagemonitomcat.server;// ...publicclassHttpConnectorimplementsRunnable{publicvoidrun(){ServerSocketserverSocketnull;intport8080;try{serverSocketnewServerSocket(port,1,InetAddress.getByName(127.0.0.1));}catch(IOExceptione){e.printStackTrace();System.exit(1);}while(true){Socketsocketnull;try{socketserverSocket.accept();HttpProcessorprocessornewHttpProcessor();processor.process(socket);// Close the socketsocket.close();}catch(Exceptione){e.printStackTrace();}}}publicvoidstart(){ThreadthreadnewThread(this);thread.start();}}processor组件定义类HttpProcessorpackagemonitomcat.server;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.Socket;publicclassHttpProcessor{publicHttpProcessor(){}publicvoidprocess(Socketsocket){InputStreaminputnull;OutputStreamoutputnull;try{inputsocket.getInputStream();outputsocket.getOutputStream();// create Request object and parseRequestrequestnewRequest(input);request.parse();// create Response objectResponseresponsenewResponse(output);response.setRequest(request);if(request.getUri().startsWith(/servlet/)){ServletProcessorprocessornewServletProcessor();processor.process(request,response);}else{StaticResourceProcessorprocessornewStaticResourceProcessor();processor.process(request,response);}}catch(Exceptione){e.printStackTrace();}}}此时整个处理请求过程如下这样我们的启动类就很简单了packagemonitomcat.server;// ...publicclassHttpServer{publicstaticfinalStringWEB_ROOTSystem.getProperty(user.dir)File.separatortargetFile.separatorclassesFile.separatorwebroot;publicstaticfinalStringWEB_ROOT_SERVLETSystem.getProperty(user.dir)File.separatortargetFile.separatorclassesFile.separatormonitomcatFile.separatorserver;publicstaticvoidmain(String[]args){// HttpServer server new HttpServer();// server.await();// 启动连接器HttpConnectorconnectornewHttpConnector();connector.start();}}相比原来的代码是不是倍感清新舒爽~~~~~~~~测试下C:\Users\dell9020curl http://localhost:8080/hello.txt say hello from minitomcat v2...! C:\Users\dell9020curl http://localhost:8080/servlet/monitomcat.server.HelloServlet !DOCTYPE html html headmeta charsetutf-8titleTest/title/head body bgcolor#f0f0f0 h1 aligncenterHello World from standard servlet!!!/h1写在后面参考文章列表手把手带你写一个 MiniTomcat 。

相关新闻

深入拆解Trae-Agent评估架构:从原理到实战构建AI智能体进化引擎

深入拆解Trae-Agent评估架构:从原理到实战构建AI智能体进化引擎

1. 项目概述:为什么我们需要深入拆解Trae-Agent的评估架构? 最近在跟进一些开源AI Agent框架时,Trae-Agent这个名字出现的频率越来越高。作为一个旨在构建“可训练、可评估、可演进”的智能体框架,它的设计理念本身就很有意思。但…

2026/10/7 15:01:48 阅读更多 →
SQL注入之堆叠查询注入学习笔记

SQL注入之堆叠查询注入学习笔记

一、什么是堆叠查询注入 堆叠查询注入是SQL注入中比较特殊的一种类型。它的核心逻辑是:在原有的SQL语句结束后,使用分号(;)作为分隔符,将多条SQL语句拼接在一起执行。 与之前学过的所有注入类型都不同,堆叠…

2026/10/7 5:50:30 阅读更多 →
Python爬虫实战:自动化采集App每日热门榜单数据

Python爬虫实战:自动化采集App每日热门榜单数据

1. 项目概述与核心需求解析最近在和一些做数据分析的朋友聊天时,他们提到一个挺有意思的需求:想了解某些特定类型应用(比如一些内容聚合类App)的每日热门内容趋势,用于做一些市场或用户行为分析。这类App通常每天会更新…

2026/9/27 19:54:29 阅读更多 →

最新新闻

NFA转DFA:Python子集构造法与ε闭包完整实现

NFA转DFA:Python子集构造法与ε闭包完整实现

简介:面向编译原理学习者与需要完成相关实验的开发者,这份资源以 Python 语言完整实现了 NFA 到 DFA 的转换,聚焦子集构造法的核心流程,帮助理解有限自动机与正则表达式求解之间的内在联系。压缩包共 3 个文件,分别对应…

2026/10/11 3:18:31 阅读更多 →
Z-EVES形式化验证工具实战:从Z语言规约到类型检查与定理证明

Z-EVES形式化验证工具实战:从Z语言规约到类型检查与定理证明

简介:这份资源围绕形式化Z语言及其辅助工具Z-EVES展开,面向软件工程、安全关键系统开发领域的学习者与研究者,帮助读者掌握用数学逻辑精确描述系统行为、并在设计阶段完成规格验证的方法。Z语言以集合论与逻辑为基础,通过域、结构…

2026/10/11 3:18:31 阅读更多 →
SQLite语法避坑指南:从类型亲和性到事务锁的全面解析

SQLite语法避坑指南:从类型亲和性到事务锁的全面解析

SQLite 大概是所有数据库里最“轻”的一个,但它的语法在细节上比教科书里的标准 SQL 多了不少自己的脾气。很多人第一次从 MySQL 切到 SQLite 时,第一反应是“这不就是 SQL 嘛”,可真到写复杂查询、做数据迁移、处理并发写入的时候&#xff0…

2026/10/11 3:18:31 阅读更多 →
MariaDB开启SSL完整指南:从证书生成到强制加密配置

MariaDB开启SSL完整指南:从证书生成到强制加密配置

聊到MariaDB,很多团队第一反应是调参、加索引、上读写分离,很少有人会主动去翻SSL配置。直到某一天,我用tcpdump抓包看到生产环境里一条SELECT * FROM users WHERE id 10086的明文SQL,连带密码哈希一起在网络上裸奔,才…

2026/10/11 3:18:31 阅读更多 →
YOLOv8实战全链路:从环境配置到RK3588部署与CSL改进

YOLOv8实战全链路:从环境配置到RK3588部署与CSL改进

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 3:18:31 阅读更多 →
集团精益智能工厂三年规划:70页模板的结构拆解与落地避坑指南

集团精益智能工厂三年规划:70页模板的结构拆解与落地避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 3:17:31 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →