# mini-tomcat **Repository Path**: linestyle007/mini-tomcat ## Basic Information - **Project Name**: mini-tomcat - **Description**: mini-tomcat - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-05-16 - **Last Updated**: 2024-01-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 准备工作 ### 流程架构图 ![mini-tomcat](mini-tomcat.png) * 解析配置 * **加载外部class文件工具类** => 加载 webapps/*/web.xml中的sevlet类 * 解析web.xml => 将servlet类加载到uri2servlet中 * 初始化线程池 => 解决socket client请求超时假死时,其它客户端能正常响应 * 提供socket通信服务 * 请求request对象 * 请求资源 * 响应response对象 ### 配置文件 #### server.xml ```xml ``` #### web.xml > 说明:每个部署应用的配置文件 > > 位置:{appBase}/{appName}/web.xml ```xml userServlet server.UserServlet userServlet /user ``` ## 实现步骤 ```java class Bootstrap { public void static main(String[] args){ Bootstrap.run(); } public static void run() { // 1.初始化配置 server.xml && webapps/{app}/web.xml HelperLoader.init(); // 2.启动监听服务器 => 127.0.0.1:8080 ServerSocket server = new ServerSocket(8080, "127.0.0.1"); while(true){ Socket client = server.accept(); // 3.通知 => 处理请求并响应数据 HandlerHelper.notify(client); } } } ``` ### 初始化配置 ```java HelperLoader.init() { ClassLoader.loadClass(ConfigHelper.class); } class ConfigHelper { @Getter private Map uri2servlet; @Getter private ExecutorService executorService; // port,host,appBase @Getter... static { initServerConfig(); // parse server.xml => [port,host,appBase] initServletMapping(); // parse webapps/*/web.xml => uri2servlet initThreadPool(); // 请求线程池 => 解决socket客户端超时未响应导致服务端阻塞 => 保证每个客户端正常响应数据 } } ``` ### 通知处理器 ```java HandlerHelper.notify(client) { // "GET /index.htm HTTP1.1 ..." => {method: "GET", uri: "/index.html"} HttpRequest request = wrapperRequest(client); // 输出内容:content => "HTTP content-type=text/html; content-body=${content}" handleRequest(client.getOutputStream(), request); } ``` ### 处理请求 ```java class StaticResourceHandler { void handle(HttpResponse response, HttpRequest request) { HttpUtil.write(response.getOutputStream(), request.getUri()); } } class DynamicResourceHandler { void handle(HttpResponse response, HttpRequest request) { Servlet servlet = ConfigHelper.get(request.getUri()); servlet.sevice(request, response); } } ```