Sobes.tech
Middle

Servlet konteyneri servletning hayot aylanishini qanday boshqaradi? Qaysi metodlar chaqiriladi va qachon?

sobes.tech AI

AIdan javob

Контейнер сервлетнинг ҳаёт циклларини бошқариш учун 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) методини чақиради. Бу метод сўровни ишлайди ва жавобни яратади. У одатда HttpServletдаги doGet, doPost ва бошқаларга делегатсия қилади. 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 сўровлар қўллаб-қувватланади");
        }
    }
    
    // HttpServletдаги doXXX мисоли
    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 методлари параллель равишда чақирилиши мумкин.