2016-04-15 15 views
1

私は最近、いくつかの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を参照すると、仕様にはコンテナの実装に依存するという異なる考えがあります。これは私が経験したものと一致します

このケースで最も正確なメカニズムは何ですか?

答えて

1

まあ、コンテナに依存し、コンテナに依存する動作を観察した仕様があります。

したがって、特定の実装に依存するコードを記述しないでください。

1

読むJSR 340

要素のload-on-startupが Webアプリケーションの起動時に(インスタンス化され、(そのINITを持っている)と呼ばれる)は、このサーブレットは をロードする必要があることを示します。この要素の要素の内容は、サーブレットのロード順序を示す整数 でなければなりません。 の値が負の整数である場合、または要素が存在しない場合、 コンテナは、選択するたびにサーブレットを自由にロードできます。 の値が正の整数または0の場合、アプリケーションのデプロイ時にコンテナがロードされ、サーブレットが初期化されます。コンテナ は、より小さな整数でマークされたサーブレットがより高い整数でマークされる前に がロードされることを保証する必要があります。 コンテナは、同じロード・オン・スタートアップ値を持つサーブレットのロード順序を と選択できます。

[重点鉱山]

1

サーブレットは同じのload-on-startup値がアルファベット順にロードされてきていません。コンテナによって異なりますが、添付のスクリーンショットでTomcat 8と同じコードを参照してください。Execution Screenshot

関連する問題