Servlet的生命周期

Servlet的生命周期

当Servlet被装载到容器后,生命周期开始。首先调用init()方法进行初始化,初始化后,调用service()方法,根据请求的不同调用不同的doXXX()方法处理客户请求,并将处理结果封装到HttpServletResponse中返给客户端。当Servlet对象从容器中移除时调用其destroy( )方法,这就是Servlet 运行的整个过程。
1、客户端请求该Servlet。
2、加载Servlet类到内存。
3、实例化并调用init( )方法初始化该Servlet。
4、service()【根据请求方法不同调用doGet()或者doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()、 destroy() 】。
5、加载和实例化Servlet。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet。

Servlet对象的执行流程图

在这里插入图片描述
1、网站中所有的Servlet接口实现类的实例对象,只能由Http服务器负责创建。开发人员不能手动创建Servlet接口实现类的实例对象。
2、在默认的情况下, Http服务器接收到对于当前Servlet接口实现类第一次请求时自动创建这个Servlet接口实现类的实例对象。
3、在手动配置情况下,要求Http服务器在启动时自动创建某个Servlet接口实现类的实例对象

<servlet>
        <load-on-startup>整数</load-on-startup>
</servlet>

4、在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象。
5、在Http服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁。

关于load-on-startup

1、load-on-startup 元素标记容器是否应该在web应用程序启动的时候就加载这个Servlet ,(实例化并调用其init()方法)。
2、它的值必须是一个整数,表示Servlet 被加载的先后顺序。
3、如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
4、如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个Servlet ,值越小,Servlet 的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。

典型的Servlet生命周期方案

1、第一个到达服务器的HTTP请求被委派到Servlet容器。
2、Servlet 容器在调用service()方法之前加载Servlet。
3、然后Servlet容器处理由多个线程产生的多个请求,每个线程执行个单一的Servlet实例的service()方法。

示例

package com.zyh.contrller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class oneServlet extends HttpServlet {

    public oneServlet() {
        System.out.println("oneServlet类被创建实例对象!");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
        System.out.println();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
        System.out.println("oneServlet:doGet is running...");
    }
}
package com.zyh.contrller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class twoServlet extends HttpServlet {

    public twoServlet() {
        System.out.println("twoServlet类被创建实例对象!");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("twoServlet:doGet is running...");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>oneServlet</servlet-name>
        <servlet-class>com.zyh.contrller.oneServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>twoServlet</servlet-name>
        <servlet-class>com.zyh.contrller.twoServlet</servlet-class>
        <!--通知Tomcat在启动时负责创建twoServlet实例对象-->
        <load-on-startup>10</load-on-startup>
    </servlet>


    <servlet-mapping>
        <servlet-name>oneServlet</servlet-name>
        <url-pattern>/xx</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>twoServlet</servlet-name>
        <url-pattern>/hh</url-pattern>
    </servlet-mapping>
</web-app>

启动Tomcat:
在这里插入图片描述
加上/xx:
在这里插入图片描述
在这里插入图片描述
加上/hh:
在这里插入图片描述
在这里插入图片描述
再次访问/hh:
在这里插入图片描述
无论被访问多少次,最多生成一个实例对象。

原文地址:https://www.cnblogs.com/yu011/p/13709224.html