写在前面
源码 。
本文目标,使用标准的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>
写在后面
参考文章列表
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/wang0907/article/details/163667746



