1. 与 Servlet 主动关联的是三个类,分别是 ServletConfig、ServletRequest 和 ServletResponse。这三个类都是通过容器传递给 Servlet 的,其中 ServletConfig 是在 Servlet 初始化时就传给 Servlet 了,而后两个是在请求达到时调用 Servlet 时传递过来的。
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 的类转化如下图所示:
3. 了解servlet还需要了解它在Tomcat中怎么运行的:参考:https://www.ibm.com/developerworks/cn/java/j-lo-servlet/
4.
javax.servlet.Servlet接口:Servlet接口的基本目标是提供生命期方法init()、service()和destroy()方法。
——》javax.servlet.GenericServlet类(协议无关版本)——》javax.servlet.http.HttpServlet类(HTTP版本)
协议无关的版本和协议有关的版本有什么区别呢?
GenericServlet是一个模板,未来可以使用这个模板去发展单独用于上传文件的关于FTP的servlet~
关于init();
如果在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接口