我一直在嘗試最近的幾個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時,規範似乎有一個不同的觀點,它表明它取決於容器的實現。這匹配我所經歷的
什麼是最準確的機制定義爲這種情況下?