小董亮出你的8块腹肌吧!头像
关注

自己动手写一个tomcat之2拆分httpserver职责

写在前面

源码
本文目标,使用标准的servlet,以及拆分httpserver职责。

1:使用标准的servlet

引入标准servlet的pom:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
</dependency>

让HttpServlet实现javax.servlet.Servlet接口,使其成为标准的servlet:

public class HelloServlet implements Servlet {}

同样的request和response成为规范内的请求和响应对象:

import javax.servlet.ServletRequest;

public class Request implements ServletRequest {}
import javax.servlet.ServletResponse;

public class Response implements ServletResponse {}

2:拆分httpserver职责

当前,连接,处理请求职责都在http server,这显然不符合单一职责的原则,来拆分下,对于连接,引入Connector组件,对于处理请求引入processor组件。Connector组件定义类HttpConnector:

package monitomcat.server;

// ...

public class HttpConnector implements Runnable {

    public void run() {
        ServerSocket serverSocket = null;
        int port = 8080;
        try {
            serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

        while (true) {
            Socket socket = null;
            try {
                socket = serverSocket.accept();
                HttpProcessor processor = new HttpProcessor();
                processor.process(socket);

                // Close the socket
                socket.close();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void start() {
        Thread thread = new Thread(this);
        thread.start();
    }

}

processor组件定义类HttpProcessor:

package monitomcat.server;

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

public class HttpProcessor {
    public HttpProcessor() {
    }

    public void process(Socket socket) {
        InputStream input = null;
        OutputStream output = null;
        try {
            input = socket.getInputStream();
            output = socket.getOutputStream();

            // create Request object and parse
            Request request = new Request(input);
            request.parse();

            // create Response object
            Response response = new Response(output);
            response.setRequest(request);

            if (request.getUri().startsWith("/servlet/")) {
                ServletProcessor processor = new ServletProcessor();
                processor.process(request, response);
            } else {
                StaticResourceProcessor processor = new StaticResourceProcessor();
                processor.process(request, response);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

此时整个处理请求过程如下:
在这里插入图片描述
这样我们的启动类就很简单了:

package monitomcat.server;

// ...

public class HttpServer {
    public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "target" + File.separator + "classes" + File.separator + "webroot";
    public static final String WEB_ROOT_SERVLET = System.getProperty("user.dir") + File.separator + "target" + File.separator + "classes" + File.separator + "monitomcat" + File.separator + "server";

    public static void main(String[] args) {
//        HttpServer server = new HttpServer();
//        server.await();
        // 启动连接器
        HttpConnector connector = new HttpConnector();
        connector.start();
    }
}

相比原来的代码是不是倍感清新舒爽~~~~~~~~!!!!!!!!
测试下:

C:\Users\dell9020>curl http://localhost:8080/hello.txt
say hello from minitomcat v2...!
C:\Users\dell9020>curl http://localhost:8080/servlet/monitomcat.server.HelloServlet
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Test</title></head>
<body bgcolor="#f0f0f0">
<h1 align="center">Hello World from standard servlet!!!</h1>

写在后面

参考文章列表

手把手带你写一个 MiniTomcat

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/wang0907/article/details/163667746

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--