Sobes.tech
Middle

Hogyan kezeli a servlet konténer a servlet életciklusát? Milyen módszerek hívódnak meg, és mikor?

sobes.tech MI

Válasz az MI-től

A konténer kezeli a servlet életciklusát egy módszersorozaton keresztül: init, service, destroy.

  1. Servlet osztály betöltése: Amikor a konténer megkapja az első kérést a servlethez vagy az alkalmazás indításakor (ha be van állítva).

  2. Servlet példány létrehozása: A konténer létrehoz egy példányt a servlet osztályból az egész alkalmazás számára.

  3. Az init() hívása: A konténer egyszer hívja meg a init(ServletConfig config) metódust a példány létrehozása után. Ebben a módszerben inicializálás, erőforrások betöltése és a servlet konfigurálása történhet. Ez a módszer nem hívódik meg újra, amíg a servlet nem kerül megsemmisítésre és újra létrehozásra.

    // java
    public void init(ServletConfig config) throws ServletException {
        // Servlet inicializálása
        this.config = config;
        // Inicializációs paraméterek lekérése
        String param = config.getInitParameter("someParam");
    }
    
  4. A service() hívása: Minden bejövő kérés esetén a konténer meghívja a service(ServletRequest request, ServletResponse response) metódust. Ez a metódus feldolgozza a kérést és választ generál. Általában átirányítja a HttpServlet-ben lévő doGet, doPost stb. módszerekhez.

    // java
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // A kérés típusának ellenőrzése és a megfelelő metódus hívása
        if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
            // Átirányítás HttpServlet-re
            super.service(request, response);
        } else {
            // Egyéb típusú kérések kezelése
            throw new ServletException("Csak HTTP kéréseket támogatunk");
        }
    }
    
    // Példa doXXX metódusra az HttpServlet-ben
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // GET kérés kezelése
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Szia</h1>");
    }
    
  5. A destroy() hívása: A konténer egyszer hívja meg a destroy() metódust a servlet példányának megsemmisítése előtt. Ez akkor történik, amikor az alkalmazás leáll vagy a servlet eltávolításra kerül a konténerből. Ebben a módszerben felszabadíthatók az erőforrások (pl. adatbázis-kapcsolatok vagy fájlok bezárása). A destroy hívása után a konténer a szemétgyűjtést is végrehajthatja a servlet példányán.

    // java
    public void destroy() {
        // Erőforrások felszabadítása
        // Pl. kapcsolatok bezárása
    }
    

A életciklus az alábbi táblázatban ábrázolható:

Metódus Meghívás Célja
init() Egyszer a példány létrehozása után Inicializálás, erőforrások betöltése
service() Minden bejövő kérés esetén Kérés feldolgozása, válasz generálása
destroy() Egyszer a példány megsemmisítése előtt Erőforrások felszabadítása, munka befejezése

A konténer garantálja, hogy az init a service hívás előtt, a destroy pedig az utolsó service hívás után történik. A service metódusok párhuzamosan is hívhatók.