1.Servlet继承结构
Servlet——接口
↑继承
GenericServlet——抽象类
↑继承
HttpServlet——抽象类:推荐使用
Servlet接口:定义了Servlet的基本功能
|-GenericServlet:实现了Servlet接口,并且实现了Servlet接口中的大部分方法,但是没有实现Service方法,需要子类去实现
|-HttpServlet:继承了GenericServlet,并且实现了service方法,此方法中根据不同的请求方式调用对应的doxxx()方 法,因此我们开发Servlet时,只需要继承HttpServlet并重写doGet()和doPost()方法即可
源码继承关系如下:
//Servlet
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
/
//GenericServlet
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
public GenericServlet() {
}
public void destroy() {
}
...
//
//HttpServlet
public abstract class HttpServlet extends GenericServlet {
private static final long serialVersionUID = 1L;
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 final ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");
public HttpServlet() {
}
......
2.Servlet生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
简单流程为:
2.1创建:Servlet实例是在第一次被访问时创建,创建之后,会立即调用init()方法进行初始化
2.2贮存:初始化结束后,Servlet一直贮存在服务器中,在此期间,如果有请求过来,会调用service方法进行服务,直到服务器关闭
2.3销毁:web应用销毁时随之销毁,在销毁之前会调用destroy方法善后
补充:Servlet的生命周期是指:创建Servlet实例化后响应客户请求直至销毁的全过程。Servlet的生命周期是由Servlet容器管理的,并不是Servlet实例
Servlet生命周期的三个方法:init()--service()--destory()
1.Servlet的创建:Servlet在第一次被访问时就创建了对象,对象的创建(实例化)是由服务器来完成的,并不是init()方法创建的Servlet对象。对象创建后一直驻留在内存中直到服务器关闭或者web应用移除容器时,随着web应用的销毁Servlet对象被销毁掉。
Servlet实例为一个单例对象,从头到尾只有一个,而其创建在于第一次被调用(第一次处理请求),这是一种默认行为。
如果在web.xml中配置了如下代码,那么服务器启动时就能创建该Servlet对象:
<servlet>
<load-on-startup>1</load-on-startup></servlet>
2.当Servlet对象创建后,Servlet容器调用Servlet的init()方法,完成初始化
有时候希望在servlet首次载入时,执行复杂的初始化任务,但并不想每个请求都重复这些任务的时候,用init()方法他在servlet初次创建时被调用,之后处理每个用户的请求时,则不在调用这个方法。因此,他主要用于一次性的初始化,和applet的init方法相同。
由于servlet初始化参数的使用非常依赖于部署描述文件(web.xml),该文件可存放servlet所需要的起始参数以及web应用程序的结构数据。当servlet容器读取web.xml文件内容后。可以将这些起始参数封装成一个对象并在调用init方法时传递个servlet,这个对象就是ServletConfig对象所以我们可以在Servlet内覆写init方法,并通过ServletConfig对象来取得某些初始参数。
以init参数的名称为参数,调用ServletConfig的getInitParameter方法。返回值就是init参数的值3.当对servlet发起请求时,Servlet容器会调用service()方法处理请求,每次调用Servlet都会导致service()方法的执行
4.服务器关闭或者web应用移除容器时,随着web应用的销毁Servlet对象被销毁掉,在Servlet实例释放后,才会调用destory()方法执行善后操作,并不是destory()方法释放的Servlet实例。