最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaWeb中Tomcat底層機(jī)制和Servlet運(yùn)行原理詳解

 更新時(shí)間:2023年10月17日 09:55:08   作者:邊境矢夢(mèng)°  
這篇文章主要介紹了JavaWeb中Tomcat底層機(jī)制和Servlet運(yùn)行原理詳解,Tomcat是一個(gè)開(kāi)源的Java Web服務(wù)器,它是基于Java Servlet和JavaServer Pages(JSP)技術(shù)的,下面是關(guān)于Tomcat底層機(jī)制和Servlet運(yùn)行原理的簡(jiǎn)要說(shuō)明,需要的朋友可以參考下

一. 一圖明理

二. 概念

Tomcat是一個(gè)開(kāi)源的Java Web服務(wù)器,它是基于Java Servlet和JavaServer Pages(JSP)技術(shù)的。下面是關(guān)于Tomcat底層機(jī)制和Servlet運(yùn)行原理的簡(jiǎn)要說(shuō)明:

  • Tomcat底層機(jī)制:
    • 網(wǎng)絡(luò)通信:Tomcat使用Java的Socket API來(lái)監(jiān)聽(tīng)特定的端口(通常是8080),接收來(lái)自客戶端的HTTP請(qǐng)求。
    • 線程池:Tomcat使用線程池來(lái)處理并發(fā)的請(qǐng)求。當(dāng)有新的請(qǐng)求到達(dá)時(shí),Tomcat會(huì)從線程池中獲取一個(gè)空閑線程來(lái)處理該請(qǐng)求,這樣可以提高處理效率。
    • 生命周期管理:Tomcat負(fù)責(zé)管理Servlet和其他Web組件的生命周期,包括初始化、請(qǐng)求處理和銷毀等階段。(init(), run())
    • 請(qǐng)求處理管道:Tomcat通過(guò)請(qǐng)求處理管道來(lái)處理HTTP請(qǐng)求。請(qǐng)求經(jīng)過(guò)一系列的處理器,如身份驗(yàn)證、日志記錄和安全檢查等,最終被交給適當(dāng)?shù)腟ervlet進(jìn)行處理。(handle())
    • 連接池:Tomcat使用連接池來(lái)管理與數(shù)據(jù)庫(kù)的連接。這樣可以提高性能,并避免頻繁地創(chuàng)建和銷毀數(shù)據(jù)庫(kù)連接。(handle())
  • Servlet運(yùn)行原理:
    • Servlet容器:Tomcat是一個(gè)Servlet容器,它負(fù)責(zé)加載、初始化和管理Servlet。當(dāng)Tomcat啟動(dòng)時(shí),它會(huì)讀取配置文件(如web.xml)來(lái)確定需要加載的Servlet類。
    • 生命周期:每個(gè)Servlet都有自己的生命周期,包括初始化、請(qǐng)求處理和銷毀等階段。Tomcat會(huì)在適當(dāng)?shù)臅r(shí)間調(diào)用Servlet的生命周期方法(如init()、service()和destroy())。
    • 請(qǐng)求處理:當(dāng)Tomcat接收到HTTP請(qǐng)求時(shí),它會(huì)根據(jù)請(qǐng)求的URL找到對(duì)應(yīng)的Servlet,并將請(qǐng)求轉(zhuǎn)發(fā)給該Servlet進(jìn)行處理。Servlet通過(guò)HttpServletRequest對(duì)象獲取請(qǐng)求的信息,并通過(guò)HttpServletResponse對(duì)象發(fā)送響應(yīng)給客戶端。
    • 多線程處理:Tomcat使用多線程來(lái)處理并發(fā)請(qǐng)求。每個(gè)請(qǐng)求都被分配給一個(gè)獨(dú)立的線程進(jìn)行處理,這樣可以同時(shí)處理多個(gè)請(qǐng)求,提高服務(wù)器的性能。

三. 容器的理解

