Servlet的生命周期

一、servlet生命周期

1、  Web容器加载servlet类

2、  初始化servlet对象(构造函数运行)

3、  servlet调用init()方法(servlet一生只调用一次,在容器调用service()方法之前完成)

4、  调用service方法(处理客户请求doGet(),doPost()方法,每个请求都在一个单独的线程中运行)

5、  调用destroy(),容器调用这个方法,从而在servlet被垃圾回收之前有机会回收资源与init()方法一样,也只能调用一次。

二、servlet的体系结构

servlet接口,init(),service()和destory()方法是生命周期方法。

GenericServlet 是一个抽象类,它实现了Servlet接口,实现了大部分基本的servlet方法

public abstract class GenericServlet implements Servlet, ServletConfig,java.io.Serializable

HttpServlet 也是一个抽象类继承GenericServlet,主要实现了一个service方法来处理http的请求与响应。

public abstract class HttpServlet extends GenericServlet 

最后写一个自己的servlet来继承HttpServlet.

三、请求与响应

public interface HttpServletRequest extends ServletRequest 

public interface HttpServletResponse extends ServletResponse

这些都由容器来实现 HttpServletRequest方法与http有关,如cookie,head和session会话,响应也一样。

四、ServletConfig

容器初始化一个servlet时,会为这个servlet建一个唯一的ServletConfig。容器从部署文件"web.xml"读取servlet初始化参数,并把这个参数交给ServletConfig,然后把ServletConfig传递给servlet的init(ServletConfig config)方法。servlet初始化参数只读一次,就是在容器初始化servlet的时候。

@Override
public void init(ServletConfig config) throws ServletException {
  this.config = config;
  this.init();
}

从GenericServlet的init()方法可以看出servlet中的getServletConfig是在初始化的时候创建的,在构造函数时还没有ServletConfig对象,所以在构造函数中不能调用关于ServletConfig对象的方法,如:getInitParameter(),getInitParameterNames()等。

我们使用init()方法只需覆盖无参的方法,因为继承的init(ServletConfig config)方法会自动调用覆盖的无参的init()方法

五、ServletContext

ServletContext指的是servlet整个应用的上下文,是由ServletConfig对象得到的。每个Servlet可以得到ServletContext,并且获得上下文初始化参数。

@Override
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}

<context-param>
  <param-name>email</param-name>
  <param-value>aa@163.com</param-value>
</context-param>

总结;每个servlet有一个ServletConfig,而整个web应用有一个ServletContext。如果应用是分布式应用,每个jvm有一个ServletContext。可以将初始化参数认为是部署时常量。

原文地址:https://www.cnblogs.com/chenxiaocai/p/5277589.html