1. 程式人生 > >load-on-startup 引數大小 Servlet 啟動優先順序

load-on-startup 引數大小 Servlet 啟動優先順序

最近閒來無聊,測試了下 load-on-startup 關於 Servlet 的優先順序。看到網上有些帖子說,load-on-startup 的取值 0 或 負整數時,在啟動 Tomcat 時,Servlet 就會優先被載入(取負時會 預設成0),經過本人測試,當 load-on-startup 取0 時,Servlet 會優先被載入,但是取負值時,Tomcat 不會載入Servlet 。

     另外就是,看到有人說 當load-on-startup 取值 為 異常值(如 浮點數、字串等)時,xml 會報錯,但是仍然可以正常啟動專案,底層 會有一些處理,將 異常資料 設定為0,Tomcat 會優先載入 異常的Servlet。但是當我測試的時候發現,如果出現異常,Tomcat 不會載入 異常的Servlet。

接下來是網上的一些說法:

1)load-on-startup 元素標記容器是否應該在啟動的時候載入這個servlet,(例項化並呼叫其init()方法)。

2)它的值必須是一個整數,表示servlet應該被載入的順序

3)如果該元素不存在或者這個數為負時,則容器會當該Servlet被請求時,再載入。

4)當值為0或者大於0時,表示容器在應用啟動時就載入並初始化這個servlet;

5)正數的值越小,該servlet的優先順序越高,應用啟動時就越先載入。

6)當值相同時,容器就會自己選擇順序來載入。(當然我寫了幾個測試程式,沒有抓住它的規律性,我們暫且理解為容器自主選擇!)


以下是小編 親自測試後的結果:

首先建立了5個Servlet S1-S5

然後在web.xml 中註冊,並進行測試:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>webXml</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
      <servlet-name>S1</servlet-name>
      <servlet-class>com.web.servlet.S1</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
      <servlet-name>S2</servlet-name>
      <servlet-class>com.web.servlet.S2</servlet-class>
      <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet>
      <servlet-name>S3</servlet-name>
      <servlet-class>com.web.servlet.S3</servlet-class>
      <load-on-startup>3</load-on-startup>
  </servlet>
  <servlet>
      <servlet-name>S4</servlet-name>
      <servlet-class>com.web.servlet.S4</servlet-class>
      <load-on-startup>4</load-on-startup>
  </servlet>
  <servlet>
      <servlet-name>S5</servlet-name>
      <servlet-class>com.web.servlet.S5</servlet-class>
      <load-on-startup>5</load-on-startup>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>S1</servlet-name>
      <url-pattern>/s1</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
      <servlet-name>S2</servlet-name>
      <url-pattern>/s2</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
      <servlet-name>S3</servlet-name>
      <url-pattern>/s3</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
      <servlet-name>S4</servlet-name>
      <url-pattern>/s4</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
      <servlet-name>S5</servlet-name>
      <url-pattern>/s5</url-pattern>
  </servlet-mapping>
</web-app>


(1)首先  按照S1-S5 設定優先順序為 由小到大的整數,修改了多次優先順序進行測試;
 測試結果都是:

  

 顯而易見,按照 正整數 進行設定 優先順序,數字小的 優先順序 高於 數字大的 優先順序。

(2)接下來 測試 0 與 負整數(S1=1,S2=0,S3=6,S4=3,S5=2)

  測試結果 按照優先順序0,1,2,3,6 載入順序載入Servlet,證明0 優先載入。

然後 測試負數(S1=5,S2=0,S3=-2,S4=-4,S5=3)

Tomcat 載入結果 S2,S5,S1(優先順序 0,3,5 ),Tomcat 並 沒有 載入 優先順序 為 負數 的Servlet,只是載入了三個 優先順序

取值為 非負數 的Servlet。證明 當load-on-startup 取值為負整數時,Tomcat 不會報錯,能夠正常啟動,但是Servlet 不能

被初始化。

(3)接下來 測試 異常值(浮點數、字串等):(S1=0,S2=X,S3=2.3,S4=12,S5=6)

在編譯階段,load-on-startup 取值 字串 和 浮點數,兩個Servlet 配置都報錯,其他三個正常,啟動後 Tomcat 發生異常,

並且 五個Servlet 沒有一個初始化成功,Tomcat 無法正常啟動。結果顯而易見,Tomcat 底層不會 將異常值 賦值 0併成功初

始化Servlet,而是 Tomcat 根本就不能初始化 Servlet。

(4)接下來測試 當多個Servlet 優先順序值相同時,Tomcat 會按照什麼順序 初始化Servlet 呢?

我將 S1-S5 優先順序全部設定成 1、2、3、4、5分別進行測試,結果,優先順序相同的情況下,S1、S2最後被載入,其他的按照順序

進行載入。不信邪的我又添加了兩個Servlet ,結果還是 S2最後被初始化,S1倒數第二被初始化,其他的按照順序 從上到下進行

初始化。

然後我又 將 xml 中 Servlet 的順序按照 S1,S4,S3,S2,S7,S5,S8 的順序調整了下,還是 S3,S4,S5,S7,S8,S1,S2的初始化順序。

然後 我又 將 Servlet-mapping 的順序打亂了,再啟動,發現 Servlet 初始化順序沒有發生變化。

後來 我又 測試了 只剩下S1,S3,S5;  S1,S2,S3; S2,S4,S5;S4,S5,S6 幾組測試,發現 初始化順序 都是按照 S2最後

初始化,S1 倒數第二初始化,其他的按照數字從小到大初始化。測試時將 對映順序也打亂了,結果還是這個規律,但是具體是

為什麼,小編也不清楚,網上搜了下也沒得到想要的答案,如果有大神知道原因請不吝賜教,萬分感謝。

(4)接下來手下 <load-on-startup></load-on-startup> 這種情況,網上有人說這種情況會當成 0 優先順序 在Tomcat 啟動

時最優先被載入,結果 小編測試了下,結果是 Tomcat 啟動異常,所有 Servlet 都不能被初始化。

(5)關於取值範圍,小編測試了下,將 Servlet 優先順序設定成十幾位,依然能夠正常初始化,所有下邊總結了下

load-on-startup的取值問題:

①、非負的整型:優先順序按照 優先初始化 0 級別,數字越大初始化越靠後,也就是數字小的優先初始化。

②、相同級別的:S3--.... S1,S2 的順序,具體原因由於時間問題 沒具體搞清楚,以後有時間弄懂了會補上。

③、異常值:優先順序 取值異常時,Tomcat 不會賦值 0,而是報 啟動異常,不能正常初始化 Servlet。

④、<load-on-startup></load-on-startup>這種昂情況也不能正常啟動Tomcat
--------------------- 
轉自:https://blog.csdn.net/qq_38082911/article/details/79187658