【JavaWeb】Tomcat底层机制和Servlet运行原理

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

🎄欢迎来到@dandelionl_的csdn博文,本文主要讲解Java web中Tomcat底层机制和Servlet的运行原理的相关知识🎄


🌈我是dandelionl_,一个正在为秋招和算法竞赛做准备的学生🌈
🎆喜欢的朋友可以关注一下,下次更新不迷路🎆

 Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大)🌑🌒🌓🌔🌕  

一. 一图明理

【JavaWeb】Tomcat底层机制和Servlet运行原理,Java,tomcat,servlet,java


 二. 概念

Tomcat是一个开源的Java Web服务器,它是基于Java Servlet和JavaServer Pages(JSP)技术的。下面是关于Tomcat底层机制和Servlet运行原理的简要说明:

  1. Tomcat底层机制:

    • 网络通信:Tomcat使用Java的Socket API来监听特定的端口(通常是8080),接收来自客户端的HTTP请求。
    • 线程池:Tomcat使用线程池来处理并发的请求当有新的请求到达时,Tomcat会从线程池中获取一个空闲线程来处理该请求,这样可以提高处理效率。
    • 生命周期管理:Tomcat负责管理Servlet和其他Web组件的生命周期,包括初始化、请求处理和销毁等阶段。(init(), run())
    • 请求处理管道:Tomcat通过请求处理管道来处理HTTP请求。请求经过一系列的处理器,如身份验证、日志记录和安全检查等,最终被交给适当的Servlet进行处理。(handle())
    • 连接池:Tomcat使用连接池来管理与数据库的连接。这样可以提高性能,并避免频繁地创建和销毁数据库连接。(handle())
  2. Servlet运行原理:

    • Servlet容器:Tomcat是一个Servlet容器它负责加载、初始化和管理Servlet。当Tomcat启动时,它会读取配置文件(如web.xml)来确定需要加载的Servlet类
    • 生命周期:每个Servlet都有自己的生命周期,包括初始化、请求处理和销毁等阶段。Tomcat会在适当的时间调用Servlet的生命周期方法(如init()、service()和destroy())。
    • 请求处理:当Tomcat接收到HTTP请求时,它会根据请求的URL找到对应的Servlet并将请求转发给该Servlet进行处理Servlet通过HttpServletRequest对象获取请求的信息,并通过HttpServletResponse对象发送响应给客户端
    • 多线程处理:Tomcat使用多线程来处理并发请求每个请求都被分配给一个独立的线程进行处理,这样可以同时处理多个请求,提高服务器的性能

三. 容器的理解 

在tomcat底层实现中, servlet作为容器, 实现可以理解为HashMap, 键是servlet-name值是servlet-class, 而HashMap就是一个容器, 从容器中得到一个servlet实例, 对其进行初始化, 供web使用, 调用其中的service()方法, service()方法对HTTP请求的method进行判断, 对每个相应的method都有相应的do方法, 可以使用.


四. 案例

【JavaWeb】Tomcat底层机制和Servlet运行原理,Java,tomcat,servlet,java

【JavaWeb】Tomcat底层机制和Servlet运行原理,Java,tomcat,servlet,java

不用tomcat以及servlet实现

五. 代码分析和代码实现

【JavaWeb】Tomcat底层机制和Servlet运行原理,Java,tomcat,servlet,java

 文章来源地址https://www.toymoban.com/news/detail-603053.html

【JavaWeb】Tomcat底层机制和Servlet运行原理,Java,tomcat,servlet,java

 

 

LxbRequestHandle类

package com.lxb.tomcat.handle;
//-*- code = utf-8 -*-
//@Time : 2023-07-20 13:22:00
//@Authors : 罗雄波
//@File : LxbRequestHandle.java
//@Software : IntelliJ IDEA