在tomcat底層實(shí)現(xiàn)中, servlet作為容器, 實(shí)現(xiàn)可以理解為HashMap, 鍵是servlet-name值是servlet-class, 而HashMap就是一個(gè)容器, 從容器中得到一個(gè)servlet實(shí)例, 對(duì)其進(jìn)行初始化, 供web使用, 調(diào)用其中的service()方法, service()方法對(duì)HTTP請(qǐng)求的method進(jìn)行判斷, 對(duì)每個(gè)相應(yīng)的method都有相應(yīng)的do方法, 可以使用.

四. 案例

不用tomcat以及servlet實(shí)現(xiàn)

五. 代碼分析和代碼實(shí)現(xiàn)

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 + "數(shù)字格式異常, 無(wú)法包裝");
        }
        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) {
 
    }
}

六. 注意

到此這篇關(guān)于JavaWeb中Tomcat底層機(jī)制和Servlet運(yùn)行原理詳解的文章就介紹到這了,更多相關(guān)Tomcat底層機(jī)制和Servlet運(yùn)行原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis配置文件中最常用的設(shè)置

    MyBatis配置文件中最常用的設(shè)置

    文章主要介紹了MyBatis配置的優(yōu)化方法,包括引用外部的properties配置文件、配置外置以實(shí)現(xiàn)環(huán)境解耦、配置文件中最常用的6個(gè)核心設(shè)置以及三種常用的Mapper注冊(cè)方式,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Python如何使用@property @x.setter及@x.deleter

    Python如何使用@property @x.setter及@x.deleter

    這篇文章主要介紹了Python如何使用@property @x.setter及@x.deleter,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 詳解springboot WebTestClient的使用

    詳解springboot WebTestClient的使用

    WebClient是一個(gè)響應(yīng)式客戶端,它提供了RestTemplate的替代方法。這篇文章主要介紹了詳解springboot WebTestClient的使用, 具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 你應(yīng)該知道的21個(gè)Java核心技術(shù)

    你應(yīng)該知道的21個(gè)Java核心技術(shù)

    Java的21個(gè)核心技術(shù)點(diǎn),你知道嗎?這篇文章主要為大家詳細(xì)介紹了Java核心技術(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java 異常的知識(shí)整理

    Java 異常的知識(shí)整理

    這篇文章主要介紹了Java 異常的知識(shí)整理的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 關(guān)于spring中aop的注解實(shí)現(xiàn)方法實(shí)例詳解

    關(guān)于spring中aop的注解實(shí)現(xiàn)方法實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于spring中aop的注解實(shí)現(xiàn)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起看看吧。
    2017-08-08
  • 解決idea打包成功但是resource下的文件沒(méi)有成功的問(wèn)題

    解決idea打包成功但是resource下的文件沒(méi)有成功的問(wèn)題

    這篇文章主要介紹了解決idea打包成功但是resource下的文件沒(méi)有成功的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Spring Boot使用GridFS實(shí)現(xiàn)文件的上傳和下載方式

    Spring Boot使用GridFS實(shí)現(xiàn)文件的上傳和下載方式

    這篇文章主要介紹了Spring Boot使用GridFS實(shí)現(xiàn)文件的上傳和下載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java身份證驗(yàn)證代碼實(shí)現(xiàn)

    java身份證驗(yàn)證代碼實(shí)現(xiàn)

    java身份證驗(yàn)證代碼實(shí)現(xiàn),需要的朋友可以參考一下
    2013-02-02
  • Spring Cloud Gateway 默認(rèn)的filter功能和執(zhí)行順序介紹

    Spring Cloud Gateway 默認(rèn)的filter功能和執(zhí)行順序介紹

    這篇文章主要介紹了Spring Cloud Gateway 默認(rèn)的filter功能和執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

清苑县| 沾益县| 轮台县| 绥中县| 京山县| 广汉市| 广平县| 神农架林区| 历史| 平南县| 益阳市| 张家口市| 元江| 鲁甸县| 青海省| 新干县| 林州市| 中超| 息烽县| 镇康县| 丘北县| 万源市| 高陵县| 赤水市| 革吉县| 弥勒县| 建德市| 巴中市| 安福县| 内丘县| 濮阳县| 文登市| 亳州市| 镇康县| 许昌市| 宣威市| 安平县| 远安县| 长乐市| 涪陵区| 绿春县|