Sobes.tech
Middle
156

Jak kontener serwletów zarządza cyklem życia serwletu? Jakie metody są wywoływane i w jakich momentach?

Odpowiedź od AI

sobes.tech AI

Kontener zarządza cyklem życia serwletu za pomocą zestawu metod: init, service, destroy.

  1. Ładowanie klasy serwletu: Gdy kontener otrzymuje pierwszy żądanie do serwletu lub podczas uruchamiania aplikacji (jeśli jest skonfigurowane).

  2. Tworzenie instancji serwletu: Kontener tworzy pojedynczą instancję klasy serwletu dla całej aplikacji.

  3. Wywołanie init(): Kontener wywołuje metodę init(ServletConfig config) tylko raz po utworzeniu instancji. W tej metodzie można wykonać inicjalizację, załadować zasoby i uzyskać konfigurację serwletu. Metoda nie powinna być wywoływana ponownie, dopóki serwlet nie zostanie zniszczony i odtworzony.

    // java
    public void init(ServletConfig config) throws ServletException {
        // Inicjalizacja serwletu
        this.config = config;
        // Pobieranie parametrów inicjalizacji
        String param = config.getInitParameter("someParam");
    }
    
  4. Wywołanie service(): Dla każdego nadchodzącego żądania, kontener wywołuje metodę service(ServletRequest request, ServletResponse response). Ta metoda obsługuje żądanie i generuje odpowiedź. Zazwyczaj deleguje obsługę do specyficznych metod HTTP (doGet, doPost itd.) w potomkach klasy HttpServlet. Metoda service jest wielowątkowa, kontener może wywołać ją jednocześnie dla wielu żądań.

    // java
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // Sprawdzenie typu żądania i wywołanie odpowiedniej metody
        if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
            // Delegacja do HttpServlet
            super.service(request, response);
        } else {
            // Obsługa innych typów żądań
            throw new ServletException("Obsługiwane są tylko żądania HTTP");
        }
    }
    
    // Przykład metody doXXX w HttpServlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Obsługa żądania GET
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Cześć</h1>");
    }
    
  5. Wywołanie destroy(): Kontener wywołuje metodę destroy() tylko raz przed zniszczeniem instancji serwletu. Dzieje się to podczas zatrzymania aplikacji lub usunięcia serwletu z kontenera. W tej metodzie zwalniane są zasoby (np. zamknięcie połączeń z bazą danych lub plików). Po wywołaniu destroy, kontener może wykonać zbieranie śmieci dla instancji serwletu.

    // java
    public void destroy() {
        // Zwolnienie zasobów
        // Na przykład zamknięcie połączeń
    }
    

Cykl życia można przedstawić w formie tabeli:

Metoda Wywoływana Cel
init() Raz po utworzeniu instancji serwletu Inicjalizacja, ładowanie zasobów
service() Dla każdego nadchodzącego żądania Obsługa żądania, generowanie odpowiedzi
destroy() Raz przed zniszczeniem instancji serwletu Zwolnienie zasobów, zakończenie pracy

Kontener gwarantuje, że init zostanie wywołane przed service, a destroy po ostatnim wywołaniu service. Metody service mogą być wywoływane równolegle.