{"id":19215034,"url":"https://github.com/chgl16/servlet-study","last_synced_at":"2026-06-14T18:38:11.109Z","repository":{"id":107504341,"uuid":"135586295","full_name":"chgl16/servlet-study","owner":"chgl16","description":"学习Servlet API ，目录结构，各个类和接口的关系，常用的HttpServlet，HttpSession等","archived":false,"fork":false,"pushed_at":"2022-01-04T06:43:51.000Z","size":109,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-23T08:30:03.334Z","etag":null,"topics":["httpservlet","servlet-api"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chgl16.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-05-31T13:18:17.000Z","updated_at":"2022-01-04T06:43:54.000Z","dependencies_parsed_at":"2023-07-14T02:01:33.604Z","dependency_job_id":null,"html_url":"https://github.com/chgl16/servlet-study","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/chgl16/servlet-study","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chgl16%2Fservlet-study","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chgl16%2Fservlet-study/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chgl16%2Fservlet-study/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chgl16%2Fservlet-study/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chgl16","download_url":"https://codeload.github.com/chgl16/servlet-study/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chgl16%2Fservlet-study/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284263585,"owners_count":26975054,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-13T02:00:06.582Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["httpservlet","servlet-api"],"created_at":"2024-11-09T14:12:30.116Z","updated_at":"2025-11-13T18:03:17.037Z","avatar_url":"https://github.com/chgl16.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Servlet-Study\n    Servlet执行流程，生命周期，获取数据，get，post，和客户端交互等\n \n### 1. 包结构\n![包结构1](img-folder/api-1.png)\n![包结构2](img-folder/api-2.png)\n\nhttp子包机构\n![http子包](img-folder/api-3.png)\n\n\u003chr\u003e\n\n### 2. Servlet接口\njavax.servlet.Servlet是一个接口\n```java\npackage javax.servlet;\n\nimport java.io.IOException;\n\npublic interface Servlet {\n    void init(ServletConfig var1) throws ServletException;\n\n    ServletConfig getServletConfig();\n\n    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;\n\n    String getServletInfo();\n\n    void destroy();\n}\n```\n\u003eServletConfig是一个配置文件，可供Servlet初始化。\n\u003e此外重要的是Service方法，也就是这个Servlet的业务。\n\n\u003chr\u003e\n\n### 3. HttpServlet抽象类\n```java\npublic abstract class HttpServlet extends GenericServlet {\n     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n         String protocol = req.getProtocol();\n         String msg = lStrings.getString(\"http.method_get_not_supported\");\n         if (protocol.endsWith(\"1.1\")) {\n             resp.sendError(405, msg);\n         } else {\n             resp.sendError(400, msg);\n         }\n     } \n     \n     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServerException, IOException {\n         ...\n     }\n     \n     protected void doHead(...) { ... }\n     \n     protected void doPut(...) { ... }\n     \n     protected void doDelete(...) { ... }\n     \n     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n         String method = req.getMethod();\n         long lastModified;\n         if (method.equals(\"GET\")) {\n             lastModified = this.getLastModified(req);\n             if (lastModified == -1L) {\n                 this.doGet(req, resp);\n             } else {\n                 long ifModifiedSince = req.getDateHeader(\"If-Modified-Since\");\n                 if (ifModifiedSince \u003c lastModified) {\n                     this.maybeSetLastModified(resp, lastModified);\n                     this.doGet(req, resp);\n                 } else {\n                     resp.setStatus(304);\n                 }\n             }\n         } else if (method.equals(\"HEAD\")) {\n             lastModified = this.getLastModified(req);\n             this.maybeSetLastModified(resp, lastModified);\n             this.doHead(req, resp);\n         } else if (method.equals(\"POST\")) {\n             this.doPost(req, resp);\n         } else if (method.equals(\"PUT\")) {\n             this.doPut(req, resp);\n         } else if (method.equals(\"DELETE\")) {\n             this.doDelete(req, resp);\n         } else if (method.equals(\"OPTIONS\")) {\n             this.doOptions(req, resp);\n         } else if (method.equals(\"TRACE\")) {\n             this.doTrace(req, resp);\n         } else {\n             String errMsg = lStrings.getString(\"http.method_not_implemented\");\n             Object[] errArgs = new Object[]{method};\n             errMsg = MessageFormat.format(errMsg, errArgs);\n             resp.sendError(501, errMsg);\n         }\n     }\n     \n     ...\n}\n```\n\u003e可以看出，HttpServlet是一个类，而且其是直接继承javax.servlet.GenericServlet抽象类。\n\u003e这个GenericServlet是Servlet的基类。它实现了javax.servlet.Servlet接口和javax.servlet.ServletConfig以及序列化接口。如下\n```java\npublic abstract class GenericServlet implements Servlet, ServletConfig, Serializable {\n    ...\n}\n```\n\u003edoPost、doGet等请求处理方法是HttpServlet抽象类特有的，其以上的父类和父类实现的接口都没有。\n\n\u003chr\u003e\n\n### 4. HttpFilter抽象类\nHttpFilter过滤器的定义结构和HttpServlet类似。其也是一个抽象类。直接继承javax.servlet.GenericFilter过滤器的基类。\n```java\npackage javax.servlet.http;\n\nimport java.io.IOException;\nimport javax.servlet.FilterChain;\nimport javax.servlet.GenericFilter;\nimport javax.servlet.ServletException;\nimport javax.servlet.ServletRequest;\nimport javax.servlet.ServletResponse;\n\npublic abstract class HttpFilter extends GenericFilter {\n    public HttpFilter() {\n    }\n\n    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {\n        if (req instanceof HttpServletRequest \u0026\u0026 res instanceof HttpServletResponse) {\n            this.doFilter((HttpServletRequest)req, (HttpServletResponse)res, chain);\n        } else {\n            throw new ServletException(\"non-HTTP request or response\");\n        }\n    }\n\n    protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {\n        chain.doFilter(req, res);\n    }\n}\n```\n这是javax.servlet.GenericFilter基类的定义，实现了三个接口\n```java\npublic abstract class GenericFilter implements Filter, FilterConfig, Serializable {\n    ...\n}\n```\n而起特有的javax.servlet.FilterChain过滤链就是一个接口而已，如下\n```java\npackage javax.servlet;\n\nimport java.io.IOException;\n\npublic interface FilterChain {\n    void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;\n}\n```\n\u003eFilterChain 接口的 doFilter 方法用于通知 Web 容器把请求交给 Filter 链中的下一个 Filter 去处理，\n如果当前调用此方法的 Filter 对象是Filter 链中的最后一个 Filter，那么将把请求交给目标 Servlet 程序去处理。\n\n### 5. HttpSession、HttpServletRequest、HttpServletResponse接口\n    这些都是接口而不是类。\n1. 就Session而言，只有javax.servlet.http.HttpSession这个，这个接口什么都没继承。也不存在javax.servlet.Session这种接口。\n2. HttpServletRequest和HttpServletResponse分别是一个继承ServletRequest和ServletResponse的接口。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchgl16%2Fservlet-study","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchgl16%2Fservlet-study","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchgl16%2Fservlet-study/lists"}