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:
無論被訪問多少次,最多生成一個例項物件。