Життєвий цикл JSP: пояснення фаз та діаграми

⚡ Розумний підсумок

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

  • 🔄 Сім фаз: Переклад, компіляція, завантаження класів, створення екземплярів, ініціалізація, обробка запитів та знищення виконуються у фіксованому порядку.
  • 📄 Переклад: Контейнер перевіряє сторінку, а потім записує Java вихідний файл, тому demo.js стає demo_jsp.java перед будь-яким виконанням.
  • ️ Збірка: Згенерований вихідний код компілюється в demo_jsp.class, який Tomcat зберігає у своєму робочому каталозі разом із файлом .java.
  • ???? Три методи: jspInit() готує сторінку один раз, _jspService() відповідає на кожен запит, а jspDestroy() звільняє ресурси в кінці.
  • 🚫 Одне правило: _jspService() генерується контейнером і ніколи не повинен бути записаний або перезаписаний автором сторінки.
  • 🗃️ Гачок для очищення: Перевизначення jspDestroy() – це правильне місце для закриття з’єднань з базою даних та відкриття файлів.

Фази життєвого циклу JSP від ​​перекладу до знищення

Що таке життєвий цикл JSP?

Життєвий цикл JSP визначається як перетворення JSP-сторінки в сервлет, оскільки JSP-сторінку необхідно перетворити на сервлет, перш ніж вона зможе обробляти запити на обслуговування. Життєвий цикл починається зі створення JSP і закінчується знищенням екземпляра сервлета, згенерованого з нього.

Оскільки згенерований клас є звичайним сервлетом, все, що ви вже знаєте про сервлет, можеtracвсе ще застосовується. Java Код, який записує контейнер, і є тим, що насправді виконується; JSP-файл — це лише вихідний код, який ви підтримуєте.

Різні фази життєвого циклу JSP

Коли браузер запитує JSP, механізм JSP спочатку перевіряє, чи потрібно компілювати сторінку. Якщо JSP ніколи не компілювався або був змінений з моменту останньої компіляції, тоді механізм JSP компілює сторінку.

Процес компіляції JSP-сторінки складається з трьох кроків:

  • Розбір JSP
  • Перетворення JSP на сервлет
  • Компіляція сервлета

Діаграма життєвого циклу JSP

Життєвий цикл JSP зображено на діаграмі нижче, яка tracявляє собою одну сторінку від вихідного файлу до класу, який виконує контейнер.

Діаграма життєвого циклу JSP, що показує трансляцію, компіляцію, завантаження, створення екземплярів, ініціалізацію, обробку запитів та знищення

Наступні кроки пояснюють життєвий цикл JSP:

  1. Переклад сторінки JSP
  2. Компіляція JSP-сторінки (компіляція JSP-сторінки в _jsp.java)
  3. Завантаження класів (_jsp.java конвертується у файл класу _jsp.class)
  4. Створення екземпляра (створюється об'єкт згенерованого сервлета)
  5. Ініціалізація (контейнер викликає метод jspInit())
  6. Обробка запитів (контейнер викликає метод _jspService())
  7. Знищити (контейнер викликає метод 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, показаний у коді нижче.

Згенерований вихідний код сервлета demo_jsp.java, створений з demo.js під час трансляції

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

вихід:

Потім браузер відображає лічильник, як показано на скріншоті нижче.

Вивід demo.js з браузера. Кількість: 1

  • Тут ви можете бачити, що на скріншоті вивід дорівнює 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, тому старіші імпортовані дані необхідно оновлювати, коли програму переміщують на поточний сервер.

Поширені запитання

Вони мають однаковий життєвий цикл після трансляції. JSP додає дві фази на початку, трансляцію та компіляцію, які перетворюють сторінку на вихідний файл сервлета та клас. Від завантаження класу сервлет може...tract застосовується без змін.

У робочому каталозі сервера, у work/Catalina/localhost/ /org/apache/jsp. Туди потрапляють як згенерований вихідний код .java, так і скомпільований файл .class, тому home.js стає home_jsp.java та home_jsp.class.

Контейнер генерує його з тіла сторінки під час перекладу. Його сигнатура залежить від протоколу запиту, тому специфікація не включає його до інтерфейсу JspPage та забороняє авторам сторінок оголошувати його самостійно.

Згенерований сервлет вже реалізує init() для зберігання свого ServletConfig, а потім викликає jspInit(). Автори сторінок перевизначають jspInit(), щоб налаштування контейнера ніколи не пропускалося, що саме й ризикує при написанні вручну перевизначення init().

Попередня компіляція перекладає та компілює кожну сторінку під час збірки або розгортання, а не під час першого запиту. Вона усуває затримку першого звернення, виявляє помилки перекладу перед випуском та дозволяє розгортати без компілятора на сервері.

Він залишається підтримуваним як Jakarta Server Pages. Основна зміна стосується простору імен пакетів: з Jakarta EE 9 API переміщено з javax.servlet.jsp на jakarta.servlet.jsp, тому імпорт застарілих даних необхідно переписати перед запуском на поточному сервері.

Асистенти штучного інтелекту зчитують згенерований стек _jsp.java trace та зіставляють помилку компіляції з рядком скриптлета, що є найскладнішою частиною помилок перекладу. Вони також позначають скриптлети, які належать до файлу тегів або сервлету.

Так. Copilot створює скриптлети, блоки JSTL, обробку форм та зіставлення класів сервлетів з коментаря. RevПерегляньте вивід для простору імен пакета jakarta та для скриптлетів, які мають бути мовою виразів, оскільки пропозиції часто відповідають старішим навчальним посібникам.

Підсумуйте цей пост за допомогою: