Servlet的生命周期

  1. 无参构造方法        项目启动后第一次访问时执行               执行1次
  2. init方法                  构造方法执行后执行                             执行1次
  3. service方法           init方法执行后执行                                执行n次
  4. 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方法执行了......”。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值