Sobes.tech
Middle

Kā servlet konteineris pārvalda servlet dzīves ciklu? Kādus metodes tiek izsauktas un kad?

sobes.tech AI

Atbilde no AI

Konteiners pārvalda servleta dzīves ciklu, izmantojot metožu kopu: init, service, destroy.

  1. Servleta klases ielāde: Kad konteiners saņem pirmo pieprasījumu uz servlet vai sākot lietojumprogrammu (ja tas ir konfigurēts).

  2. Servleta eksemplāra izveide: Konteiners izveido vienu servleta klases eksemplāru visai lietojumprogrammai.

  3. init() metodes izsaukšana: Konteiners vienreiz izsauc init(ServletConfig config) pēc eksemplāra izveides. Šajā metodē var veikt inicializāciju, ielādēt resursus un saņemt servleta konfigurāciju. Šo metodi nevajadzētu izsaukt vēlreiz, kamēr servlets nav iznīcināts un izveidots jauns.

    // java
    public void init(ServletConfig config) throws ServletException {
        // Servleta inicializācija
        this.config = config;
        // Inicializācijas parametri
        String param = config.getInitParameter("someParam");
    }
    
  4. service() metodes izsaukšana: Katram ienākošajam pieprasījumam konteiners izsauc service(ServletRequest request, ServletResponse response) metodi. Šī metode apstrādā pieprasījumu un ģenerē atbildi. Parasti tā deleģē apstrādi specifiskiem HTTP metožu (doGet, doPost u.c.) izsaukumiem HttpServlet. service metode ir daudzšrādu, konteiners to var izsaukt vienlaicīgi vairākām pieprasījumiem.

    // java
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // Pieprasījuma tipa pārbaude un atbilstošas metodes izsaukšana
        if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
            // Delegācija uz HttpServlet
            super.service(request, response);
        } else {
            // Citi pieprasījumu tipi
            throw new ServletException("Atbalstīti tikai HTTP pieprasījumi");
        }
    }
    
    // doXXX metodes piemērs HttpServlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // GET pieprasījuma apstrāde
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Sveiki</h1>");
    }
    
  5. destroy() metodes izsaukšana: Konteiners vienu reizi izsauc destroy() metodi pirms servleta eksemplāra iznīcināšanas. Tas notiek, apturot lietojumprogrammu vai noņemot servletu no konteinera. Šajā metodē atbrīvo resursus (piemēram, aizver savienojumus ar datu bāzi vai failus). Pēc destroy izsaukšanas konteiners var veikt atkritumu savākšanu servleta eksemplāram.

    // java
    public void destroy() {
        // Resursu atbrīvošana
        // Piemēram, savienojumu aizvēršana
    }
    

Dzīves ciklu var attēlot tabulā:

Metode Izsaukts Mērķis
init() Vienu reizi pēc servleta eksemplāra izveides Inicializācija, resursu ielāde
service() Katram ienākošajam pieprasījumam Pieprasījuma apstrāde, atbildes ģenerēšana
destroy() Vienu reizi pirms servleta eksemplāra iznīcināšanas Resursu atbrīvošana, darba pabeigšana

Konteiners garantē, ka init tiks izsaukts pirms service, bet destroy - pēc pēdējā service izsaukuma. service metodes var tikt izsauktas paralēli.