1. 與 Servlet 主動關聯的是三個類,分別是 ServletConfig、ServletRequest 和 ServletResponse。這三個類都是經過容器傳遞給 Servlet 的,其中 ServletConfig 是在 Servlet 初始化時就傳給 Servlet 了,然後兩個是在請求達到時調用 Servlet 時傳遞過來的。java
2. Tomcat 一接受到請求首先將會建立 org.apache.coyote.Request 和 org.apache.coyote.Response,這兩個類是 Tomcat 內部使用的描述一次請求和相應的信息類它們是一個輕量級的類,它們做用就是在服務器接收到請求後,通過簡單解析將這個請求快速的分配給後續線程去處理,因此它們的對象很小,很容易被 JVM 回收。接下去當交給一個用戶線程去處理這個請求時又建立 org.apache.catalina.connector. Request 和 org.apache.catalina.connector. Response 對象。這兩個對象一直穿越整個 Servlet 容器直到要傳給 Servlet,傳給 Servlet 的是 Request 和 Response 的門面類 RequestFacade 和 RequestFacade,這裏使用門面模式與前面同樣都是基於一樣的目的——封裝容器中的數據。一次請求對應的 Request 和 Response 的類轉化以下圖所示:web
3. 瞭解servlet還須要瞭解它在Tomcat中怎麼運行的:參考:https://www.ibm.com/developerworks/cn/java/j-lo-servlet/apache
4. 服務器
javax.servlet.Servlet接口:Servlet接口的基本目標是提供生命期方法init()、service()和destroy()方法。spa
——》javax.servlet.GenericServlet類(協議無關版本)——》javax.servlet.http.HttpServlet類(HTTP版本)線程
協議無關的版本和協議有關的版本有什麼區別呢?code
GenericServlet是一個模板,將來能夠使用這個模板去發展單獨用於上傳文件的關於FTP的servlet~orm
關於init();xml
若是在web.xml中聲明瞭當服務器啓動的時候自動調用,否則它的init方法會將在第一次請求的時候被調用!對象
javax.servlet.servlet原始接口
package javax.servlet; import java.io.IOException; public interface Servlet { void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy(); }
javax.servlet.servlet原始接口——》javax.servlet.GenericServlet抽象類
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { private static final String LSTRING_FILE = "javax.servlet.LocalStrings"; private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings"); private transient ServletConfig config; public GenericServlet() { }
javax.servlet.servlet原始接口——》javax.servlet.GenericServlet抽象類——》javax.servlet.http.HttpServlet
package javax.servlet.http; import java.io.IOException; import java.lang.reflect.Method; import java.text.MessageFormat; import java.util.Enumeration; import java.util.ResourceBundle; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public abstract class HttpServlet extends GenericServlet { 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"); public HttpServlet() { }
——》javax.servlet.ServletRequest類(協議無關版本)——》javax.servlet.http.HttpServletRequest接口(HTTP版本)
public interface HttpServletRequest extends ServletRequest {
package javax.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Enumeration; import java.util.Locale; import java.util.Map; public interface ServletRequest {
——》javax.servlet.ServletResponse接口(協議無關版本)——》javax.servlet.http.HttpServletResponse接口(HTTP版本)
public interface HttpServletResponse extends ServletResponse {
package javax.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Locale; public interface ServletResponse {
——》javax.servlet.ServletContext接口
——》javax.servlet.http.HttpSession接口