Sobes.tech
Middle
159

Hoe beheert de servlet-container de levenscyclus van de servlet? Welke methoden worden aangeroepen en op welke momenten?

Antwoord van AI

sobes.tech AI

Het container beheert de levenscyclus van de servlet via een set methoden: init, service, destroy.

  1. Het laden van de servletklasse: Wanneer de container de eerste aanvraag naar de servlet ontvangt of bij het starten van de applicatie (indien geconfigureerd).

  2. Het maken van een instantie van de servlet: De container maakt één instantie van de servletklasse voor de hele applicatie.

  3. Aanroep van init(): De container roept de methode init(ServletConfig config) slechts één keer aan na het maken van de instantie. In deze methode kunnen initialisaties worden uitgevoerd, resources worden geladen en de configuratie van de servlet worden verkregen. Deze methode mag niet opnieuw worden aangeroepen totdat de servlet is vernietigd en opnieuw gemaakt.

    // java
    public void init(ServletConfig config) throws ServletException {
        // Initialisatie van de servlet
        this.config = config;
        // Ophalen van initialisatieparameters
        String param = config.getInitParameter("someParam");
    }
    
  4. Aanroep van service(): Voor elke inkomende aanvraag roept de container de methode service(ServletRequest request, ServletResponse response) aan. Deze verwerkt de aanvraag en genereert het antwoord. Meestal delegeert hij de verwerking aan specifieke HTTP-methoden (doGet, doPost, etc.) in subklassen van HttpServlet. De service-methode is multithreaded, de container kan deze gelijktijdig voor meerdere aanvragen aanroepen.

    // java
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // Controleer het type aanvraag en roep de juiste methode aan
        if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
            // Delegatie naar HttpServlet
            super.service(request, response);
        } else {
            // Verwerking van andere aanvraagtypes
            throw new ServletException("Alleen HTTP-aanvragen worden ondersteund");
        }
    }
    
    // Voorbeeld van doXXX-methode in HttpServlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Verwerking van GET-aanvraag
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Hallo</h1>");
    }
    
  5. Aanroep van destroy(): De container roept de methode destroy() slechts één keer aan voordat de servlet wordt vernietigd. Dit gebeurt bij het stoppen van de applicatie of bij het verwijderen van de servlet uit de container. In deze methode worden resources vrijgegeven (bijvoorbeeld, sluiten van verbindingen met databases of bestanden). Na de aanroep van destroy kan de container garbage collection uitvoeren voor de servlet-instantie.

    // java
    public void destroy() {
        // Resources vrijmaken
        // Bijvoorbeeld, verbindingen sluiten
    }
    

De levenscyclus kan worden weergegeven in tabelvorm:

Methode Wordt aangeroepen Doel
init() Eén keer na het maken van de servlet-instantie Initialisatie, laden van resources
service() Voor elke binnenkomende aanvraag Verwerking van de aanvraag, genereren van antwoord
destroy() Eén keer voordat de servlet wordt vernietigd Resources vrijmaken, werk afronden

De container garandeert dat init wordt aangeroepen vóór service, en dat destroy wordt aangeroepen na de laatste service-aanroep. De service-methoden kunnen parallel worden aangeroepen.