首页 > 其他分享 >从零手写实现 apache Tomcat-01-入门介绍

从零手写实现 apache Tomcat-01-入门介绍

时间:2024-04-15 10:58:01浏览次数:20  
标签:01 HTTP 请求 Tomcat Java apache 服务器 Servlet

自己如何实现?

要实现一个简单版本的Tomcat,整体思路如下

  1. 了解 Tomcat 的基本原理

    • Tomcat 是一个开源的 Java Servlet 容器和 Web 服务器,它能够运行 Java Servlet 和 JavaServer Pages。
    • Tomcat 是基于 Java 的,它是用 Java 编写的。
  2. 创建一个简单的 HTTP 服务器

    • 创建一个 Java 类,作为你的 HTTP 服务器的入口点。
    • 使用 Java 的 ServerSocket 类监听来自客户端的连接。
    • 接受客户端连接后,读取客户端的请求,并解析其中的 HTTP 请求头。
    • 根据请求头中的信息,返回相应的 HTTP 响应。
  3. 实现 Servlet 功能

    • 创建一个类来处理 Servlet 请求。这个类需要实现 Servlet 接口。
    • 实现 Servlet 接口需要实现一系列的生命周期方法,如 init()service()destroy()
    • service() 方法中,根据 HTTP 请求的类型(GET、POST 等),调用相应的处理方法。
  4. 处理静态资源

    • 对于静态资源(如 HTML、CSS、JS 文件),你可以直接读取文件内容,并将其作为响应的一部分返回给客户端。
    • 在接收到 HTTP 请求后,解析请求路径,确定请求的资源是静态资源还是 Servlet 请求。
  5. 处理动态资源

    • 对于动态资源(如 JSP 页面),你需要在服务器端动态生成页面内容。
    • 当收到对动态资源的请求时,根据请求的信息动态生成 HTML 页面,并将其作为响应的一部分返回给客户端。
  6. 简单的请求处理

    • 实现简单的 HTTP 请求处理,包括支持 GET 和 POST 方法。
    • 解析请求头,获取请求路径和请求参数。
  7. 启动和停止服务器

    • 实现一个方法来启动和停止服务器。
    • 在服务器启动时,初始化必要的资源,如端口、线程池等。
    • 在服务器停止时,释放资源并关闭服务器的 Socket 连接。
  8. 测试你的服务器

    • 创建一些简单的 Servlet 和静态资源,并在浏览器中测试你的服务器。
    • 确保服务器能够正确地处理各种类型的请求,并能够返回正确的响应。

要实现完整的 Tomcat 功能,还需要考虑更多的细节,如多线程支持、连接池、Session 管理、安全性等。

我们可以循序渐进,先实现一些核心的能力。

从零手写例子

项目简介

 /\_/\  
( o.o ) 
 > ^ <

mini-cat 是简易版本的 tomcat 实现。别称【嗅虎】(心有猛虎,轻嗅蔷薇。)

开源地址:https://github.com/houbb/minicat

特性

  • 简单的启动实现/netty 支持

  • servlet 支持

  • 静态网页支持

  • filter/listener 支持

  • wars 支持

快速开始

maven 依赖

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>minicat</artifactId>
    <version>0.7.0</version>
</dependency>

启动测试

运行测试类 MiniCatBootstrapMain#main

MiniCatBootstrap bootstrap = new MiniCatBootstrap();
bootstrap.start();

启动日志:

[INFO] [2024-04-03 11:09:15.178] [main] [c.g.h.m.s.s.WebXmlServletManager.register] - [MiniCat] register servlet, url=/my, servlet=com.github.houbb.minicat.support.servlet.MyMiniCatHttpServlet
[INFO] [2024-04-03 11:09:15.180] [Thread-0] [c.g.h.m.b.MiniCatBootstrap.startSync] - [MiniCat] start listen on port 8080
[INFO] [2024-04-03 11:09:15.180] [Thread-0] [c.g.h.m.b.MiniCatBootstrap.startSync] - [MiniCat] visit url http://127.0.0.1:8080

页面访问:http://127.0.0.1:8080

响应:

http://127.0.0.1:8080

测试

servlet: http://127.0.0.1:8080/my

