zoukankan      html  css  js  c++  java
  • [Servlet]Servlet的生命周期

    一般情况下,自定义Servlet都是继承HttpServlet。但通过HttpServlet的继承链,我们知道HttpServlet是实现了Servlet接口,下面列表是Servlet接口提供的所有方法。

    Method Summary
    void destroy()
    ServletConfig getServletConfig()
    String getServletInfo()
    void init(ServletConfig config)
    void service(ServletRequest req, ServletResponse res)

    上述所有方法中,init()、service()和destroy()方法叫做Servlet的生命周期。下面我们分别讨论一下有关生命周期的三个方法:

    • init()方法
      • 在Servlet实例化之后,Servlet容器会调用init()方法,主要是用来完成处理客户端请求之前的初始化工作。
      • init()方法在Servlet的生命周期中只被执行一次。
    • service()方法
      • Servlet容器调用service()方法来处理客户端发送的请求。在service()方法被调用之前,必须保证init()方法被正确执行。
      • service()方法在每次客户端发送请求之后,会被执行一次。
    • destroy()方法
      • 当Servlet容器检测到当前Servlet实例被移除时,会调用destroy()方法,以便让Servlet实例可以释放所使用的所有资源。
      • destroy()方法在Servlet的生命周期中也只被执行一次。

    下面我们通过实际操作来讨论关于Servlet的生命周期是怎么样的:

    • 首先,创建一个Servlet文件,具体如下。
    public class LifeServlet implements Servlet {
    
        public LifeServlet(){
            System.out.println("这里创建了一个Servlet实例对象...");
        }
    
        public void init(ServletConfig config) throws ServletException {
            System.out.println("这是init()方法...");
        }
    
        public void service(ServletRequest req, ServletResponse res)
                throws ServletException, IOException {
            System.out.println("这是service()方法...");
        }
    
        public void destroy() {
            System.out.println("这是destroy()方法...");
        }
    
        public ServletConfig getServletConfig() {
            return null;
        }
        public String getServletInfo() {
            return null;
        }
    }
    
    • 在web.xml文件中,配置有关Servlet信息。
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <servlet>
        <servlet-name>LifeServlet</servlet-name>
        <servlet-class>app.java.servlet.LifeServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>LifeServlet</servlet-name>
        <url-pattern>/servlet/LifeServlet</url-pattern>
      </servlet-mapping>
    </web-app>
    
    • 将Web应用程序发布到Tomcat服务器,并启动Tomcat服务器。

    这里写图片描述

    • 启动Tomcat服务器之后,我们可以查看Tomcat服务器启动的日志内容,并没有有关Servlet信息。
    九月 12, 2014 8:00:41 下午 org.apache.catalina.core.AprLifecycleListener init
    INFO: Loaded APR based Apache Tomcat Native library 1.1.31 using APR version 1.4.8.
    九月 12, 2014 8:00:41 下午 org.apache.catalina.core.AprLifecycleListener init
    INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
    九月 12, 2014 8:00:42 下午 org.apache.catalina.core.AprLifecycleListener initializeSSL
    INFO: OpenSSL successfully initialized (OpenSSL 1.0.1h 5 Jun 2014)
    九月 12, 2014 8:00:42 下午 org.apache.coyote.AbstractProtocol init
    INFO: Initializing ProtocolHandler ["http-apr-8080"]
    九月 12, 2014 8:00:42 下午 org.apache.coyote.AbstractProtocol init
    INFO: Initializing ProtocolHandler ["ajp-apr-8009"]
    九月 12, 2014 8:00:42 下午 org.apache.catalina.startup.Catalina load
    INFO: Initialization processed in 1417 ms
    九月 12, 2014 8:00:42 下午 org.apache.catalina.core.StandardService startInternal
    INFO: Starting service Catalina
    九月 12, 2014 8:00:42 下午 org.apache.catalina.core.StandardEngine startInternal
    INFO: Starting Servlet Engine: Apache Tomcat/7.0.55
    九月 12, 2014 8:00:43 下午 org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory C:Toolsapache-tomcat-7.0.55webapps08_servlet
    九月 12, 2014 8:00:43 下午 org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deployment of web application directory C:Toolsapache-tomcat-7.0.55webapps08_servlet has finished in 377 ms
    九月 12, 2014 8:00:44 下午 org.apache.catalina.startup.Catalina start
    INFO: Server startup in 1766 ms
    

    这里写图片描述

    • 重新刷新页面,再次发送请求,调用Servlet内容。

    这里写图片描述

    • 停止Tomcat服务器,并查看控制台信息。

    这里写图片描述

    通过上述操作,我们可以发现:在第一次向Servlet发送请求时,Tomcat服务器的Servlet容器首先创建Servlet实例对象,再进行Servlet初始化工作,最后调用service()方法来处理请求。第二次向Servlet发送请求时,只调用了service()方法,并没有执行Servlet的构造方法和init()方法。在停止Tomcat服务器时,Servlet的destroy()方法被调用,释放所使用的资源。


    转载说明:请注明作者及原文链接,谢谢!

  • 相关阅读:
    C++ 类初始化的顺序
    Given constant integers x and t, write a function that takes no argument and returns true if the function has been called x number of times in last t secs.
    Find out all the elements in A and B such that the A[i]B[j]=C[k]
    顺时针打印数组,美丽版
    Given a string S, find the longest palindromic substring in S.
    很多机器,每台机器上都有很一部分数据,如何输出分布在所有机器上的所有数据的median
    C++'s mutable and conceptual constness
    上20阶楼梯,可以一次迈1,2,3步,请问有多少种上法?
    Count smaller elements on right side in an array.
    一排房子,连续填色,成本最低的问题
  • 原文地址:https://www.cnblogs.com/longestory/p/4566971.html
Copyright © 2011-2022 走看看