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