html: http://127.0.0.1:8080/index.html

开源地址

开源地址:https://github.com/houbb/minicat

开源不易,欢迎 fork+star~~~ 鼓励一下作者

标签:01,HTTP,请求,Tomcat,Java,apache,服务器,Servlet
From: https://www.cnblogs.com/houbbBlogs/p/18135427

相关文章

  • js获取时间差,返回格式为01天02小时03秒
    //获取时间差返回值格式:01天02小时30秒exportfunctioncaclulateDiffTime(start,end):string{start=newDate(start).getTime();end=newDate(end).getTime();letstaytimeGap=end-start;if(staytimeGap<0){staytimeGap=start-end;}i......
  • day01-02_我的Java学习笔记 (IDEA的安装、配置及使用、IDEA常用快捷键、IEDA创建空工
    1.IDEA的安装及配置1.1IDEA的安装具体操作,详见《04、IDEA安装详解.pdf》1.2IDEA主题配置、字体配置1.3IDEA常用快捷键1.4IDEA修改快捷键在IDEA工具中,Ctrl+空格的快捷键,可以帮助我们补全代码,但是这个快捷键和Windows中的输入法切换快捷键冲突,需要修改IDEA中......
  • day01-03_我的Java学习笔记(Java基础语法--注释、字面量、变量、二进制、ASCII编码、
    1.Java基础语法1.1注释1.2字面量(Python中叫数据类型)1.3变量1.3.1变量的定义及使用1.3.2变量使用注意事项1.4数据的存储形式:二进制字节、字、bit、byte的关系:字word字节byte位bit,来自英文bit,音译为“比特”,表示二进制位。字长是指字的......
  • Rust 01
    //https://kaisery.github.io/trpl-zh-cn/ch03-02-data-types.htmlfnmain(){println!("Hello,world!");//标量(scalar)类型代表一个单独的值。Rust有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。//你可能在其他语言中见过它们。让我们深入了解它们在......
  • jangow01
    虚拟机配置将攻击机和靶机放在同一网段下即可web渗透IP扫描nmap-sP192.168.11.0/24详细扫描nmap-A192.168.11.42探测web网站发现一可执行命令的地方,写入一句话木马,用蚁剑链接链接成功用蚁剑写文件,反弹链接,注意只有443端口出网web网站访问该文件攻击机监听......
  • 1014 福尔摩斯的约会
    我感觉是这题出的有问题,第二个只说了字母,并没有说第二个大写字母...为啥就得从第一个大写字母后面开始检索呢。#include<bits/stdc++.h>usingnamespacestd;map<int,string>mp={{1,"MON"},{2,"TUE"},{3,"WED"},{4,"THU"},{5,"FRI"},{6,"SAT"}......
  • games101_Homework7
    实现完整的PathTracing算法需要修改这一个函数:•castRay(constRayray,intdepth)inScene.cpp:在其中实现PathTracing算法//ImplementationofPathTracingVector3fScene::castRay(constRay&ray,intdepth)const{//TODOImplementPathTracing......
  • games101_Homework6
    实现Ray-BoundingVolume求交与BVH查找在本次编程练习中,你需要实现以下函数:•IntersectP(constRay&ray,constVector3f&invDir,conststd::array<int,3="">&dirIsNeg)intheBounds3.hpp:这个函数的作用是判断包围盒BoundingBox与光线是否相交,你需要按照课程介......
  • 初中中考英语词汇大全001掌握常用词汇,轻松应对考试
    初中中考英语词汇大全001掌握常用词汇,轻松应对考试PDF格式公众号回复关键字:ZKCH0011advertisements广告2Accordingtotheadvertisements根据广告3EXCEPT除了,在选项中经常出现,要注意不要意思理解反了4Thetextaboveiswrittento上述文本是写给,这种题是根据......
  • 1013 数素数
    #include<bits/stdc++.h>usingnamespacestd;boolisPrime(intx){ if(x==1)returnfalse; for(inti=2;i<=sqrt(x);i++){ if(x%i==0)returnfalse; } returntrue;}intmain(){ inta,b; cin>>a>>b; //第5个素数和第27个素数 intcount=0; ......