前言
Servlet是Servlet+Applet的缩写,表示一个服务器应用。
Servlet是一个接口,是javaweb开发的一套规范。
继承树
GenericServlet详解
GenericServlet是与具体协议无关的。
可以看到GenericServlet
是一个抽象类,实现了Servlet
和ServletConfig
接口。
1 2 3 4 5
| public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable{ private transient ServletConfig config; }
|
Servlet接口在GenericServlet中的实现
先看Servlet
接口,它实现了以下方法。
1 2 3 4 5 6 7 8 9
| public interface Servlet { public void init(ServletConfig config); public void destroy(); public ServletConfig getServletConfig(); public void service(ServletRequest req, ServletResponse res); public String getServletInfo(); }
|
根据这些方法,在GenericeServlet
中找到其实现。
主要是对init
进行了实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable{ private transient ServletConfig config; public void init(ServletConfig config) throws ServletException { this.config = config; this.init(); }
public void init() throws ServletException { } public ServletConfig getServletConfig() { return config; } public void destroy() {} public String getServletInfo() { return ""; } public abstract void service(ServletRequest req, ServletResponse res); }
|
ServletConfig接口在GenericServlet中的实现
先看ServletConfig
接口,它实现了以下方法。
1 2 3 4 5 6
| public interface ServletConfig { public String getServletName(); public ServletContext getServletContext(); public String getInitParameter(String name); public Enumeration<String> getInitParameterNames(); }
|
根据这些方法,在GenericeServlet
中找到其实现。
全部都是通过ServletConfig
对象进行实现的,而ServletConfig
是由Web容器注入的,由Servlet实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable{ public String getServletName() { return getServletConfig().getServletName(); } public ServletContext getServletContext() { return getServletConfig().getServletContext(); } public String getInitParameter(String name) { return getServletConfig().getInitParameter(name); } public Enumeration<String> getInitParameterNames() { return getServletConfig().getInitParameterNames(); } }
|
HttpServlet详解
很明显,GenericServlet只留下了service
这个方法给HttpServlet进行重写。
并根据不同的请求类型,调用不同的doXxx
方法。
doXxx
必须重写,否则在调用时会出现异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public abstract class HttpServlet extends GenericServlet{ @Override public void service(ServletRequest req, ServletResponse res){ HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; service(request, response); } protected void service(HttpServletRequest req, HttpServletResponse resp) { String method = req.getMethod(); if (method.equals(METHOD_GET)) { doGet(req, resp); } else if (method.equals(METHOD_HEAD)) { doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { } } }
|
Http的各种请求类型
请求类型 |
作用 |
Get |
|
Post |
|
Put |
|
Delete |
|
Head |
调用doGet方法,返回空body的Response |
Options |
调试工作,返回所有支持的处理类型的集合 |
Trace |
调试工作,远程诊断服务器,将接收到的header原封不动地返回 |