Sobes.tech
Middle

Πώς διαχειρίζεται το κοντέινερ των σερβλετών τον κύκλο ζωής του σερβλέτου; Ποια μεθόδους καλούνται και πότε;

sobes.tech AI

Απάντηση από AI

Ο κοντέινερ διαχειρίζεται τον κύκλο ζωής του servlet μέσω μιας σειράς μεθόδων: init, service, destroy.

  1. Φόρτωση κλάσης servlet: Όταν ο κοντέινερ λαμβάνει το πρώτο αίτημα προς το servlet ή κατά την εκκίνηση της εφαρμογής (εάν έχει ρυθμιστεί).

  2. Δημιουργία στιγμιότυπου servlet: Ο κοντέινερ δημιουργεί ένα στιγμιότυπο της κλάσης servlet για ολόκληρη την εφαρμογή.

  3. Κλήση init(): Το κοντέινερ καλεί τη μέθοδο init(ServletConfig config) μία φορά μετά τη δημιουργία του στιγμιότυπου. Σε αυτήν τη μέθοδο μπορεί να πραγματοποιηθεί αρχικοποίηση, φόρτωση πόρων και λήψη διαμόρφωσης servlet. Δεν πρέπει να καλείται ξανά μέχρι να καταστραφεί και να αναδημιουργηθεί το servlet.

    // java
    public void init(ServletConfig config) throws ServletException {
        // Αρχικοποίηση servlet
        this.config = config;
        // Λήψη παραμέτρων αρχικοποίησης
        String param = config.getInitParameter("someParam");
    }
    
  4. Κλήση service(): Για κάθε εισερχόμενο αίτημα, ο κοντέινερ καλεί τη μέθοδο service(ServletRequest request, ServletResponse response). Αυτή η μέθοδος επεξεργάζεται το αίτημα και δημιουργεί την απάντηση. Συνήθως, ανακατευθύνει σε συγκεκριμένες μεθόδους HTTP (doGet, doPost κ.λπ.) στην κλάση HttpServlet. Η μέθοδος service είναι πολυνηματική, και ο κοντέινερ μπορεί να την καλεί ταυτόχρονα για πολλά αιτήματα.

    // java
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // Έλεγχος τύπου αιτήματος και κλήση κατάλληλης μεθόδου
        if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
            // Ανακατεύθυνση στο HttpServlet
            super.service(request, response);
        } else {
            // Επεξεργασία άλλων τύπων αιτημάτων
            throw new ServletException("Μόνο αιτήματα HTTP υποστηρίζονται");
        }
    }
    
    // Παράδειγμα μεθόδου doXXX στο HttpServlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Επεξεργασία GET αιτήματος
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Γειά σου</h1>");
    }
    
  5. Κλήση destroy(): Ο κοντέινερ καλεί τη μέθοδο destroy() μία φορά πριν καταστραφεί το στιγμιότυπο του servlet. Αυτό συμβαίνει κατά τη διακοπή της εφαρμογής ή κατά την αφαίρεση του servlet από τον κοντέινερ. Σε αυτήν τη μέθοδο απελευθερώνονται πόροι (π.χ. κλείσιμο συνδέσεων με βάσεις δεδομένων ή αρχείων). Μετά την κλήση destroy, ο κοντέινερ μπορεί να εκτελέσει συλλογή απορριμμάτων για το στιγμιότυπο του servlet.

    // java
    public void destroy() {
        // Απελευθέρωση πόρων
        // Π.χ. κλείσιμο συνδέσεων
    }
    

Ο κύκλος ζωής μπορεί να παρουσιαστεί σε έναν πίνακα:

Μέθοδος Καλείται Σκοπός
init() Μία φορά μετά τη δημιουργία του στιγμιότυπου του servlet Αρχικοποίηση, φόρτωση πόρων
service() Για κάθε εισερχόμενο αίτημα Επεξεργασία αιτήματος, δημιουργία απάντησης
destroy() Μία φορά πριν καταστραφεί το στιγμιότυπο του servlet Απελευθέρωση πόρων, ολοκλήρωση εργασίας

Ο κοντέινερ διασφαλίζει ότι το init θα καλείται πριν από το service, και το destroy θα καλείται μετά από την τελευταία κλήση του service. Οι μέθοδοι service μπορούν να καλούνται παράλληλα.