Servlet的生命周期可以控制的只是初始化、服务、销毁。其它的操作都会由容器来负责完成。
1 基本生命周期
在HttpServlet类里面提供有以下的几个方法来负责生命周期的处理:
1、初始化:public void init() throws ServletException
|————默认情况下是在Servlet第一次使用的时候初始化;
2、服务(主要是处理GET与POST请求):
(1)处理GET请求:protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException
(2)处理POST请求:protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException
3、销毁:public void destroy()
|————一个Servlet长时间不使用,为了保证资源的节约,自动销毁;
|————当容器关闭的时候,自动调用销毁操作;
|————当Tomcat自动重新加载的时候也会销毁。
范例:观察生命周期
package org.lks.demo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class LifeServlet extends HttpServlet {
public void init() throws ServletException {
System.out.println("[LifeServlet] init...");
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[LifeServlet] get...");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[LifeServlet] post...");
}
public void destroy() {
System.out.println("[LifeServlet] destory...");
}
}
<servlet>
<servlet-name>LifeServlet</servlet-name>
<servlet-class>org.lks.servlet.LifeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet</servlet-name>
<url-pattern>/lift.servlet<url-pattern>
</servlet-mapping>
对于初始化的控制方法,也可以在容器启动的时候设置为默认初始化,那么需要在web.xml文件里面增加如下配置:
<load-on-startup>1</load-on-startup>
加入以上的配置之后,Servlet会在容器启动的时候自动进行初始化的操作。
2 扩展生命周期
以上给出的几个操作方法,严格来讲是使用最多的几个方法,但是对于初始化和服务的方法在HttpServlet类里面还是有其他定义的:
(1)初始化方法:public void init(ServletConfig config) throws ServletException
|————可以读取初始化的配置参数数据;
(2)服务方法:
|————GenericServlet:public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
|————HttpServlet:protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException
HttpServlet类中的service()方法是一个普通方法,已经实现好的方法。
范例:观察扩展生命周期
package org.lks.demo;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class LifeServlet extends HttpServlet {
public void init() throws ServletException {
System.out.println("[LifeServlet] init...");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("[LifeServlet] init, parameter: " + config.getInitParameter("data"));
}
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("[LifeServlet] service...");
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[LifeServlet] get...");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[LifeServlet] post...");
}
public void destroy() {
System.out.println("[LifeServlet] destory...");
}
}
<servlet>
<servlet-name>LifeServlet</servlet-name>
<servlet-class>org.lks.demo.LifeServlet</servlet-class>
<init-param>
<param-name>data</param-name>
<param-value>HELLO</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet</servlet-name>
<url-pattern>/lift.servlet<url-pattern>
</servlet-mapping>
此时可以发现无参的初始化方法将不再起作用,而变为了可以读取初始化配置参数的方法执行。同时可以发现,一旦覆写了service()方法之后,doGet()和doPost()两个方法将不再执行了。因为在HttpServlet类中的service()方法里面会接收用户的请求类型,如果发现这个请求类型是GET请求,这个方法自动调用doGet()方法(此方法是交给子类覆写的),也就是说整个Servlet之中如果子类要想处理GET请求就必须覆写doGet()方法,如果要想处理POST请求,就必须按照要求覆写doPost()方法,那么这就是一个最典型的模板设计模式。