当前位置: 首页 > news >正文

自己动手写一个tomcat之2拆分httpserver职责

写在前面

源码 。
本文目标,使用标准的servlet,以及拆分httpserver职责。

1:使用标准的servlet

引入标准servlet的pom:

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency>

让HttpServlet实现javax.servlet.Servlet接口,使其成为标准的servlet:

publicclassHelloServletimplementsServlet{}

同样的request和response成为规范内的请求和响应对象:

importjavax.servlet.ServletRequest;publicclassRequestimplementsServletRequest{}
importjavax.servlet.ServletResponse;publicclassResponseimplementsServletResponse{}

2:拆分httpserver职责

当前,连接,处理请求职责都在http server,这显然不符合单一职责的原则,来拆分下,对于连接,引入Connector组件,对于处理请求引入processor组件。Connector组件定义类HttpConnector:

packagemonitomcat.server;// ...publicclassHttpConnectorimplementsRunnable{publicvoidrun(){ServerSocketserverSocket=null;intport=8080;try{serverSocket=newServerSocket(port,1,InetAddress.getByName("127.0.0.1"));}catch(IOExceptione){e.printStackTrace();System.exit(1);}while(true){Socketsocket=null;try{socket=serverSocket.accept();HttpProcessorprocessor=newHttpProcessor();processor.process(socket);// Close the socketsocket.close();}catch(Exceptione){e.printStackTrace();}}}publicvoidstart(){Threadthread=newThread(this);thread.start();}}

processor组件定义类HttpProcessor:

packagemonitomcat.server;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.Socket;publicclassHttpProcessor{publicHttpProcessor(){}publicvoidprocess(Socketsocket){InputStreaminput=null;OutputStreamoutput=null;try{input=socket.getInputStream();output=socket.getOutputStream();// create Request object and parseRequestrequest=newRequest(input);request.parse();// create Response objectResponseresponse=newResponse(output);response.setRequest(request);if(request.getUri().startsWith("/servlet/")){ServletProcessorprocessor=newServletProcessor();processor.process(request,response);}else{StaticResourceProcessorprocessor=newStaticResourceProcessor();processor.process(request,response);}}catch(Exceptione){e.printStackTrace();}}}

此时整个处理请求过程如下:

这样我们的启动类就很简单了:

packagemonitomcat.server;// ...publicclassHttpServer{publicstaticfinalStringWEB_ROOT=System.getProperty("user.dir")+File.separator+"target"+File.separator+"classes"+File.separator+"webroot";publicstaticfinalStringWEB_ROOT_SERVLET=System.getProperty("user.dir")+File.separator+"target"+File.separator+"classes"+File.separator+"monitomcat"+File.separator+"server";publicstaticvoidmain(String[]args){// HttpServer server = new HttpServer();// server.await();// 启动连接器HttpConnectorconnector=newHttpConnector();connector.start();}}

相比原来的代码是不是倍感清新舒爽~~~~~~~~!!!!!!!!
测试下:

C:\Users\dell9020>curl http://localhost:8080/hello.txt say hello from minitomcat v2...! C:\Users\dell9020>curl http://localhost:8080/servlet/monitomcat.server.HelloServlet <!DOCTYPE html> <html> <head><meta charset="utf-8"><title>Test</title></head> <body bgcolor="#f0f0f0"> <h1 align="center">Hello World from standard servlet!!!</h1>

写在后面

参考文章列表

手把手带你写一个 MiniTomcat 。

http://www.jsqmd.com/news/1384295/

相关文章:

  • N_m3u8DL-CLI-SimpleG:3步搞定M3U8视频下载的终极指南
  • 做河道护坡别踩雷!2026河道石笼网采购5大避坑要点【标瑞厂家】 - 优企甄选
  • 2026年8月汕头装修公司实力推荐:中高端整装与别墅大宅赛道分析 - 米諾
  • Harness Engineering:超越模型调优,构建高可用AI应用系统工程实践
  • MVO-PSO混合算法在微网优化调度中的应用
  • 在线 excel 表格控件对比,x‑spreadsheet、Luckysheet、XuY_Sheet、JExcel、Tabulator
  • LLM提示词优化实战:以ACE任务为例,降低推理成本与延迟
  • 锂电风机ODM定制:工厂选择与技术落地观察 - 甄选测评官
  • 2026年8月深圳漏水维修最全解答!梅雨残留受潮、台风渗水、墙体返碱发霉怎么修? - 宅安选房屋修缮
  • 从零构建RAG系统:基于LangChain的检索增强生成实战指南
  • SpringBoot 四川旅游推荐系统-----Vue + SpringBoot + 协同过滤的旅游决策平台----附源码80043
  • Gemini AI与Antigravity环境配置与开发实战指南
  • 新能源电网优化:MPC与场景分析法实践
  • 2026年最新:选视频孪生公司必看这3个口碑标准
  • 2026驼奶粉是什么?新疆驼乳分类、档位划分与选购认知全科普 - 米諾
  • 露,平滑肌槽 平滑肌实验系统 数显平滑肌槽
  • 基于LangChain.js手写编程Agent:从黑盒到白盒的React组件自动化生成实践
  • VMD终极指南:如何在3分钟内掌握GitHub风格的Markdown实时预览
  • 中文语音识别开源模型实战选型:WeNet、FunASR、Whisper对比与部署指南
  • HoRain云--Codex IDE 扩展
  • 微网站建设云帆网络为您打造专属数字化名片让企业在互联网时代抢占先机
  • 用Wireshark抓包分析STP生成树建立的过程
  • 3分钟学会Android应用级虚拟定位:FakeLocation完整使用教程
  • AI音乐生成实操:用MELO音乐快速制作可商用短视频背景配乐
  • 2026年合肥共达职业技术学院单招复读班怎么报名?联系方式多少? - 最新资讯
  • 广佛二手车寄卖平台竞争格局与差异化经营分析 - 甄选测评官
  • 武汉工程大学《数字逻辑》期末试卷20-23学年PDF
  • ComfyUI-VideoHelperSuite完整指南:三步解决AI视频创作技术难题
  • JavaFX Stage窗口属性详解:从基础配置到JFoenix集成实战
  • 如何免费解锁WeMod全部高级功能:Wand-Enhancer完全指南