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接口