[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:\Tools\apache-tomcat-7.0.55\webapps\08_servlet
九月 12, 2014 8:00:43 下午 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory C:\Tools\apache-tomcat-7.0.55\webapps\08_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()方法被調用,釋放所使用的資源。


轉載說明:請註明作者及原文鏈接,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章