Tomcat 的伪代码

这篇具有很好参考价值的文章主要介绍了Tomcat 的伪代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1) Tomcat 初始化流程

class Tomcat {
    // 用来存储所有的 Servlet 对象
 private List<Servlet> instanceList = new ArrayList<>();
 public void start() {
       // 根据约定,读取 WEB-INF/web.xml 配置文件;
        // 并解析被 @WebServlet 注解修饰的类
       
        // 假定这个数组里就包含了我们解析到的所有被 @WebServlet 注解修饰的类. 
        Class<Servlet>[] allServletClasses = ...;
        
        // 这里要做的的是实例化出所有的 Servlet 对象出来;
        for (Class<Servlet> cls : allServletClasses) {
            // 这里是利用 java 中的反射特性做的
            // 实际上还得涉及一个类的加载问题,因为我们的类字节码文件,是按照约定的
            // 方式(全部在 WEB-INF/classes 文件夹下)存放的,所以 tomcat 内部是
            // 实现了一个自定义的类加载器(ClassLoader)用来负责这部分工作。
            
            Servlet ins = cls.newInstance();
            instanceList.add(ins);
       }
        
        // 调用每个 Servlet 对象的 init() 方法,这个方法在对象的生命中只会被调用这一次;
        for (Servlet ins : instanceList) {
            ins.init();
       }
        
        // 启动一个 HTTP 服务器
        // 并用线程池的方式分别处理每一个 Request
        ServerSocket serverSocket = new ServerSocket(8080);
        // 实际上 tomcat 不是用的固定线程池,这里只是为了说明情况
        ExecuteService pool = Executors.newFixedThreadPool(100);
        
        while (true) {
            Socket socket = ServerSocket.accept();
            // 每个请求都是用一个线程独立支持,这里体现了我们 Servlet 是运行在多线程环境下的
            pool.execute(new Runnable() {
               doHttpRequest(socket); 
           });
       }
        // 调用每个 Servlet 对象的 destroy() 方法,这个方法在对象的生命中只会被调用这一次;
        for (Servlet ins : instanceList) {
            ins.destroy();
       }
   }
    
    public static void main(String[] args) {
        new Tomcat().start();
   }
}

步骤:

  1. main()调用start()方法
  2. 解析所有被 @WebServlet 注解修饰的类,放到一个数组中
  3. 用一个ArrayList存储 Servlet 对象,利用反射机制实例化所有解析出来的类中(数组中)的servlet对象,并保存到ArrayList中
  4. 把每个 servlet 对象初始化(调用inti()方法)
  5. 启动一个 HTTP 服务器(new ServerSocket(8080))
  6. 创建一个线程池,然后接受请求并执行(while(ture))
  7. 最后,将每个 servlet 对象销毁(调用destroy() 方法)

**小结 **文章来源地址https://www.toymoban.com/news/detail-676393.html

  • Tomcat 的代码中内置了 main 方法. 当我们启动 Tomcat 的时候, 就是从 Tomcat 的 main 方法开始执行的.
  • 被 @WebServlet 注解修饰的类会在 Tomcat 启动的时候就被获取到, 并集中管理.
  • Tomcat 通过 **反射 **这样的语法机制来创建被 @WebServlet 注解修饰的类的实例. 这些实例被创建完了之后, 会点调用其中的 init 方法进行初始化. (这个方法是 HttpServlet 自带的, 我们自己写的类可以重写 init)
  • 这些实例被销毁之前, 会调用其中的 destory 方法进行收尾工作. (这个方法是 HttpServlet 自带的, 我们自己写的类可以重写 destory)
  • Tomcat 内部也是通过 Socket API 进行网络通信.
  • Tomcat 为了能同时相应多个 HTTP 请求, 采取了多线程的方式实现. 因此 Servlet 是运行在 **多线程环境 **下的.

2) Tomcat 处理请求流程(doHttpRequest)

class Tomcat {
    void doHttpRequest(Socket socket) {
        // HTTP 服务器类似的原理,进行 HTTP 协议的请求解析,和响应构建
        HttpServletRequest req = HttpServletRequest.parse(socket);
        HttpServletRequest resp = HttpServletRequest.build(socket);
        
        // 判断 URL 对应的文件是否可以直接在我们的根路径上找到对应的文件,如果找到,就是静态
内容
        // 直接使用我们学习过的 IO 进行内容输出
        if (file.exists()) {
            // 返回静态内容
            return;
       }
        
        // 走到这里的逻辑都是动态内容了
        
        // 根据配置,按照 URL -> servlet-name -> Servlet 对象的链条
        // 最终找到要处理本次请求的 Servlet 对象
        Servlet ins = findInstance(req.getURL());
        
        // 调用 Servlet 对象的 service 方法
        // 这里就会最终调用到我们自己写的 HttpServlet 的子类里的方法了
        try {
       ins.service(req, resp); 
       } catch (Exception e) {
            // 返回 500 页面,表示服务器内部错误
       }
   }
}

步骤:

  1. 进行 HTTP 协议的请求解析,和响应构建
  2. 判断是不是静态内容(file.exists()),如果是直接找到对应的文件把文件的内容通过 Socket 返回;不是继续
  3. 找到要处理本次请求的 Servlet 对象(URL -> servlet-name -> Servlet 对象)
  4. 调用 Servlet 对象的 service 方法,最终调用到我们自己写的 HttpServlet 的子类里的方法(异常返回 500 页面,表示服务器内部错误)

