Sobes.tech
Middle+

Hogyan valósítható meg a servlet egyidejű indítása az alkalmazás indításával?

sobes.tech MI

Válasz az MI-től

Az alkalmazással egyidejűleg indítandó servlet futtatásához a következő mechanizmusokat használják:

  1. A <load-on-startup> elem a web.xml-ben:

    • A web.xml telepítési leíróban minden olyan servlethez, amelyet az alkalmazás indításakor kell betölteni, hozzáadódik a <load-on-startup> elem.
    • Ennek az elemnek az értéke határozza meg a betöltési sorrendet. Pozitív egész szám esetén ez a sorrend (kisebb számokat előbb tölt be). Ha az érték nulla vagy negatív, akkor a betöltés "késleltetett" módon történik (az első kéréskor).
    • Ha több servlet ugyanazzal az értékkel rendelkezik, a betöltési sorrend nem garantált.
    <!-- web.xml -->
    <web-app>
        <servlet>
            <servlet-name>MyStartupServlet</servlet-name>
            <servlet-class>com.example.MyStartupServlet</servlet-class>
            <load-on-startup>1</load-on-startup> <!-- Betöltés indításkor, elsőként -->
        </servlet>
        <servlet>
            <servlet-name>AnotherStartupServlet</servlet-name>
            <servlet-class>com.example.AnotherStartupServlet</servlet-class>
            <load-on-startup>2</load-on-startup> <!-- Betöltés indításkor, a MyStartupServlet után -->
        </servlet>
        <!-- ... más elemek ... -->
    </web-app>
    
  2. A @WebServlet annotáció loadOnStartup paraméterrel:

    • A servlet konténerek, amelyek támogatják a Servlet 3.0 vagy újabb specifikációt, közvetlenül használhatják a @WebServlet annotációt a servlet osztály felett.
    • A loadOnStartup paraméter ugyanazt a szerepet tölti be, mint a <load-on-startup> elem a web.xml-ben.
    // com.example.MyStartupServlet.java
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet(urlPatterns = "/startup", loadOnStartup = 1) // Betöltés indításkor, sorrend 1
    public class MyStartupServlet extends HttpServlet {
    
        @Override
        public void init(ServletConfig config) throws ServletException {
            super.init(config);
            // Inicializációs kód, amely a servlet indításakor fut
            System.out.println("MyStartupServlet az alkalmazás indításakor inicializálva.");
        }
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().println("Hello from MyStartupServlet!");
        }
    }
    
    // com.example.AnotherStartupServlet.java
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet(urlPatterns = "/another-startup", loadOnStartup = 2) // Betöltés indításkor, sorrend 2
    public class AnotherStartupServlet extends HttpServlet {
    
        @Override
        public void init(ServletConfig config) throws ServletException {
            super.init(config);
            // Inicializációs kód
            System.out.println("AnotherStartupServlet az alkalmazás indításakor inicializálva.");
        }
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().println("Hello from AnotherStartupServlet!");
        }
    }
    

Az alkalmazás indításakor a servlet konténer (pl. Tomcat, Jetty) beolvassa a telepítési leíró fájlt vagy átvizsgálja a servlet osztályokon található annotációkat. A load-on-startup (vagy loadOnStartup) értéke nagyobb vagy egyenlő nullánál, a konténer az init() metódust azonnal meghívja a betöltés és az alkalmazás inicializálása után (Servlet Context). Ez biztosítja, hogy a servlet készen álljon a használatra, még mielőtt az első kérés érkezne.

A fő logika, amelyet az alkalmazás indításakor kell végrehajtani, a init() metódusban valósul meg a servletben.