From e9b62210bbd9d8304288652a63819738a1fff01e Mon Sep 17 00:00:00 2001 From: AmyliaY <471816751@qq.com> Date: Sat, 28 Mar 2020 19:42:28 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E8=B0=83=E6=95=B4=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=EF=BC=9B=202=E3=80=81servlet=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E8=B5=8F=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +- .../ByteBuf组件.md | 1 + .../ChannelPipeline和ChannelHandler组件.md | 1 + .../Channel和Unsafe组件.md | 1 + .../EventLoop和EventLoopGroup组件.md | 1 + .../Future和Promise组件.md | 1 + docs/Tomcat/servlet容器详解.md | 1 + docs/Tomcat/servlet源码赏析.md | 566 ++++++++++++++++++ ...一个简单的Web服务器代码设计.md | 1 + ...个简单的servlet容器代码设计.md | 1 + images/Tomcat/Servlet主要类图.png | Bin 0 -> 73458 bytes 11 files changed, 582 insertions(+), 6 deletions(-) create mode 100644 docs/Netty/Netty主要组件源码分析/ByteBuf组件.md create mode 100644 docs/Netty/Netty主要组件源码分析/ChannelPipeline和ChannelHandler组件.md create mode 100644 docs/Netty/Netty主要组件源码分析/Channel和Unsafe组件.md create mode 100644 docs/Netty/Netty主要组件源码分析/EventLoop和EventLoopGroup组件.md create mode 100644 docs/Netty/Netty主要组件源码分析/Future和Promise组件.md create mode 100644 docs/Tomcat/servlet容器详解.md create mode 100644 docs/Tomcat/servlet源码赏析.md create mode 100644 docs/Tomcat/一个简单的Web服务器代码设计.md create mode 100644 docs/Tomcat/一个简单的servlet容器代码设计.md create mode 100644 images/Tomcat/Servlet主要类图.png diff --git a/README.md b/README.md index a454e22..54f7bda 100644 --- a/README.md +++ b/README.md @@ -125,11 +125,11 @@ - [基于Netty的客户端开发](docs/Netty/基于Netty开发服务端及客户端/基于Netty的客户端开发.md) ### Netty 主要组件的源码分析 -- [ByteBuf组件]() -- [Channel组件 和 Unsafe组件]() -- [ChannelPipeline 和 ChannelHandler组件]() -- [EventLoop 和 EventLoopGroup组件]() -- [Future 和 Promise组件]() +- [ByteBuf组件](docs/Netty/Netty主要组件源码分析/ByteBuf组件.md) +- [Channel组件 和 Unsafe组件](docs/Netty/Netty主要组件源码分析/Channel和Unsafe组件.md) +- [ChannelPipeline 和 ChannelHandler组件](docs/Netty/Netty主要组件源码分析/ChannelPipeline和ChannelHandler组件.md) +- [EventLoop 和 EventLoopGroup组件](docs/Netty/Netty主要组件源码分析/EventLoop和EventLoopGroup组件.md) +- [Future 和 Promise组件](docs/Netty/Netty主要组件源码分析/Future和Promise组件.md) ### Netty 高级特性 - [Netty 架构设计](docs/Netty/AdvancedFeaturesOfNetty/Netty架构设计.md) @@ -137,7 +137,9 @@ - [Netty 高可靠性设计](docs/Netty/AdvancedFeaturesOfNetty/Netty高可靠性设计.md) ## Tomcat -- 努力编写中... +- [一个简单的Web服务器]() +- [一个简单的servlet容器]() +- [servlet容器详解]() ## Redis - 努力编写中... diff --git a/docs/Netty/Netty主要组件源码分析/ByteBuf组件.md b/docs/Netty/Netty主要组件源码分析/ByteBuf组件.md new file mode 100644 index 0000000..753e53e --- /dev/null +++ b/docs/Netty/Netty主要组件源码分析/ByteBuf组件.md @@ -0,0 +1 @@ +努力编写中... \ No newline at end of file diff --git a/docs/Netty/Netty主要组件源码分析/ChannelPipeline和ChannelHandler组件.md b/docs/Netty/Netty主要组件源码分析/ChannelPipeline和ChannelHandler组件.md new file mode 100644 index 0000000..753e53e --- /dev/null +++ b/docs/Netty/Netty主要组件源码分析/ChannelPipeline和ChannelHandler组件.md @@ -0,0 +1 @@ +努力编写中... \ No newline at end of file diff --git a/docs/Netty/Netty主要组件源码分析/Channel和Unsafe组件.md b/docs/Netty/Netty主要组件源码分析/Channel和Unsafe组件.md new file mode 100644 index 0000000..753e53e --- /dev/null +++ b/docs/Netty/Netty主要组件源码分析/Channel和Unsafe组件.md @@ -0,0 +1 @@ +努力编写中... \ No newline at end of file diff --git a/docs/Netty/Netty主要组件源码分析/EventLoop和EventLoopGroup组件.md b/docs/Netty/Netty主要组件源码分析/EventLoop和EventLoopGroup组件.md new file mode 100644 index 0000000..753e53e --- /dev/null +++ b/docs/Netty/Netty主要组件源码分析/EventLoop和EventLoopGroup组件.md @@ -0,0 +1 @@ +努力编写中... \ No newline at end of file diff --git a/docs/Netty/Netty主要组件源码分析/Future和Promise组件.md b/docs/Netty/Netty主要组件源码分析/Future和Promise组件.md new file mode 100644 index 0000000..753e53e --- /dev/null +++ b/docs/Netty/Netty主要组件源码分析/Future和Promise组件.md @@ -0,0 +1 @@ +努力编写中... \ No newline at end of file diff --git a/docs/Tomcat/servlet容器详解.md b/docs/Tomcat/servlet容器详解.md new file mode 100644 index 0000000..753e53e --- /dev/null +++ b/docs/Tomcat/servlet容器详解.md @@ -0,0 +1 @@ +努力编写中... \ No newline at end of file diff --git a/docs/Tomcat/servlet源码赏析.md b/docs/Tomcat/servlet源码赏析.md new file mode 100644 index 0000000..dc4588a --- /dev/null +++ b/docs/Tomcat/servlet源码赏析.md @@ -0,0 +1,566 @@ +## Servlet 基础 +### Servlet 简介 +Servlet(Server Applet),是用 Java 编写的服务器端程序。其主要功能在于交互式地(Request 和 Response)浏览和修改数据,生成动态 Web内容。Servlet 运行于支持 Java的应用服务器中,如 Tomcat。从实现上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP协议 的 Web服务器。servlet 的工作模式如下: +- 客户端发送请求至服务器; +- 服务器启动并调用相应的 servlet,servlet 根据客户端请求生成响应内容并将其传给服务器; +- 服务器将响应返回客户端; + +另外,由于各种MVC框架的兴起,现在几乎没人会直接使用 servlet 来处理请求咯,往往都是把 SpringMVC 在 Tomcat 中一配,各种请求都交由 DispatcherServlet 来分发。 + +### Servlet生命周期 +- 加载 : 客户端第一次访问该 Servlet 时,Tomcat 会创建该 Servlet 的实例,一般只创建1次,所以 servlet对象 在 Tomcat 是单例的; +- 初始化 : Tomcat 调用 该 Servlet 的 init()方法 进行初始化; +- 服务 : 每当客户端访问 该Servlet 时,Tomcat 就会调用一次该 Servlet 的 service()方法 处理请求; +- 销毁 : Tomcat关闭 或 检测到 该Servlet 要从 Tomcat 删除时,会自动调用 该servlet 的 destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁; + +简单总结一下就是,只要访问 Servlet,service()方法 就会被调用。init()方法 只有第一次访问 Servlet 的时候才会被调用。destroy()方法 会在 Tomcat 关闭的时候被调用。 + +### <load-on-startup> +在 web.xml 中配置 Servlet 时有个属性 <load-on-startup>1</load-on-startup>。翻译过来就是 “在启动时加载”,其作用如下: +1. load-on-startup 元素标记容器是否应该在 web应用程序 启动的时候就加载这个 Servlet,实例化并调用其 init()方法; +2. 它的值必须是一个整数,表示 Servlet 被加载的先后顺序; +3. 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个 Servlet,值越小,Servlet 的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载; +4. 如果该元素的值为负数或者没有设置,则容器会在 Servlet 被请求时才加载。 + +### Servlet的多线程并发问题 +servlet对象 在 Tomcat服务器 是 单实例多线程的,比如 DispatcherServlet对象 只会被创建一次,但多个请求同时过来时,Tomcat线程池 的多个工作线程就会并发地访问该 DispatcherServlet对象。所以,若一个servlet对象中存在被并发修改的共享数据(成员变量 等),又没有加锁控制并发安全,就很可能会出现线程安全问题。 + +解决方案: +1. 把使用到共享数据的代码块进行同步(使用synchronized 或 Lock对象); +2. 建议在 Servlet类 中尽量不要使用成员变量。若使用成员变量,则必须同步,并尽量缩小同步代码块的范围,以避免因为同步而导致并发效率降低。 + +### Servlet 实现请求和响应 +对于每次客户端请求,Web容器 都会创建一个新的 HttpServletRequest请求对象 和 一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给相应的 Servlet对象 的 service()方法,service()方法 再根据请求方式分别调用 doXXX()方法。经过一系列业务层处理,最后将结果封装到 response对象中,交由 Socket对象传输响应给客户端。 + +## Servlet 源码解析 +javax.servlet 包主要对 Servlet 的一些主要行为和接口进行了定义和简单实现,它是 Servlet规范 的体现,具体的实现交由下游厂商或开发者,就像体现了JDBC规范的 java.sql包 一样,主要负责定义标准和规范。其源码和注释如下。 +```java +public interface Servlet { + /** + * 初始化servlet + */ + public abstract void init(ServletConfig servletconfig) throws ServletException; + + /** + * 提供服务 + */ + public abstract void service(ServletRequest servletrequest, ServletResponse servletresponse) + throws ServletException, IOException; + + /** + * 销毁本servlet + */ + public abstract void destroy(); + + public abstract ServletConfig getServletConfig(); + + public abstract String getServletInfo(); +} + +/** + * ServletConfig 主要用于保存一些 servlet的配置信息,与 servlet对象 成对出现 + */ +public interface ServletConfig { + + public abstract String getServletName(); + + public abstract ServletContext getServletContext(); + + public abstract String getInitParameter(String s); + + public abstract Enumeration getInitParameterNames(); +} + +/** + * 一个web应用对应一个ServletContext,ServletContext实例包含了所有servlet共享的资源信息 + */ +public interface ServletContext { + + public abstract ServletContext getContext(String s); + + public abstract Servlet getServlet(String s) throws ServletException; + + public abstract Enumeration getServlets(); + + public abstract Enumeration getServletNames(); + + public abstract int getMajorVersion(); + + public abstract Set getResourcePaths(String s); + + public abstract URL getResource(String s) throws MalformedURLException; + + public abstract InputStream getResourceAsStream(String s); + + public abstract RequestDispatcher getRequestDispatcher(String s); + + public abstract RequestDispatcher getNamedDispatcher(String s); + + public abstract String getRealPath(String s); + + public abstract String getServerInfo(); + + public abstract String getInitParameter(String s); + + public abstract Enumeration getInitParameterNames(); + + public abstract Object getAttribute(String s); + + public abstract Enumeration getAttributeNames(); + + public abstract void setAttribute(String s, Object obj); + + public abstract void removeAttribute(String s); + + public abstract String getServletContextName(); +} + +/** + *定义了 Servlet 要处理的 Request请求信息,调用 Servlet 的 service()方法 时,会作为参数传入 + */ +public interface ServletRequest { + + public abstract Object getAttribute(String s); + + public abstract Enumeration getAttributeNames(); + + public abstract String getCharacterEncoding(); + + public abstract void setCharacterEncoding(String s) throws UnsupportedEncodingException; + + public abstract int getContentLength(); + + public abstract String getContentType(); + + public abstract ServletInputStream getInputStream() throws IOException; + + public abstract String getParameter(String s); + + public abstract Enumeration getParameterNames(); + + public abstract String[] getParameterValues(String s); + + public abstract Map getParameterMap(); + + public abstract String getProtocol(); + + public abstract String getScheme(); + + public abstract String getServerName(); + + public abstract int getServerPort(); + + public abstract BufferedReader getReader() throws IOException; + + public abstract String getRemoteAddr(); + + public abstract String getRemoteHost(); + + public abstract void setAttribute(String s, Object obj); + + public abstract void removeAttribute(String s); + + public abstract Locale getLocale(); + + public abstract Enumeration getLocales(); + + public abstract boolean isSecure(); + + public abstract RequestDispatcher getRequestDispatcher(String s); +} + +/** + * 定义了 Servlet 要返回的 Response响应信息,调用Servlet 的 service()方法 时,会作为参数传入 + */ +public interface ServletResponse { + + public abstract String getCharacterEncoding(); + + public abstract ServletOutputStream getOutputStream() throws IOException; + + public abstract PrintWriter getWriter() throws IOException; + + public abstract void setContentLength(int i); + + public abstract void setContentType(String s); + + public abstract void setBufferSize(int i); + + public abstract int getBufferSize(); + + public abstract void flushBuffer() throws IOException; + + public abstract void resetBuffer(); + + public abstract boolean isCommitted(); + + public abstract void reset(); + + public abstract void setLocale(Locale locale); + + public abstract Locale getLocale(); +} +``` +其主要部分的类图 如下。 + +![avatar](images/Tomcat/Servlet主要类图.png) + +下面看一下 javax.servlet.http 包下的内容,它提供了很多 我经常用到的类和接口,比如:HttpServlet、HttpServletRequest、HttpServletResponse。其源码如下。 +```java +public abstract class HttpServlet extends GenericServlet implements Serializable { + + private static final String METHOD_DELETE = "DELETE"; + private static final String METHOD_HEAD = "HEAD"; + private static final String METHOD_GET = "GET"; + private static final String METHOD_OPTIONS = "OPTIONS"; + private static final String METHOD_POST = "POST"; + private static final String METHOD_PUT = "PUT"; + private static final String METHOD_TRACE = "TRACE"; + private static final String HEADER_IFMODSINCE = "If-Modified-Since"; + private static final String HEADER_LASTMOD = "Last-Modified"; + private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings"; + private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings"); + + /** + * 将 请求及响应 转换成 HttpServletRequest 及 HttpServletResponse, + * 再调用 service() 的重载方法 + */ + public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { + HttpServletRequest request; + HttpServletResponse response; + try { + request = (HttpServletRequest) req; + response = (HttpServletResponse) res; + } catch (ClassCastException e) { + throw new ServletException("non-HTTP request or response"); + } + service(request, response); + } + + /** + * 对HTTP协议 各种类型的请求分别进行处理 + */ + protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String method = req.getMethod(); + if (method.equals("GET")) { + long lastModified = getLastModified(req); + if (lastModified == -1L) { + doGet(req, resp); + } else { + long ifModifiedSince = req.getDateHeader("If-Modified-Since"); + if (ifModifiedSince < (lastModified / 1000L) * 1000L) { + maybeSetLastModified(resp, lastModified); + doGet(req, resp); + } else { + resp.setStatus(304); + } + } + } else if (method.equals("HEAD")) { + long lastModified = getLastModified(req); + maybeSetLastModified(resp, lastModified); + doHead(req, resp); + } else if (method.equals("POST")) + doPost(req, resp); + else if (method.equals("PUT")) + doPut(req, resp); + else if (method.equals("DELETE")) + doDelete(req, resp); + else if (method.equals("OPTIONS")) + doOptions(req, resp); + else if (method.equals("TRACE")) { + doTrace(req, resp); + } else { + String errMsg = lStrings.getString("http.method_not_implemented"); + Object errArgs[] = new Object[1]; + errArgs[0] = method; + errMsg = MessageFormat.format(errMsg, errArgs); + resp.sendError(501, errMsg); + } + } + + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String protocol = req.getProtocol(); + String msg = lStrings.getString("http.method_get_not_supported"); + if (protocol.endsWith("1.1")) + resp.sendError(405, msg); + else + resp.sendError(400, msg); + } + + protected long getLastModified(HttpServletRequest req) { + return -1L; + } + + protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + NoBodyResponse response = new NoBodyResponse(resp); + doGet(req, response); + response.setContentLength(); + } + + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String protocol = req.getProtocol(); + String msg = lStrings.getString("http.method_post_not_supported"); + if (protocol.endsWith("1.1")) + resp.sendError(405, msg); + else + resp.sendError(400, msg); + } + + protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String protocol = req.getProtocol(); + String msg = lStrings.getString("http.method_put_not_supported"); + if (protocol.endsWith("1.1")) + resp.sendError(405, msg); + else + resp.sendError(400, msg); + } + + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String protocol = req.getProtocol(); + String msg = lStrings.getString("http.method_delete_not_supported"); + if (protocol.endsWith("1.1")) + resp.sendError(405, msg); + else + resp.sendError(400, msg); + } + + private Method[] getAllDeclaredMethods(Class c) { + if (c.getName().equals("javax.servlet.http.HttpServlet")) + return null; + int j = 0; + Method parentMethods[] = getAllDeclaredMethods(c.getSuperclass()); + Method thisMethods[] = c.getDeclaredMethods(); + if (parentMethods != null) { + Method allMethods[] = new Method[parentMethods.length + thisMethods.length]; + for (int i = 0; i < parentMethods.length; i++) { + allMethods[i] = parentMethods[i]; + j = i; + } + + for (int i = ++j; i < thisMethods.length + j; i++) + allMethods[i] = thisMethods[i - j]; + + return allMethods; + } else { + return thisMethods; + } + } + + protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + Method methods[] = getAllDeclaredMethods(getClass()); + boolean ALLOW_GET = false; + boolean ALLOW_HEAD = false; + boolean ALLOW_POST = false; + boolean ALLOW_PUT = false; + boolean ALLOW_DELETE = false; + boolean ALLOW_TRACE = true; + boolean ALLOW_OPTIONS = true; + for (int i = 0; i < methods.length; i++) { + Method m = methods[i]; + if (m.getName().equals("doGet")) { + ALLOW_GET = true; + ALLOW_HEAD = true; + } + if (m.getName().equals("doPost")) + ALLOW_POST = true; + if (m.getName().equals("doPut")) + ALLOW_PUT = true; + if (m.getName().equals("doDelete")) + ALLOW_DELETE = true; + } + + String allow = null; + if (ALLOW_GET && allow == null) + allow = "GET"; + if (ALLOW_HEAD) + if (allow == null) + allow = "HEAD"; + else + allow = allow + ", HEAD"; + if (ALLOW_POST) + if (allow == null) + allow = "POST"; + else + allow = allow + ", POST"; + if (ALLOW_PUT) + if (allow == null) + allow = "PUT"; + else + allow = allow + ", PUT"; + if (ALLOW_DELETE) + if (allow == null) + allow = "DELETE"; + else + allow = allow + ", DELETE"; + if (ALLOW_TRACE) + if (allow == null) + allow = "TRACE"; + else + allow = allow + ", TRACE"; + if (ALLOW_OPTIONS) + if (allow == null) + allow = "OPTIONS"; + else + allow = allow + ", OPTIONS"; + resp.setHeader("Allow", allow); + } + + protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String CRLF = "\r\n"; + String responseString = "TRACE " + req.getRequestURI() + " " + req.getProtocol(); + for (Enumeration reqHeaderEnum = req.getHeaderNames(); reqHeaderEnum.hasMoreElements();) { + String headerName = (String) reqHeaderEnum.nextElement(); + responseString = responseString + CRLF + headerName + ": " + req.getHeader(headerName); + } + + responseString = responseString + CRLF; + int responseLength = responseString.length(); + resp.setContentType("message/http"); + resp.setContentLength(responseLength); + ServletOutputStream out = resp.getOutputStream(); + out.print(responseString); + out.close(); + } + + private void maybeSetLastModified(HttpServletResponse resp, long lastModified) { + if (resp.containsHeader("Last-Modified")) + return; + if (lastModified >= 0L) + resp.setDateHeader("Last-Modified", lastModified); + } +} + +/** + * 对 HTTP 请求信息进行定义 + */ +public interface HttpServletRequest extends ServletRequest { + + public static final String BASIC_AUTH = "BASIC"; + public static final String FORM_AUTH = "FORM"; + public static final String CLIENT_CERT_AUTH = "CLIENT_CERT"; + public static final String DIGEST_AUTH = "DIGEST"; + + public abstract String getAuthType(); + + public abstract Cookie[] getCookies(); + + public abstract long getDateHeader(String s); + + public abstract String getHeader(String s); + + public abstract Enumeration getHeaders(String s); + + public abstract Enumeration getHeaderNames(); + + public abstract int getIntHeader(String s); + + public abstract String getMethod(); + + public abstract String getPathInfo(); + + public abstract String getPathTranslated(); + + public abstract String getContextPath(); + + public abstract String getQueryString(); + + public abstract String getRemoteUser(); + + public abstract boolean isUserInRole(String s); + + public abstract Principal getUserPrincipal(); + + public abstract String getRequestedSessionId(); + + public abstract String getRequestURI(); + + public abstract StringBuffer getRequestURL(); + + public abstract String getServletPath(); + + public abstract HttpSession getSession(boolean flag); + + public abstract HttpSession getSession(); + + public abstract boolean isRequestedSessionIdValid(); + + public abstract boolean isRequestedSessionIdFromCookie(); + + public abstract boolean isRequestedSessionIdFromURL(); +} + +/** + * 对 HTTP 响应信息进行定义 + */ +public interface HttpServletResponse extends ServletResponse { + + public static final int SC_CONTINUE = 100; + public static final int SC_SWITCHING_PROTOCOLS = 101; + public static final int SC_OK = 200; + public static final int SC_CREATED = 201; + public static final int SC_ACCEPTED = 202; + public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203; + public static final int SC_NO_CONTENT = 204; + public static final int SC_RESET_CONTENT = 205; + public static final int SC_PARTIAL_CONTENT = 206; + public static final int SC_MULTIPLE_CHOICES = 300; + public static final int SC_MOVED_PERMANENTLY = 301; + public static final int SC_MOVED_TEMPORARILY = 302; + public static final int SC_SEE_OTHER = 303; + public static final int SC_NOT_MODIFIED = 304; + public static final int SC_USE_PROXY = 305; + public static final int SC_TEMPORARY_REDIRECT = 307; + public static final int SC_BAD_REQUEST = 400; + public static final int SC_UNAUTHORIZED = 401; + public static final int SC_PAYMENT_REQUIRED = 402; + public static final int SC_FORBIDDEN = 403; + public static final int SC_NOT_FOUND = 404; + public static final int SC_METHOD_NOT_ALLOWED = 405; + public static final int SC_NOT_ACCEPTABLE = 406; + public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407; + public static final int SC_REQUEST_TIMEOUT = 408; + public static final int SC_CONFLICT = 409; + public static final int SC_GONE = 410; + public static final int SC_LENGTH_REQUIRED = 411; + public static final int SC_PRECONDITION_FAILED = 412; + public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413; + public static final int SC_REQUEST_URI_TOO_LONG = 414; + public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415; + public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; + public static final int SC_EXPECTATION_FAILED = 417; + public static final int SC_INTERNAL_SERVER_ERROR = 500; + public static final int SC_NOT_IMPLEMENTED = 501; + public static final int SC_BAD_GATEWAY = 502; + public static final int SC_SERVICE_UNAVAILABLE = 503; + public static final int SC_GATEWAY_TIMEOUT = 504; + public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505; + + public abstract void addCookie(Cookie cookie); + + public abstract boolean containsHeader(String s); + + public abstract String encodeURL(String s); + + public abstract String encodeRedirectURL(String s); + + public abstract void sendError(int i, String s) throws IOException; + + public abstract void sendError(int i) throws IOException; + + public abstract void sendRedirect(String s) throws IOException; + + public abstract void setDateHeader(String s, long l); + + public abstract void addDateHeader(String s, long l); + + public abstract void setHeader(String s, String s1); + + public abstract void addHeader(String s, String s1); + + public abstract void setIntHeader(String s, int i); + + public abstract void addIntHeader(String s, int i); + + public abstract void setStatus(int i); +} +``` \ No newline at end of file diff --git a/docs/Tomcat/一个简单的Web服务器代码设计.md b/docs/Tomcat/一个简单的Web服务器代码设计.md new file mode 100644 index 0000000..753e53e --- /dev/null +++ b/docs/Tomcat/一个简单的Web服务器代码设计.md @@ -0,0 +1 @@ +努力编写中... \ No newline at end of file diff --git a/docs/Tomcat/一个简单的servlet容器代码设计.md b/docs/Tomcat/一个简单的servlet容器代码设计.md new file mode 100644 index 0000000..753e53e --- /dev/null +++ b/docs/Tomcat/一个简单的servlet容器代码设计.md @@ -0,0 +1 @@ +努力编写中... \ No newline at end of file diff --git a/images/Tomcat/Servlet主要类图.png b/images/Tomcat/Servlet主要类图.png new file mode 100644 index 0000000000000000000000000000000000000000..8c9c65c043cb4295f6e0c8a5fc0976908ccd0cf0 GIT binary patch literal 73458 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 LPbjA=ntA;X!_rWf literal 0 HcmV?d00001