servlet的生命周期

发布于:2024-06-28 ⋅ 阅读:(21) ⋅ 点赞:(0)

1、Servlet的生命周期就是servlet类对象什么时候创建?什么时候调用对应的方法,什么时候销毁。

对象的生命周期:

Student student = new Student(); //创建对象
student.setName("eric"); // 使用对象
student.show();// 使用对象
student = null; // 销毁对象

也就是说自定义对象的生命周期由我们程序员自己手动控制。但是!!!Servlet它不是一个普通的java类。是一个被tomcat服务器调用的。所以Servlet是生命周期是被tomcat服务器去控制的。

2、servlet生命周期中重要的方法
  • 构造方法:创建servlet的时候调用。默认情况下,第一次访问servlet的时候,会创建servlet对象。此时会有且只会调用1次构造函数,证明了servlet对象是单实例的。

  • init方法:创建完servlet对象之后调用,也只是会调用1次。

  • service方法:提供服务的方法,接收用户的请求,并处理用户的请求,然后响应用户的请求。每次发送请求,都会调用service方法。调用几次,service方法会执行几次。

  • destroy方法:销毁的方法。销毁servlet对象的时候调用。比如我们停止tomcat服务器或者重新部署tomcat服务器,都会销毁servlet对象,只会调用1次。

 3、 tomcat服务器内部执行代码的原理

//1、用户发送请求,tomcat服务器会根据用户发送的请求,解析web.xml配置文件,获取servlet-class的全限定名路径(com.by.servlet.ServletDemo)
//2、获取字节码对象,然后通过字节码对象获取对应的实例对象
Class clazz = Class.forName("com.by.servlet.ServletDemo");
Object o = clazz.newInstance();
//3、创建ServletConfig对象,然后调用init方法
Method method = clazz.getDeclaredMethod("init",ServletConfig.class);// 获取方法对象
method.invoke(o,config);
//4、创建request对象,创建response对象,然后调用service方法
Method m = clazz.getDeclaredMethod("service",ServletRequest.class,ServletResponse.class);
m.invoke(o,request,response);
//5、销毁servlet实例对象,也是通过反射的机制实现的
Method m1 = clazz.getDeclaredMethod("destroy",null);
m1.invoke(o,null);

4、测试

设置打包方式

<packaging>war</packaging>

 添加依赖

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>

 新建LifeCycleServlet类

package com.by.servlet;

import javax.servlet.*;
import java.io.IOException;

public class LifeCycleServlet implements Servlet {

    public LifeCycleServlet() {
        System.out.println("构造器方法被调用。。。。");
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init方法被调用,创建完sevlet对象后调用。。。。");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("service方法被调用,提供服务的方法被调用。。。。。。");
        //设置响应给浏览器的数据
        res.setContentType("text/html;charset=utf-8");
        res.getWriter().write("<h1>hello<h1>");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destroy方法被调用。。。。。。。。");
    }
}

在web.xml中添加

<servlet>
        <servlet-name>LifeCycleServlet</servlet-name>
        <!--     servlet-name要和servlet-mapping所对应,映射的关系-->
        <servlet-class>com.by.servlet.LifeCycleServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>LifeCycleServlet</servlet-name>
        <url-pattern>/he</url-pattern>
    </servlet-mapping>

测试结果