2016-04-15 23 views
1

我一直在嘗試最近的幾個Java Servlet技術方面。 最近,我遇到了Servlet規範下的web.xml的load-on-startup標籤。我試驗了Apache Tomcat中的load-on-startup如何工作,並通過日誌實現了每個servlet的servlet init()方法的執行順序很可能是基於servlet名稱的字母順序而不是servlet的順序在web.xml中定義。Apache Tomcat使用相同的啓動負載執行Servlet

的web.xml文件如下:

<?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_3_1.xsd" 
     version="3.1"> 

    <display-name>Hello-World-Servlet</display-name> 

    <servlet> 
     <servlet-name>hello-world</servlet-name> 
     <servlet-class>org.wso2.carbon.HelloWorld</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet> 
     <servlet-name>all-is-well</servlet-name> 
     <servlet-class>org.wso2.carbon.HelloWorld</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet> 
     <servlet-name>bonjour-monde</servlet-name> 
     <servlet-class>org.wso2.carbon.HelloWorld</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>hello-world</servlet-name> 
     <url-pattern>/hello</url-pattern> 
    </servlet-mapping> 

    <servlet-mapping> 
     <servlet-name>all-is-well</servlet-name> 
     <url-pattern>/well</url-pattern> 
     <url-pattern>/alright</url-pattern> 
    </servlet-mapping> 

    <servlet-mapping> 
     <servlet-name>bonjour-monde</servlet-name> 
     <url-pattern>/bonjour</url-pattern> 
    </servlet-mapping> 

</web-app> 

Servlet類是如下:

public class HelloWorld extends HttpServlet { 
    private static final Logger logger = Logger.getLogger(HelloWorld.class.getName()); 

    @Override 
    public void init() throws ServletException { 
     logger.log(Level.INFO, "The servlet " + getServletName() + " is starting..."); 
    } 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.getWriter().println(getServletName()); 
     if (getServletName().equals("hello-world")) { 
      response.getWriter().println("Hello World!!!"); 
     } else if (getServletName().equals("bonjour-monde")) { 
      response.getWriter().println("Bonjour monde!!!"); 
     } else if (getServletName().equals("all-is-well")) { 
      response.getWriter().println("All izz well!!!"); 
     } 
    } 

    @Override 
    public void destroy() { 
     logger.log(Level.INFO, "The servlet " + getServletName() + " is getting destroyed..."); 
    } 
} 

當我檢查Tomcat的記錄是如下:

15-Apr-2016 14:41:12.678 INFO [localhost-startStop-1] org.wso2.carbon.HelloWorld.init The servlet all-is-well is starting... 
15-Apr-2016 14:41:12.680 INFO [localhost-startStop-1] org.wso2.carbon.HelloWorld.init The servlet bonjour-monde is starting... 
15-Apr-2016 14:41:12.680 INFO [localhost-startStop-1] org.wso2.carbon.HelloWorld.init The servlet hello-world is starting... 

我遇到了一些與此行爲相矛盾的資源,並提到如果啓動時加載對於多個服務器是相同的它們出現在描述符中的順序決定了順序。 但是當提到以下What does the servlet <load-on-startup> value signify時,規範似乎有一個不同的觀點,它表明它取決於容器的實現。這匹配我所經歷的

什麼是最準確的機制定義爲這種情況下?

回答

1

那麼,你有規範說明它是容器相關的,並且你已經觀察到容器相關的行爲。

所以,不要編寫依賴於任何特定實現的代碼。

1

閱讀JSR 340

時加載的啓動元素表明這個servlet應該是 載入(實例化,有其所謂的init())在 Web應用程序的啓動。此元素的元素內容必須是一個整數,指示應該加載servlet的順序。如果 的值是負整數,或者該元素不存在,則只要選擇該容器,該容器就可以自由加載該servlet。如果 值爲正整數或0,則容器必須加載,並且在部署應用程序時初始化該servlet。容器 必須保證在用較高整數標記的servlet之前加載標記爲較低整數的小服務程序 。 容器可以選擇 加載啓動時的值相同的servlet的順序爲

[着重礦]

1

Servlet的是沒有得到加載的字母順序爲相同負載上啓動值上。這取決於容器,請參考附帶的截圖與Tomcat 8相同的代碼。Execution Screenshot