From 6e0c2834e5b0dc09fb3cec76afc6b7a56c6636de Mon Sep 17 00:00:00 2001
From: fangpeng <591930734@qq.com>
Date: Sun, 27 Feb 2022 22:34:52 +0800
Subject: [PATCH 1/4] mini tomcat
---
.idea/.gitignore | 8 ++++
.idea/encodings.xml | 4 ++
.idea/inspectionProfiles/Project_Default.xml | 36 ++++++++++++++++
.idea/misc.xml | 14 ++++++
.idea/modules.xml | 8 ++++
.idea/runConfigurations.xml | 10 +++++
Minicat.iml | 9 ++++
README.md | 1 +
pom.xml | 45 ++++++++++++++++++++
9 files changed, 135 insertions(+)
create mode 100644 .idea/.gitignore
create mode 100644 .idea/encodings.xml
create mode 100644 .idea/inspectionProfiles/Project_Default.xml
create mode 100644 .idea/misc.xml
create mode 100644 .idea/modules.xml
create mode 100644 .idea/runConfigurations.xml
create mode 100644 Minicat.iml
create mode 100644 README.md
create mode 100644 pom.xml
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 00000000..73f69e09
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 00000000..da0415a0
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 00000000..6560a989
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 00000000..132404bc
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 00000000..0e920ba7
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 00000000..797acea5
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minicat.iml b/Minicat.iml
new file mode 100644
index 00000000..d6ebd480
--- /dev/null
+++ b/Minicat.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..be735807
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# 手写实现mini版Tomcat
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 00000000..284e70aa
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,45 @@
+
+
+ 4.0.0
+
+ com.lemon
+ Minicat
+ 1.0-SNAPSHOT
+
+
+ 8
+ 8
+
+
+
+
+ dom4j
+ dom4j
+ 1.6.1
+
+
+ jaxen
+ jaxen
+ 1.1.6
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.1
+
+ 8
+ 8
+ utf-8
+
+
+
+
+
+
\ No newline at end of file
From 7428938235a8c6bda0030fa3ab800bbd81ce68f7 Mon Sep 17 00:00:00 2001
From: fangpeng <591930734@qq.com>
Date: Sun, 27 Feb 2022 22:35:21 +0800
Subject: [PATCH 2/4] mini tomcat
---
.gitignore | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
create mode 100644 .gitignore
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..efb4aab2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,46 @@
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+### Maven template
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
From bf6ebda51a7d63ff8539dceef0d3d0cd5e611028 Mon Sep 17 00:00:00 2001
From: fangpeng <591930734@qq.com>
Date: Sun, 27 Feb 2022 23:47:11 +0800
Subject: [PATCH 3/4] =?UTF-8?q?Minicat=201.0=20=E5=92=8C=20Minicat=202.0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/modules.xml | 8 --
Minicat.iml | 9 --
src/main/java/server/Bootstrap.java | 87 ++++++++++++++++++++
src/main/java/server/HttpProtocolUtil.java | 33 ++++++++
src/main/java/server/Request.java | 72 ++++++++++++++++
src/main/java/server/Response.java | 55 +++++++++++++
src/main/java/server/StaticResourceUtil.java | 60 ++++++++++++++
src/main/resources/index.html | 10 +++
src/main/resources/web.xml | 13 +++
9 files changed, 330 insertions(+), 17 deletions(-)
delete mode 100644 .idea/modules.xml
delete mode 100644 Minicat.iml
create mode 100644 src/main/java/server/Bootstrap.java
create mode 100644 src/main/java/server/HttpProtocolUtil.java
create mode 100644 src/main/java/server/Request.java
create mode 100644 src/main/java/server/Response.java
create mode 100644 src/main/java/server/StaticResourceUtil.java
create mode 100644 src/main/resources/index.html
create mode 100644 src/main/resources/web.xml
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 0e920ba7..00000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Minicat.iml b/Minicat.iml
deleted file mode 100644
index d6ebd480..00000000
--- a/Minicat.iml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/java/server/Bootstrap.java b/src/main/java/server/Bootstrap.java
new file mode 100644
index 00000000..3c50e970
--- /dev/null
+++ b/src/main/java/server/Bootstrap.java
@@ -0,0 +1,87 @@
+package server;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @Description: Minicat的主类
+ * @Author : Lemon-CS
+ * @Date : 2022年02月27日 10:36 下午
+ */
+public class Bootstrap {
+
+ /**定义socket监听的端口号*/
+ private int port = 8080;
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ /**
+ * Minicat启动需要初始化展开的一些操作
+ */
+ public void start() throws Exception {
+
+ /*
+ 完成Minicat 1.0版本
+ 需求:浏览器请求http://localhost:8080,返回一个固定的字符串到页面"Hello Minicat!"
+ */
+ /*ServerSocket serverSocket = new ServerSocket(port);
+ System.out.println("=====>>>Minicat start on port:" + port);
+
+ while (true) {
+ Socket socket = serverSocket.accept();
+
+ // 有了socket,接收到请求,获取输出流
+ OutputStream outputStream = socket.getOutputStream();
+ String data = "Hello Minicat!";
+ String responseText = HttpProtocolUtil.getHttpHeader200(data.getBytes(StandardCharsets.UTF_8).length) + data;
+ outputStream.write(responseText.getBytes(StandardCharsets.UTF_8));
+ socket.close();
+ }*/
+
+ /**
+ * 完成Minicat 2.0版本
+ * 需求:封装Request和Response对象,返回html静态资源文件
+ */
+ ServerSocket serverSocket = new ServerSocket(port);
+ System.out.println("=====>>>Minicat start on port:" + port);
+
+ while (true) {
+ Socket socket = serverSocket.accept();
+ InputStream inputStream = socket.getInputStream();
+ OutputStream outputStream = socket.getOutputStream();
+
+ // 封装Request对象和Response对象
+ Request request = new Request(inputStream);
+ Response response = new Response(outputStream);
+
+ response.outputHtml(request.getUrl());
+ socket.close();
+ }
+
+ }
+
+
+ /**
+ * Minicat 的程序启动入口
+ * @param args
+ */
+ public static void main(String[] args) {
+ Bootstrap bootstrap = new Bootstrap();
+ try {
+ // 启动Minicat
+ bootstrap.start();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/src/main/java/server/HttpProtocolUtil.java b/src/main/java/server/HttpProtocolUtil.java
new file mode 100644
index 00000000..256d59d6
--- /dev/null
+++ b/src/main/java/server/HttpProtocolUtil.java
@@ -0,0 +1,33 @@
+package server;
+
+/**
+ * @Description: http协议工具类,主要是提供响应头信息,这里我们只提供200和404的情况
+ * @Author : Lemon-CS
+ * @Date : 2022年02月27日 10:46 下午
+ */
+public class HttpProtocolUtil {
+
+ /**
+ * 为响应码200提供请求头信息
+ * @return
+ */
+ public static String getHttpHeader200(long contentLength) {
+ return "HTTP/1.1 200 OK \n" +
+ "Content-Type: text/html \n" +
+ "Content-Length: " + contentLength + " \n" +
+ "\r\n";
+ }
+
+ /**
+ * 为响应码404提供请求头信息(此处也包含了数据内容)
+ * @return
+ */
+ public static String getHttpHeader404() {
+ String str404 = "
404 not found
";
+ return "HTTP/1.1 404 NOT Found \n" +
+ "Content-Type: text/html \n" +
+ "Content-Length: " + str404.getBytes().length + " \n" +
+ "\r\n" + str404;
+ }
+
+}
diff --git a/src/main/java/server/Request.java b/src/main/java/server/Request.java
new file mode 100644
index 00000000..519f927e
--- /dev/null
+++ b/src/main/java/server/Request.java
@@ -0,0 +1,72 @@
+package server;
+
+import java.io.InputStream;
+
+/**
+ * @Description: 把请求信息封装为Request对象(根据InputSteam输入流封装)
+ * @Author : Lemon-CS
+ * @Date : 2022年02月27日 11:09 下午
+ */
+public class Request {
+
+ private String method; // 请求方式,比如GET/POST
+ private String url; // 例如 /,/index.html
+
+ private InputStream inputStream; // 输入流,其他属性从输入流中解析出来
+
+
+ public String getMethod() {
+ return method;
+ }
+
+ public void setMethod(String method) {
+ this.method = method;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public InputStream getInputStream() {
+ return inputStream;
+ }
+
+ public void setInputStream(InputStream inputStream) {
+ this.inputStream = inputStream;
+ }
+
+ public Request() {
+ }
+
+ // 构造器,输入流传入
+ public Request(InputStream inputStream) throws Exception {
+ this.inputStream = inputStream;
+
+ // 从输入流中获取请求信息
+ int count = 0;
+ while (count == 0) {
+ count = inputStream.available();
+ }
+
+ byte[] bytes = new byte[count];
+ inputStream.read(bytes);
+
+ String inputStr = new String(bytes);
+ // 获取第一行请求头信息
+ String firstLineStr = inputStr.split("\\n")[0]; // GET / HTTP/1.1
+
+ String[] strings = firstLineStr.split(" ");
+
+ this.method = strings[0];
+ this.url = strings[1];
+
+ System.out.println("=====>>>request method: " + method);
+ System.out.println("=====>>>request url: " + url);
+
+ }
+
+}
diff --git a/src/main/java/server/Response.java b/src/main/java/server/Response.java
new file mode 100644
index 00000000..cea781a4
--- /dev/null
+++ b/src/main/java/server/Response.java
@@ -0,0 +1,55 @@
+package server;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @Description: 封装Response对象,需要依赖于OutputStream
+ * 该对象需要提供核心方法,输出html
+ * @Author : Lemon-CS
+ * @Date : 2022年02月27日 11:11 下午
+ */
+public class Response {
+
+ private OutputStream outputStream;
+
+ public Response() {
+ }
+
+ public Response(OutputStream outputStream) {
+ this.outputStream = outputStream;
+ }
+
+ // 使用输出流输出指定字符串
+ public void output(String content) throws IOException {
+ outputStream.write(content.getBytes());
+ }
+
+ /**
+ *
+ * @param path url,随后要根据url来获取到静态资源的绝对路径,进一步根据绝对路径读取该静态资源文件,最终通过
+ * 输出流输出
+ * /-----> classes
+ */
+ public void outputHtml(String path) throws IOException {
+ // 获取静态资源文件的绝对路径
+ String absoluteResourcePath = StaticResourceUtil.getAbsolutePath(path);
+
+ // 输入静态资源文件
+ File file = new File(absoluteResourcePath);
+
+ if (file.exists() && file.isFile()) {
+ // 读取静态资源文件,输出静态资源
+ StaticResourceUtil.outputStaticResource(new FileInputStream(file), outputStream);
+ } else {
+ // 输出404
+ output(HttpProtocolUtil.getHttpHeader404());
+ }
+
+
+ }
+
+}
diff --git a/src/main/java/server/StaticResourceUtil.java b/src/main/java/server/StaticResourceUtil.java
new file mode 100644
index 00000000..9f123203
--- /dev/null
+++ b/src/main/java/server/StaticResourceUtil.java
@@ -0,0 +1,60 @@
+package server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @Description: 静态资源工具类
+ * @Author : Lemon-CS
+ * @Date : 2022年02月27日 11:23 下午
+ */
+public class StaticResourceUtil {
+
+ /**
+ * 获取静态资源文件的绝对路径
+ * @param path
+ * @return
+ */
+ public static String getAbsolutePath(String path) {
+ String absolutePath = StaticResourceUtil.class.getResource("/").getPath();
+ return absolutePath.replaceAll("\\\\","/") + path;
+ }
+
+ /**
+ * 读取静态资源文件输入流,通过输出流输出
+ */
+ public static void outputStaticResource(InputStream inputStream, OutputStream outputStream) throws IOException {
+
+ int count = 0;
+ while (count == 0) {
+ count = inputStream.available();
+ }
+
+ int resourceSize = count;
+
+ // 输出http请求头,然后再输出具体内容
+ outputStream.write(HttpProtocolUtil.getHttpHeader200(resourceSize).getBytes(StandardCharsets.UTF_8));
+
+ // 读取内容输出
+ long written = 0 ;// 已经读取的内容长度
+ int byteSize = 1024; // 计划每次缓冲的长度
+ byte[] bytes = new byte[byteSize];
+
+ while (written < resourceSize) {
+ if(written + byteSize > resourceSize) { // 说明剩余未读取大小不足一个1024长度,那就按真实长度处理
+ byteSize = (int) (resourceSize - written); // 剩余的文件内容长度
+ bytes = new byte[byteSize];
+ }
+
+ inputStream.read(bytes);
+ outputStream.write(bytes);
+
+ outputStream.flush();
+
+ written += byteSize;
+ }
+ }
+
+ }
diff --git a/src/main/resources/index.html b/src/main/resources/index.html
new file mode 100644
index 00000000..c7b9c302
--- /dev/null
+++ b/src/main/resources/index.html
@@ -0,0 +1,10 @@
+
+
+
+
+ static resouce
+
+
+Hello Minicat-static resouce!
+
+
\ No newline at end of file
diff --git a/src/main/resources/web.xml b/src/main/resources/web.xml
new file mode 100644
index 00000000..d9e9b952
--- /dev/null
+++ b/src/main/resources/web.xml
@@ -0,0 +1,13 @@
+
+
+
+ lagou
+ server.LagouServlet
+
+
+
+
+ lagou
+ /lagou
+
+
From 594ed7ff6360ace5dc25e96c8f33251d7329e67f Mon Sep 17 00:00:00 2001
From: fangpeng <591930734@qq.com>
Date: Mon, 28 Feb 2022 22:13:29 +0800
Subject: [PATCH 4/4] Minicat 3.0
---
src/main/java/server/Bootstrap.java | 96 +++++++++++++++++++++-
src/main/java/server/HttpServlet.java | 22 +++++
src/main/java/server/LemonServlet.java | 55 +++++++++++++
src/main/java/server/RequestProcessor.java | 46 +++++++++++
src/main/java/server/Servlet.java | 16 ++++
src/main/resources/web.xml | 8 +-
6 files changed, 238 insertions(+), 5 deletions(-)
create mode 100644 src/main/java/server/HttpServlet.java
create mode 100644 src/main/java/server/LemonServlet.java
create mode 100644 src/main/java/server/RequestProcessor.java
create mode 100644 src/main/java/server/Servlet.java
diff --git a/src/main/java/server/Bootstrap.java b/src/main/java/server/Bootstrap.java
index 3c50e970..37a96439 100644
--- a/src/main/java/server/Bootstrap.java
+++ b/src/main/java/server/Bootstrap.java
@@ -1,10 +1,19 @@
package server;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.*;
/**
* @Description: Minicat的主类
@@ -16,6 +25,8 @@ public class Bootstrap {
/**定义socket监听的端口号*/
private int port = 8080;
+ private Map servletMap = new HashMap();
+
public int getPort() {
return port;
}
@@ -29,6 +40,29 @@ public void setPort(int port) {
*/
public void start() throws Exception {
+ // 加载解析相关的配置,web.xml
+ loadServlet();
+
+ // 定义一个线程池
+ int corePoolSize = 10;
+ int maximumPoolSize =50;
+ long keepAliveTime = 100L;
+ TimeUnit unit = TimeUnit.SECONDS;
+ BlockingQueue workQueue = new ArrayBlockingQueue<>(50);
+ ThreadFactory threadFactory = Executors.defaultThreadFactory();
+ RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
+
+
+ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
+ corePoolSize,
+ maximumPoolSize,
+ keepAliveTime,
+ unit,
+ workQueue,
+ threadFactory,
+ handler
+ );
+
/*
完成Minicat 1.0版本
需求:浏览器请求http://localhost:8080,返回一个固定的字符串到页面"Hello Minicat!"
@@ -51,7 +85,7 @@ public void start() throws Exception {
* 完成Minicat 2.0版本
* 需求:封装Request和Response对象,返回html静态资源文件
*/
- ServerSocket serverSocket = new ServerSocket(port);
+ /*ServerSocket serverSocket = new ServerSocket(port);
System.out.println("=====>>>Minicat start on port:" + port);
while (true) {
@@ -65,10 +99,70 @@ public void start() throws Exception {
response.outputHtml(request.getUrl());
socket.close();
+ }*/
+
+ /**
+ * 完成Minicat 3.0版本
+ * 需求:可以请求动态资源(Servlet)
+ */
+ ServerSocket serverSocket = new ServerSocket(port);
+ System.out.println("=====>>>Minicat start on port:" + port);
+
+ while (true) {
+
+ Socket socket = serverSocket.accept();
+ RequestProcessor requestProcessor = new RequestProcessor(socket,servletMap);
+ //requestProcessor.start();
+ threadPoolExecutor.execute(requestProcessor);
+
}
}
+ /**
+ * 加载解析web.xml,初始化Servlet
+ */
+ private void loadServlet() {
+ InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("web.xml");
+ SAXReader saxReader = new SAXReader();
+
+ try {
+ Document document = saxReader.read(resourceAsStream);
+ Element rootElement = document.getRootElement();
+
+ List selectNodes = rootElement.selectNodes("//servlet");
+
+ for (int i = 0; i < selectNodes.size(); i++) {
+
+ Element element = selectNodes.get(i);
+
+ // lagou
+ Element servletnameElement = (Element) element.selectSingleNode("servlet-name");
+ String servletName = servletnameElement.getStringValue();
+ // server.LagouServlet
+ Element servletclassElement = (Element) element.selectSingleNode("servlet-class");
+ String servletClass = servletclassElement.getStringValue();
+
+
+ // 根据servlet-name的值找到url-pattern
+ Element servletMapping = (Element) rootElement.selectSingleNode("/web-app/servlet-mapping[servlet-name='" + servletName + "']");
+ // /lagou
+ String urlPattern = servletMapping.selectSingleNode("url-pattern").getStringValue();
+ servletMap.put(urlPattern, (HttpServlet) Class.forName(servletClass).newInstance());
+
+ }
+
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
/**
* Minicat 的程序启动入口
diff --git a/src/main/java/server/HttpServlet.java b/src/main/java/server/HttpServlet.java
new file mode 100644
index 00000000..409f36df
--- /dev/null
+++ b/src/main/java/server/HttpServlet.java
@@ -0,0 +1,22 @@
+package server;
+
+/**
+ * @Description: TODO
+ * @Author : Lemon-CS
+ * @Date : 2022年02月27日 11:48 下午
+ */
+public abstract class HttpServlet implements Servlet {
+
+ public abstract void doGet(Request request, Response response);
+
+ public abstract void doPost(Request request, Response response);
+
+ @Override
+ public void service(Request request, Response response) throws Exception {
+ if("GET".equalsIgnoreCase(request.getMethod())) {
+ doGet(request, response);
+ }else{
+ doPost(request, response);
+ }
+ }
+}
diff --git a/src/main/java/server/LemonServlet.java b/src/main/java/server/LemonServlet.java
new file mode 100644
index 00000000..acc6bba0
--- /dev/null
+++ b/src/main/java/server/LemonServlet.java
@@ -0,0 +1,55 @@
+package server;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @Description: TODO
+ * @Author : Lemon-CS
+ * @Date : 2022年02月27日 11:51 下午
+ */
+public class LemonServlet extends HttpServlet {
+
+ @Override
+ public void doGet(Request request, Response response) {
+
+ try {
+ Thread.sleep(100000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ String content = "LemonServlet get
";
+ try {
+ response.output(HttpProtocolUtil.getHttpHeader200(
+ content.getBytes(StandardCharsets.UTF_8).length)
+ + content);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void doPost(Request request, Response response) {
+ String content = "LemonServlet post
";
+
+ try {
+ response.output(HttpProtocolUtil.getHttpHeader200(
+ content.getBytes(StandardCharsets.UTF_8).length)
+ + content);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ @Override
+ public void init() throws Exception {
+
+ }
+
+ @Override
+ public void destory() throws Exception {
+
+ }
+}
diff --git a/src/main/java/server/RequestProcessor.java b/src/main/java/server/RequestProcessor.java
new file mode 100644
index 00000000..279c1d96
--- /dev/null
+++ b/src/main/java/server/RequestProcessor.java
@@ -0,0 +1,46 @@
+package server;
+
+import java.io.InputStream;
+import java.net.Socket;
+import java.util.Map;
+
+/**
+ * @Description: 请求处理类
+ * @Author : Lemon-CS
+ * @Date : 2022年02月28日 10:06 下午
+ */
+public class RequestProcessor extends Thread {
+ private Socket socket;
+ private Map servletMap;
+
+ public RequestProcessor(Socket socket, Map servletMap) {
+ this.socket = socket;
+ this.servletMap = servletMap;
+ }
+
+ @Override
+ public void run() {
+ try{
+ InputStream inputStream = socket.getInputStream();
+
+ // 封装Request对象和Response对象
+ Request request = new Request(inputStream);
+ Response response = new Response(socket.getOutputStream());
+
+ // 静态资源处理
+ if(servletMap.get(request.getUrl()) == null) {
+ response.outputHtml(request.getUrl());
+ }else{
+ // 动态资源servlet请求
+ HttpServlet httpServlet = servletMap.get(request.getUrl());
+ httpServlet.service(request,response);
+ }
+
+ socket.close();
+
+ }catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/main/java/server/Servlet.java b/src/main/java/server/Servlet.java
new file mode 100644
index 00000000..db9c1d17
--- /dev/null
+++ b/src/main/java/server/Servlet.java
@@ -0,0 +1,16 @@
+package server;
+
+/**
+ * @Description: Servlet接口
+ * @Author : Lemon-CS
+ * @Date : 2022年02月27日 11:48 下午
+ */
+public interface Servlet {
+
+ void init() throws Exception;
+
+ void destory() throws Exception;
+
+ void service(Request request,Response response) throws Exception;
+
+}
diff --git a/src/main/resources/web.xml b/src/main/resources/web.xml
index d9e9b952..2b98c12c 100644
--- a/src/main/resources/web.xml
+++ b/src/main/resources/web.xml
@@ -1,13 +1,13 @@
- lagou
- server.LagouServlet
+ lemon
+ server.LemonServlet
- lagou
- /lagou
+ lemon
+ /lemon