Sobes.tech
Middle

როგორ მართავს სერვლეტის კონტეინერი სერვლეტის სიცოცხლის ციკლს? რა მეთოდები იძახება და როდის?

sobes.tech AI

პასუხი AI-სგან

კონტეინერი მართავს სერვლეტის ციკლს მეთოდების ნაკრების საშუალებით: init, service, destroy.

  1. სერვლეტის კლასის ჩატვირთვა: როდესაც კონტეინერი იღებს პირველ მოთხოვნას სერვლეტზე ან აპლიკაციის დაწყებისას (თუ კონფიგურირებულია).

  2. სერვლეტის ინстанციის შექმნა: კონტეინერი ქმნის ერთ ინстанციას სერვლეტის კლასისათვის მთელი აპლიკაციის განმავლობაში.

  3. init()-ის გამოძახება: კონტეინერი ერთჯერადად ახორციელებს init(ServletConfig config) მეთოდის გამოძახებას ინстанციის შექმნის შემდეგ. ამ მეთოდში შესაძლებელია ინიციალიზაცია, რესურსების ჩატვირთვა და სერვლეტის კონფიგურაციის მიღება. მეთოდი არ უნდა იძახოს ისევ, სანამ სერვლეტი არ იქნება განადგურებული და ახალი არ შექმნილი.

    // java
    public void init(ServletConfig config) throws ServletException {
        // სერვლეტის ინიციალიზაცია
        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() მეთოდის გამოძახებას სერვლეტის ინстанციის განადგურებამდე. ეს ხდება აპლიკაციის შეჩერების ან სერვლეტის კონტეინერიდან ამოღებისას. ამ მეთოდში თავისუფლდება რესურსები (მაგალითად, მონაცემთა ბაზის კავშირების დახურვა ან ფაილების დახურვა). destroy-ის გამოძახების შემდეგ, კონტეინერი შეიძლება განახორციელოს გარე მეხსიერების გაწმენდა სერვლეტის ინстанციისთვის.

    // java
    public void destroy() {
        // რესურსების განთავისუფლება
        // მაგალითად, კავშირების დახურვა
    }
    

ციკლი შეიძლება წარმოდგენილი იყოს ცხრილად:

მეთოდი გამოძახება დანიშნულება
init() ერთჯერადად სერვლეტის ინстанციის შექმნის შემდეგ ინიციალიზაცია, რესურსების ჩატვირთვა
service() თითოეული შემომავალი მოთხოვნისთვის მოთხოვნის დამუშავება, პასუხის შექმნა
destroy() ერთჯერადად სერვლეტის ინстанციის განადგურებამდე რესურსების განთავისუფლება, მუშაობის დასრულება

კონტეინერი გარანტირებს, რომ init გამოძახებული იქნება service-ის წინ, ხოლო destroy - service-ის ბოლო გამოძახების შემდეგ. service მეთოდები შეიძლება გამოიძახოს პარალელურად.