- 无参构造方法 项目启动后第一次访问时执行 执行1次
- init方法 构造方法执行后执行 执行1次
- service方法 init方法执行后执行 执行n次
- destroy方法 Web服务器关闭时执行 执行1次
看如下代码:
1. init方法书写在service方法之前时
package servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "lifecycle", urlPatterns = "/lifecycle")
public class LifecycleServlet extends HttpServlet {
// 1. 对象的创建
// 无参构造方法
// 用户访问时,创建对象,且该方法只会执行1次
// 即用户刷新页面后,返回控制台,不会看到新的输出信息
public LifecycleServlet() {
System.out.println("LifecycleServlet对象创建了......");
}
// 2. 调用该对象的方法
// 2.1 重写父类的init方法
// 该方法只会执行1次
// 即用户刷新页面后,返回控制台,不会看到新的输出信息
@Override
public void init() throws ServletException {
System.out.println("init方法执行了......");
}
// 2.2 重写父类的service方法
// 该方法会执行n次
// 即用户每刷新一次页面后,返回控制台,都可以看到新的输出信息
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service方法执行了......");
}
// 3. 销毁该对象
// 重写父类的的destroy方法,即销毁方法
// 该方法在关闭Web服务器时执行,所以只会执行1次
@Override
public void destroy() {
System.out.println("destroy方法执行了......");
}
}
点击运行,通过http://localhost:8080/myWeb/lifecycle访问后,控制台输出如下图所示:
2. init方法书写在service方法之后时
package servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "lifecycle02", urlPatterns = "/lifecycle02")
public class Lifecycle02Servlet extends HttpServlet {
public Lifecycle02Servlet() {
System.out.println("Lifecycle02Servlet对象创建了......");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service方法执行了......");
}
@Override
public void init() throws ServletException {
System.out.println("init方法执行了......");
}
@Override
public void destroy() {
System.out.println("destroy方法执行了......");
}
}
点击运行,通过http://localhost:8080/myWeb/lifecycle02访问后,控制台输出如下图所示:
从运行结果中可以观察到,init方法总在service方法之前执行。
进一步,我们设置lifecycle02的loadOnStartup属性值为1,即让Lifecycle02Servlet对象在Web服务器启动时创建,观察运行结果。看如下代码:
package servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "lifecycle02", urlPatterns = "/lifecycle02", loadOnStartup = 1)
public class Lifecycle02Servlet extends HttpServlet {
public Lifecycle02Servlet() {
System.out.println("Lifecycle02Servlet对象创建了......");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service方法执行了......");
}
@Override
public void init() throws ServletException {
System.out.println("init方法执行了......");
}
@Override
public void destroy() {
System.out.println("destroy方法执行了......");
}
}
点击运行后,控制台输出如下图所示:
返回浏览器,通过http://localhost:8080/myWeb/lifecycle02访问后,控制台输出如下图所示:
从运行结果中可以观察到,当Servlet切换为饿汉模式后,init方法也会在Web服务器启动时执行,但它是在构造方法执行后(即对象创建后)执行的,而service方法是在用户访问http://localhost:8080/myWeb/lifecycle02后执行的。总之,不管Servlet采用的是懒汉模式还是饿汉模式,init方法总在service方法之前执行。
刷新页面后,控制台输出如下图所示:
从运行结果中可以观察到,刷新页面后,service方法会再次执行,重复打印输出信息“service方法执行了......” 。
最后,关闭Web服务器后,控制台输出如下图所示:
从运行结果中可以观察到,destroy方法在Web服务器关闭时执行,打印输出信息“destroy方法执行了......”。