import com.lxb.tomcat.LxbTomcatV3;
import com.lxb.tomcat.http.LxbHttpRequest;
import com.lxb.tomcat.http.LxbHttpResponse;
import com.lxb.tomcat.servlet.LxbHttpServlet;
import com.lxb.tomcat.utils.WebUtils;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class LxbRequestHandle implements Runnable{
    private Socket accept;

    public LxbRequestHandle(Socket socket) {
        this.accept = socket;
    }

    public void run() {
        try {
            LxbHttpRequest request = new LxbHttpRequest(accept);
            LxbHttpResponse response = new LxbHttpResponse(accept.getOutputStream());

            String uri = request.getUri();
            if(WebUtils.isHtml(uri)) {
                System.out.println(uri.substring(1));
                String resp = WebUtils.readFile(uri.substring(1));
                String responseInfo = LxbHttpResponse.respHeader + resp;

                OutputStream outputStream = response.getOutputStream();
                outputStream.write(responseInfo.getBytes());

                outputStream.flush();
                outputStream.close();
                accept.close();
                return;
            }


            String servletName = LxbTomcatV3.servletMapping.get(uri);
            if(servletName == null) {
                servletName = "";
            }

            LxbHttpServlet servlet = LxbTomcatV3.servlet.get(servletName);

            if(servlet != null) {
                servlet.service(request, response);
            } else {
                String resp = LxbHttpResponse.respHeader + "<h1>404 not found!!!</h>";
                OutputStream responseOutputStream = response.getOutputStream();
                responseOutputStream.write(resp.getBytes());
                responseOutputStream.flush();
                responseOutputStream.close();
            }

            accept.close();

        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            if (accept != null) {
                try {
                    accept.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

LxbHttpRequest和LxbHttpResponse

package com.lxb.tomcat.http;
//-*- code = utf-8 -*-
//@Time : 2023-07-20 14:59:24
//@Authors : 罗雄波
//@File : LxbHttpRequest.java
//@Software : IntelliJ IDEA


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.HashMap;

public class LxbHttpRequest {
    private Socket socket;
    private String method;
    private String uri;
    private HashMap<String, String> parameterMapping = new HashMap<String, String>();

    public LxbHttpRequest(Socket socket) {
        this.socket = socket;
        try {
            ParseProcess();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public void ParseProcess() throws Exception {
        BufferedReader reader =
                new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));

        String temp;

        temp = reader.readLine();

//        GET /cal.html HTTP/1.1
        String[] request = temp.split(" ");
        method = request[0];
        int index = request[1].indexOf("?");

        if (index == -1) {
            uri = request[1];
        } else {
            uri = request[1].substring(0, index);

            String parameterPair = request[1].substring(index + 1);
            String[] parameters = parameterPair.split("&");

            if (parameters[0] != null && !parameters[0].equals("")) {
                for (String parameter : parameters) {
                    String[] split = parameter.split("=");

                    if(split.length == 2) {
                        parameterMapping.put(split[0], split[1]);
                    }
                }
            }
        }
    }

    public String getMethod() {
        return method;
    }

    public String getUri() {
        return uri;
    }

    public String getParameter(String key) {
        if(parameterMapping.get(key) != null) {
            return parameterMapping.get(key);
        } else {
            return "";
        }
    }

    @Override
    public String toString() {
        return "LxbHttpRequest" +
                "{ method = " + method +
                ", uri = " +  uri +
                ", parameter = " + parameterMapping +
                "}";
    }
}
package com.lxb.tomcat.http;
//-*- code = utf-8 -*-
//@Time : 2023-07-20 15:49:29
//@Authors : 罗雄波
//@File : LxbHttpResponse.java
//@Software : IntelliJ IDEA

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class LxbHttpResponse {
    private OutputStream outputStream = null;
    public static final String respHeader = "HTTP/1.1 200 OK\r\n" +
            "Content-Type: text/html;charset=utf-8\r\n\r\n";
    public LxbHttpResponse(OutputStream outputStream) {
        this.outputStream = outputStream;
    }

    public OutputStream getOutputStream() {
        return outputStream;
    }
}

LxbTomcat

package com.lxb.tomcat;
//-*- code = utf-8 -*-
//@Time : 2023-07-20 15:37:29
//@Authors : 罗雄波
//@File : LxbTomcatV3.java
//@Software : IntelliJ IDEA

import com.lxb.tomcat.handle.LxbRequestHandle;
import com.lxb.tomcat.servlet.LxbHttpServlet;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

public class LxbTomcatV3 {
    public static ConcurrentHashMap<String, LxbHttpServlet> servlet =
            new ConcurrentHashMap<String, LxbHttpServlet>();

    public static ConcurrentHashMap<String, String> servletMapping =
            new ConcurrentHashMap<String, String>();

    public static void main(String[] args) throws Exception {
        LxbTomcatV3 lxbTomcatV3 = new LxbTomcatV3();
        lxbTomcatV3.Init();
        lxbTomcatV3.run();
    }

    public void run() {
        try {
            ServerSocket socket = new ServerSocket(8080);
            while (!socket.isClosed()) {
                Socket accept = socket.accept();

                LxbRequestHandle requestHandle = new LxbRequestHandle(accept);

                new Thread(requestHandle).start();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Test
    public void Init() {
        String path = LxbTomcatV3.class.getResource("/").getPath();
//        System.out.println(path);
//   该类的路径 /D:/NewExecllction/exicese%20code/lxb-tomcat/target/classes/com/lxb/tomcat/
//   根路径    /D:/NewExecllction/exicese%20code/lxb-tomcat/target/classes/
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read(new File(path + "web.xml"));
//            System.out.println(document);

            Element rootElement = document.getRootElement();
            List<Element> elements = rootElement.elements();
            for (Element element : elements) {
                if ("servlet".equalsIgnoreCase(element.getName())) {
                    Element servletName = element.element("servlet-name");
                    Element servletClass = element.element("servlet-class");
                    servlet.put(servletName.getText(), (LxbHttpServlet) Class.forName(servletClass.getText().trim()).newInstance());
                } else if ("servlet-mapping".equalsIgnoreCase(element.getName())) {
                    Element servletName = element.element("servlet-name");
                    Element servletUrl = element.element("url-pattern");
                    servletMapping.put(servletUrl.getText(), servletName.getText());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println(servlet);
        System.out.println(servletMapping);
    }

    @Test
    public void test() {
        String path = LxbTomcatV3.class.getResource("/").getPath();
        System.out.println(path + "web.xml");
    }
}

WebUtils

package com.lxb.tomcat.utils;
//-*- code = utf-8 -*-
//@Time : 2023-07-19 16:00:33
//@Authors : 罗雄波
//@File : WebUtils.java
//@Software : IntelliJ IDEA

import org.junit.Test;

import java.io.*;

public class WebUtils {
    public static int parseInt(String strNum, int defaultVal) {
        try {
            return Integer.parseInt(strNum);
        } catch (NumberFormatException e) {
            System.out.println(strNum + "数字格式异常, 无法包装");
        }
        return defaultVal;
    }

    public static boolean isHtml(String uri) {
        return uri.endsWith(".html");
    }

    public static String readFile(String filename) {
        String path = com.lxb.tomcat.utils.WebUtils.class.getResource("/").getPath();
        StringBuilder stringBuffer = new StringBuilder();

        try {
            System.out.println(path + filename);
            BufferedReader bufferedReader = new BufferedReader(new FileReader(path + filename));
            String buffer = null;
            while ((buffer = bufferedReader.readLine()) != null && !buffer.equals("")) {
                stringBuffer.append(buffer);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return stringBuffer.toString();
    }
}

LxbCalServlet

package com.lxb.tomcat.servlet;
//-*- code = utf-8 -*-
//@Time : 2023-07-20 16:14:24
//@Authors : 罗雄波
//@File : LxbCalServlet.java
//@Software : IntelliJ IDEA

import com.lxb.tomcat.http.LxbHttpRequest;
import com.lxb.tomcat.http.LxbHttpResponse;
import com.lxb.tomcat.utils.WebUtils;

import java.io.IOException;
import java.io.OutputStream;

public class LxbCalServlet extends LxbHttpServlet {
    @Override
    public void doGet(LxbHttpRequest request, LxbHttpResponse response) {
        doPost(request, response);
    }

    @Override
    public void doPost(LxbHttpRequest request, LxbHttpResponse response) {
        int num1 = WebUtils.parseInt(request.getParameter("num1"), 0);
        int num2 = WebUtils.parseInt(request.getParameter("num2"), 0);

        int result = num1 + num2;

        OutputStream outputStream = response.getOutputStream();

        String resp = LxbHttpResponse.respHeader + "<h1>求和: " + num1 + "+" + num2 + " = " + result + "</h>";

        try {
            outputStream.write(resp.getBytes());
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public void init() throws Exception {

    }

    public void destroy() {

    }
}

LxbServlet

package com.lxb.tomcat.servlet;
//-*- code = utf-8 -*-
//@Time : 2023-07-20 16:09:43
//@Authors : 罗雄波
//@File : LxbServlet.java
//@Software : IntelliJ IDEA

import com.lxb.tomcat.http.LxbHttpRequest;
import com.lxb.tomcat.http.LxbHttpResponse;

import java.io.IOException;

public interface LxbServlet {
    void init() throws Exception;

    void service(LxbHttpRequest request, LxbHttpResponse response) throws IOException;

    void destroy();
}

LxbHttpServlet

package com.lxb.tomcat.servlet;
//-*- code = utf-8 -*-
//@Time : 2023-07-20 16:11:02
//@Authors : 罗雄波
//@File : lxbHttpServlet.java
//@Software : IntelliJ IDEA

import com.lxb.tomcat.http.LxbHttpRequest;
import com.lxb.tomcat.http.LxbHttpResponse;

import java.io.IOException;

public abstract class LxbHttpServlet implements LxbServlet{
    public void service(LxbHttpRequest request, LxbHttpResponse response) throws IOException {
        if(request.getMethod().equals("GET")) {
            this.doGet(request, response);
        } else if(request.getMethod().equals("POST")) {
            this.doPost(request, response);
        }
    }

    public void doGet(LxbHttpRequest request, LxbHttpResponse response) {

    }
    public void doPost(LxbHttpRequest request, LxbHttpResponse response) {

    }
}

 六. 注意

【JavaWeb】Tomcat底层机制和Servlet运行原理,Java,tomcat,servlet,java

 

到了这里,关于【JavaWeb】Tomcat底层机制和Servlet运行原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • javaweb学习笔记——Tomcat&Servlet

    web相关概念回顾 web服务器软件:Tomcat Servlet入门学习 1、软件架构 C/S:客户端/服务器端 B/S:浏览器/服务器端 2、资源分类 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源,静态资源可以直接被浏览器解析;如html,css,JavaScript 动态资源:每个用户访问相

    2024年02月07日
    浏览(34)
  • JavaWeb《后端内容:1. Tomcat - Servlet - Thymeleaf》

    目录 1. 基础概念 1.1 BS架构和CS架构 1.2 Tomcat图解 2.TomCat 2.1 IDEA配置web项目和tomcat 2.2 idea启动TomCat因为端口号失败的问题 3.Servlet使用流程 3.1 Servlet简单图解 3.2 Servlet导入依赖  3.3 编写Servlet和add.html 3.4 试着使用Jdbc和Dao层连接水果库存数据库 0. 基础结构的代码 1. 数据库表创建

    2024年02月03日
    浏览(33)
  • 2023-JavaWeb最新整理面试题-TCP、Tomcat、Servlet、JSP等

    1、1xx(临时响应) 2、2xx(成功) 3、3xx(重定向):表示要完成请求需要进一步操作 4、4xx(错误):表示请求可能出错,妨碍了服务器的处理 5、5xx(服务器错误):表示服务器在尝试处理请求时发生内部错误 举例: 200:成功,Web服务器成功处理了客户端的请求。 301:永

    2024年02月16日
    浏览(39)
  • 【Servlet学习二】Servlet原理(Tomcat)&& ServletAPI

    目录 🌟一、Servlet运行原理 🌈1、Servlet的执行原理(重点) 🌈2、Tomcat伪代码的简单理解 2.1  Tomcat初始化流程 2.2  Tomcat处理请求流程 2.3 Servlet 的 service 方法的实现 🌟二、Servlet API 详解 1、HttpServlet 2、HttpServletRequest 3、HttpServletResponse 面试题:请求转发与请求重定向的区别?

    2024年02月12日
    浏览(28)
  • SpringBoot 底层机制分析【Tomcat 启动+Spring 容器初始化+Tomcat 如何关联Spring 容器】【下】

    😀前言 本篇博文是关于SpringBoot 底层机制分析实现,希望能够帮助你更好的了解SpringBoot 😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客

    2024年02月13日
    浏览(34)
  • 一个简单的前后端交互——登录注册页面(升级版)idea代码篇(2:Maven:Javaweb项目)使用MyBatis:Mapper,servlet+Tomcat

    前言:本篇前后端交互实现代码 。详细项目搭建见上篇 先贴一张登录界面和包结构:   1.Mapper 2.pojo 3.util 4.web 5.Login.html 6.CSS 我的企业版过期了,不能演示跳转页面了。但测过没问题。

    2024年02月11日
    浏览(42)
  • java-初识Servlet,Tomcat,JDBC

    java入门须知的重要概念/名词/技术 等 Servlet是Java Web开发中的一个核心组件,它是 基于Java语言编写的服务器端程序,可以接收Web容器(如Tomcat)发送过来的HTTP请求 ,并向客户端发送HTTP响应。Servlet通常用来处理动态Web页面、Web表单数据、管理会话(session)等任务。 实际上,

    2024年02月11日
    浏览(29)
  • 用Eclipse创建一个JavaWeb项目,把资源添加到Tomcat服务器,并运行jsp文件详细过程(附图片)

    目录 前言 一、Eclipse下载安装 二、创建 1.创建web项目 2.创建jsp文件  三.设置Tomcat 四.解决问题  五、添加资源到tomcat服务器   六.运行 总结 使用Eclipse创建web项目时,务必先下载安装好JDK和Tomcat。 1、Eclipse J2EE: https://www.eclipse.org/downloads/  2、选择Eclipse IDE for Enterprise Java an

    2024年02月13日
    浏览(40)
  • 尚硅谷JavaWeb电子书城项目(Java+Mysql+Tomcat+Jsp)

    自己写的在线电子书城项目,可改写,添加功能,如打折,分类,用户管理,评论等功能。 使用方法: 1.使用idea导入项目。 2.数据库要用项目resource文件里的book.sql文件建立。 3.修改jdbc.properites中的数据库信息。 4.使用maven加载pom.xml中的依赖。 5.配置好tomcat容器,运行项目。

    2024年02月04日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包