一、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。可以将初始化参数认为是部署时常量。