**小结 **

  • Tomcat 从 Socket 中读到的 HTTP 请求是一个字符串, 然后会按照 HTTP 协议的格式解析成一个 HttpServletRequest 对象.
  • Tomcat 会根据 URL 中的 path 判定这个请求是请求一个静态资源还是动态资源. 如果是静态资源, 直接找到对应的文件把文件的内容通过 Socket 返回. 如果是动态资源, 才会执行到 Servlet 的相关逻辑.
  • Tomcat 会根据 URL 中的 Context Path 和 Servlet Path 确定要调用哪个 Servlet 实例的 service 方法.
  • 通过 service 方法, 就会进一步调用到我们之前写的 doGet 或者 doPost

3) Servlet 的 service 方法的实现

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if (ifModifiedSince < lastModified) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }
  • Servlet 的 service 方法内部会根据当前请求的方法, 决定调用其中的某个 doXXX 方法.
  • 在调用 doXXX 方法的时候, 就会触发 **多态 **机制, 从而执行到我们自己写的子类中的 doXXX 方法.

到了这里,关于Tomcat 的伪代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JavaEE】Tomcat-Servelet第一个helloworld程序

    Tomcat Servelet第一个程序helloworld! HTTP本质上就是一个TCP服务器(HTTP基于TCP) 这个服务器按照HTTP协议的约定,解析请求,构造响应 你自己写一个HTTP服务器,也完全没问题! 不过我们Java圈子和生态中,有一个现成的,最流行的,apache社区开源的http服务器 = = =》 Tomcat 直接去官

    2024年02月09日
    浏览(37)
  • Tomcat和Servlet基础知识的讲解(JavaEE初阶系列16)

    目录 前言: 1.Tomcat 1.1Tomcat是什么 1.2下载安装 2.Servlet 2.1什么是Servlet 2.2使用Servlet来编写一个“hello world” 1.2.1创建项目(Maven) 1.2.2引入依赖(Servlet) 1.2.3创建目录(webapp) 1.2.4编写代码(HelloServlet) 1.2.5打包(war) 1.2.6部署(拷贝war到webapps目录中) 1.2.7验证(浏览器发一

    2024年02月11日
    浏览(46)
  • JavaEE简单示例——在使用Tomcat的时候可能出现的一些报错

    在我们之前使用Tomcat的时候,经常会出现在启动的时候因为一些报错导致项目无法正常的启动,我们就对一些比较常见的报错来看一下可能导致的原因,以及出现报错之后如何去解决。 这个报错非常的明显,就是: Address already in use:这句话表示我们启动服务的端口被占

    2024年02月15日
    浏览(34)
  • 【JavaEE】Tomcat的安装和使用、创建Mevan项目使用Servlet写一个程序

    目录 前言 一、Tomcat的下载和安装 二、写一个简单的Servlet项目 1、创建一个Maven项目 2、引入依赖  3、创建目录   4、编写Servlet代码。 5、打包程序 6、将程序部署到Tomcat上 7、验证程序运行结果  三、在IDEA上安装Smart Tomcat插件 四、Servlet中的一些常见错误 我我们制作一个网站

    2024年02月17日
    浏览(48)
  • TOMCAT部署及优化(Tomcat配置文件参数优化,Java虚拟机(JVM)调优)

    TOMCAT tomcat :是一个开放源代码的web应用服务器,基于java代码开发的。也可以理解为tomacat就是处理动态请求和基于java代码的页面开发。可以在html当中写入java代码,tomcat可以解析html页面当中的java,执行动态请求,动态页面。 tomcat是机制存在一些问题,如果不对tomcat进行优化

    2024年02月13日
    浏览(34)
  • Tomcat:Java Web

    简介 Apache Tomcat 是 Java Web 应用程序开发中最为常用的服务器之一。作为一个开源、轻量级的 Servlet 容器和 JSP 容器,Tomcat 提供了一个稳定可靠的运行环境,使得开发者可以快速开发、部署和管理 Java Web 应用程序。本文将深入介绍 Tomcat 的特点、优势、安装、配置和基本用法,

    2024年03月23日
    浏览(47)
  • JAVA配置tomcat

    IDEA新建module的时候没有javaee的选项,这时候可以先选择普通的java项目进行创建。 图片中的a就是新建的java module。 右键a文件夹,选择Add Framework Support。 然后选中Web Application,点击右下角的ok即可。 a文件夹下出现带小蓝的web就说明成功了。 关联相关包 将jar包拷到libs文件夹下

    2023年04月08日
    浏览(40)
  • java:Tomcat

    在讲 Tomcat 是啥之前,我们先来了解一些概念。 服务器 可以理解为一个高性能的电脑,但是这个电脑现在什么软件都没有安装。 web 服务器 给这个服务器安装一些服务器软件,如 nginx、Apache、Tomcat 等。这台服务器就可以帮我们接收用户的请求,处理请求,做出响应。 Tomcat

    2024年02月11日
    浏览(39)
  • Java——《面试题——tomcat篇》

    全文章节 Java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java——《面试题——Dob

    2024年02月12日
    浏览(36)
  • tomcat(跟着宝哥学java:tomcat)tomcat安装 发布项目 配置eclipse http协议详解、get请求、post请求、url详解

    在%CATALINA_HOME%webapps下创建一个文件夹:hehe 在hehe中创建子文件夹:WEB-INF和资源文件夹(html/jsp/css/imgs/js) 在WEB-INF中创建子文件夹classes::存储java源文件生成的字节码文件 在WEB-INF中创建子文件夹lib::存储项目以来的jar 在WEB-INF中创建子web项目的核心配置文件:web.xml web

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包