Життєвий цикл JSP: пояснення фаз та діаграми
⚡ Розумний підсумок
Життєвий цикл JSP описує, як контейнер перетворює сторінку в сервлет, компілює її, завантажує клас, створює екземпляр, ініціалізує його, обслуговує кожен запит через згенерований метод сервісу та, нарешті, знищує його.

Що таке життєвий цикл JSP?
Життєвий цикл JSP визначається як перетворення JSP-сторінки в сервлет, оскільки JSP-сторінку необхідно перетворити на сервлет, перш ніж вона зможе обробляти запити на обслуговування. Життєвий цикл починається зі створення JSP і закінчується знищенням екземпляра сервлета, згенерованого з нього.
Оскільки згенерований клас є звичайним сервлетом, все, що ви вже знаєте про сервлет, можеtracвсе ще застосовується. Java Код, який записує контейнер, і є тим, що насправді виконується; JSP-файл — це лише вихідний код, який ви підтримуєте.
Різні фази життєвого циклу JSP
Коли браузер запитує JSP, механізм JSP спочатку перевіряє, чи потрібно компілювати сторінку. Якщо JSP ніколи не компілювався або був змінений з моменту останньої компіляції, тоді механізм JSP компілює сторінку.
Процес компіляції JSP-сторінки складається з трьох кроків:
- Розбір JSP
- Перетворення JSP на сервлет
- Компіляція сервлета
Діаграма життєвого циклу JSP
Життєвий цикл JSP зображено на діаграмі нижче, яка tracявляє собою одну сторінку від вихідного файлу до класу, який виконує контейнер.
Наступні кроки пояснюють життєвий цикл JSP:
- Переклад сторінки JSP
- Компіляція JSP-сторінки (компіляція JSP-сторінки в _jsp.java)
- Завантаження класів (_jsp.java конвертується у файл класу _jsp.class)
- Створення екземпляра (створюється об'єкт згенерованого сервлета)
- Ініціалізація (контейнер викликає метод jspInit())
- Обробка запитів (контейнер викликає метод _jspService())
- Знищити (контейнер викликає метод jspDestroy())
Пояснення фаз життєвого циклу JSP
Давайте розглянемо кожен з перерахованих вище пунктів детальніше.
1) Переклад сторінки JSP:
A Java Файл сервлета генерується з вихідного файлу JSP. Це перший крок життєвого циклу JSP. На етапі перекладу контейнер перевіряє синтаксичну правильність файлів сторінок та тегів JSP.
- JSP-контейнер інтерпретує стандартні директиви та дії, а також користувацькі дії, що посилаються на бібліотеки тегів (усі вони є частиною JSP-сторінки та розглядаються в Елементи JSP посібник), що використовується на цій сторінці JSP.
- У наведеному вище зображенні demo.jsp на першому кроці перетворюється на demo_jsp.java.
Візьмемо приклад «demo.jsp», як показано нижче:
Demo.jsp
<html>
<head>
<title>Demo JSP</title>
</head>
<%
int demvar=0;%>
<body>
Count is:
<% Out.println(demovar++); %>
<body>
</html>
Примітка щодо вищезазначеного списку: його відтворено точно так, як опубліковано, щоб він відповідав згенерованому знімку екрана сервлета, наведеному нижче. Два варіанти написання в ньому не будуть компільовані, якщо їх скопіювати дослівно — змінна оголошується як demvar але надруковано як demovar, а неявний вихідний об'єкт — out у нижньому регістрі, не OutВиправте обидва, перш ніж запускати сторінку самостійно.
Code Пояснення до Demo.jsp
Code Рядок 1: початковий тег html
Code Рядок 2: Тег заголовка
Code Рядки 3 – 4: Тег Title, тобто Demo JSP, та закриваючий тег head
Code Рядки 5 – 6: Тег скриптлета, в якому ініціалізовано змінну demo
Code Рядки 7 – 8: У тезі body, текст, який буде виведено (Count is: )
Code Рядок 9: Тег скриптлета, де ми намагаємося вивести змінну demovar з її збільшеним значенням
Code Рядки 10 – 11: Теги тіла та HTML закриті
Демонстраційна JSP-сторінка перетворюється на сервлет demo_jsp, показаний у коді нижче.
Code пояснення для Demo_jsp.java
Code Рядок 1: Клас сервлета demo_jsp розширює батьківський клас HttpServlet
Code Рядок 2 – 3: Перевизначення методу обслуговування JSP, тобто _jspService, який має об'єкти HttpServletRequest та HttpServletResponse як параметри
Code Рядок 4: Спосіб відкриття
Code Рядок 5: Виклик методу getWriter() об'єкта відповіді для отримання PrintWriter об'єкт (друкує відформатоване представлення об'єктів у текстовий потік виводу)
Code Рядок 6: Виклик методу setContentType об'єкта відповіді для встановлення типу вмісту
Code Рядок 7: Використання методу write() функції PrintWriter об'єкт для розбору html
Code Рядок 8: Ініціалізація змінної demovar значенням 0
Code Рядок 9: Виклик методу write() методу PrintWriter об'єкт для розбору тексту
Code Рядок 10: Виклик методу print() методу PrintWriter об'єкт для збільшення змінної demovar від 0 + 1 = 1. Отже, вивід буде 1
Code Рядок 11: Використання методу write() функції PrintWriter об'єкт для розбору html
вихід:
Потім браузер відображає лічильник, як показано на скріншоті нижче.
- Тут ви можете бачити, що на скріншоті вивід дорівнює 1, оскільки demvar ініціалізується значенням 0, а потім збільшується до 0 + 1 = 1
У наведеному вище прикладі
- demo.jsp – це JSP, де одна змінна ініціалізується та збільшується на нуль. Цей JSP перетворюється на сервлет (demo_jsp.class), де JSP-двигун завантажує JSP-сторінку та перетворює її на вміст сервлета.
- Коли відбувається перетворення, весь текст шаблону перетворюється на оператори println(), а всі елементи JSP перетворюються на Java Код.
Ось як проста JSP-сторінка перетворюється на клас сервлету.
2) Компіляція сторінки JSP
- Створене Java Файл сервлета компілюється в Java клас сервлета
- Переклад Java Перенесення вихідної сторінки до її класу реалізації може відбуватися будь-коли між розгортанням JSP-сторінки в контейнері та обробкою JSP-сторінки.
- У наведеному вище зображенні demo_jsp.java компілюється у файл класу demo_jsp.class
- На Apache Tomcat обидва артефакти записуються в робочому каталозі сервера, в
work/Catalina/localhost/<app>/org/apache/jsp, куди в першу чергу звертаються, коли потрібно діагностувати помилку перекладу
3) Завантаження класу
- Клас сервлета, згенерований з вихідного коду JSP, тепер завантажується в контейнер.
4) Інстанціювання
- На цьому кроці генерується об'єкт, тобто екземпляр класу.
- Контейнер керує одним або кількома екземплярами цього класу у відповідь на запити та інші події. Зазвичай JSP-контейнер створюється за допомогою контейнера сервлетів. JSP-контейнер є розширенням контейнера сервлетів, оскільки обидва контейнери підтримують JSP та сервлети.
- Інтерфейс JspPage, який надається контейнером, оголошує методи jspInit() та jspDestroy().
- Існує інтерфейс HttpJspPage, який обслуговує HTTP-запити, а також містить метод service. Його сигнатура залежить від протоколу, тому контейнер генерує цей метод, замість того, щоб просити автора сторінки оголосити його.
5) Ініціалізація
public void jspInit() { //initializing the code }
- Метод jspInit() ініціалізує екземпляр сервлета, згенерований з JSP, і викликається контейнером на цьому етапі.
- Після створення екземпляра одразу викликається метод init
- Він викликається лише один раз протягом життєвого циклу JSP, а метод ініціалізації оголошується, як показано вище.
6) Обробка запиту
void _jspservice(HttpServletRequest request HttpServletResponse response) { //handling all request and responses }
- Метод _jspService() викликається контейнером для всіх запитів, що надходять від JSP-сторінки протягом її життєвого циклу.
- Для цього етапу сторінка має пройти всі вищезазначені етапи, і лише після цього можна викликати метод сервісу.
- Він передає об'єкти запиту та відповіді
- Цей метод не можна перевизначити, оскільки контейнер записує його під час трансляції.
- Метод показано вище. Він відповідає за обробку всіх HTTP-методів, тобто GET, POST та інших.
7) Знищити
public void _jspdestroy() { //all clean up code }
- Метод jspDestroy() також викликається контейнером.
- Цей метод викликається, коли контейнер вирішує, що йому більше не потрібен екземпляр сервлета для обслуговування запитів.
- Після виклику методу destroy сервлет готовий до збирання сміття.
- Це кінець життєвого циклу.
- Ми можемо перевизначити jspDestroy() під час будь-якого очищення, такого як роз'єднання з'єднань з базою даних або закриття відкритих файлів.
Варто згадати одне примітне ім'я: починаючи з Джакарти EE 9 і далі ці типи живуть у jakarta.servlet.jsp пакет, а не javax.servlet.jsp, тому старіші імпортовані дані необхідно оновлювати, коли програму переміщують на поточний сервер.



