私は最近、いくつかのJavaサーブレット技術の面で実験しています。 最近、私はServlet仕様の下にあるweb.xmlのload-on-startupタグを見つけました。 Apache Tomcatでロード・オン・スタートアップがどのように動作するのかを実験し、各サーブレットのサーブレットinit()メソッドを実行する順序は、サーブレット名のアルファベット順web.xmlに定義されています。次のようにApache Tomcatは同じ起動時のロードでサーブレットを実行します
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>
サーブレットクラスは、次のとおりです。
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...
を私はこの振る舞いと矛盾するいくつかのリソースに出くわし、ロードオンスタートアップが複数のser vletsの場合、ディスクリプタに表示される順序によって順序が決定されます。 しかし、What does the servlet <load-on-startup> value signifyを参照すると、仕様にはコンテナの実装に依存するという異なる考えがあります。これは私が経験したものと一致します
このケースで最も正確なメカニズムは何ですか?