zoukankan      html  css  js  c++  java
  • 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:
    在这里插入图片描述
    无论被访问多少次,最多生成一个实例对象。

  • 相关阅读:
    C语言指针的一些题目
    PowerDesigner 物理数据模型(PDM)
    PowerDesigner概念数据模型 CDM
    加密狗原理介绍
    磐石加密狗NT88管理层API
    使用加密狗进行加密的一些策略
    让 PowerDesigner 支持 SQLite!
    防止用户重复登陆
    SQL Server里一些未公开的扩展存储过程
    14个数据库的设计技巧
  • 原文地址:https://www.cnblogs.com/yu011/p/13709224.html
Copyright © 2011-2022 走看看