Лекции 2025. Java. Белая / Ответы на билеты. Java
.pdf
Примеры (генерируются с помощью JSP-элементов):
Результаты выполнения Java-кода:
Вывод из JSP-выражений:
(выведет текущую дату и время).
Вывод, сгенерированный внутри JSP-скриптлетов: 
.
Данные из JavaBeans:
Вывод свойств бина: 
.
Результаты работы JSP-действий:
Содержимое, включенное с помощью
.
Данные, полученные с помощью Expression Language (EL):
(где
- это бин в одной из областей видимости).
.
Вывод, сгенерированный тегами из библиотек тегов (например, JSTL):
Циклы: |
. |
Условные блоки: |
. |
Форматирование данных: |
|
. |
|
Обработка:
Во время фазы трансляции JSP-элементы, генерирующие динамический контент, преобразуются в соответствующий Java-код в сгенерированном сервлете.
Во время выполнения запроса этот Java-код выполняется. Он может обращаться к базам данных, вызывать бизнес-логику, читать параметры запроса, работать с атрибутами сессии и т.д., и на основе этого генерировать HTML или другой текст, который затем смешивается со статическим содержимым и отправляется клиенту.
Характеристики:
Может меняться от запроса к запросу.
Зависит от входных данных, состояния приложения, времени и т.д. Требует вычислений и обработки на сервере.
Как они сочетаются в JSP:
JSP-страница обычно представляет собой комбинацию статического и динамического содержимого. Статический HTML-код формирует структуру и основной макет страницы, а JSP-элементы вставляют в этот макет динамически изменяемые данные или генерируют части контента на лету.
Пример:
В этом примере:
Теги
,
,
,
,
,
,
— это статическое содержимое.
Выражения
,
— динамическое содержимое, их значения будут взяты из бина
во время выполнения.
Блок
и его содержимое (если условие истинно) — динамическое содержимое, контролируемое JSTL.
Выражение
— динамическое содержимое, вычисляемое Java-кодом.
Разделение на статическое и динамическое содержимое является основой того, как JSP позволяет создавать гибкие и интерактивные веб-страницы.
122. Взаимодействие JSP - сервлет - JSP.
Взаимодействие между JSP-страницами и сервлетами является основой многих Java веб-приложений, особенно тех, которые следуют архитектурному паттерну Model- View-Controller (MVC) или его вариациям (например, Model 2 MVC).
Типичный сценарий взаимодействия (MVC Model 2):
1. Клиентский запрос (Client Request):
Пользователь инициирует действие, отправляя HTTP-запрос на сервер (например, нажимая кнопку, переходя по ссылке). Этот запрос обычно направляется на сервлет-контроллер.
URL запроса маппится на сервлет (через
или
).
2. Обработка запроса сервлетом-контроллером (Servlet - Controller):
Получение и валидация данных: Сервлет получает параметры запроса (
), данные из тела запроса, заголовки и т.д. Он может выполнять валидацию этих данных.
Взаимодействие с бизнес-логикой (Model): Сервлет вызывает соответствующие классы бизнес-логики (сервисные классы, EJB, DAO - Data Access Objects) для выполнения необходимых операций (например, получение данных из базы, обновление данных, выполнение вычислений). Результаты этих операций (данные модели) возвращаются сервлету.
Подготовка данных для представления: Сервлет берет данные, полученные от бизнес-логики (модели), и упаковывает их в объекты (часто JavaBeans или
POJO).
Сохранение данных в области видимости запроса (или сессии): Сервлет помещает эти объекты данных в атрибуты объекта
(или
, если данные нужны для нескольких запросов).
Выбор представления (View): На основе результата обработки запроса или параметров, сервлет решает, какую JSP-страницу (или другой ресурс представления) использовать для отображения ответа.
Передача управления на JSP (Forwarding): Сервлет использует
для передачи (forward) запроса (вместе с объектами
и
, содержащими атрибуты) на выбранную JSP-страницу.
3. Отображение данных JSP-страницей (JSP - View):
JSP-страница получает управление.
Она извлекает данные (модель) из атрибутов запроса (или сессии, или приложения), которые были установлены сервлетом. Это обычно делается с использованием Expression Language (EL) или, реже, скриптлетами
(
).
Генерация HTML: JSP использует эти данные для динамической генерации HTML-разметки. JSTL (JSP Standard Tag Library) часто используется для условного отображения, итерации по коллекциям и форматирования данных без использования Java-кода в скриптлетах.
JSP-страница не содержит сложной бизнес-логики; ее основная задача — отображение.
4. Отправка ответа клиенту:
После того как JSP-страница сгенерировала HTML (или другой контент), этот контент (как часть объекта
) отправляется контейнером сервлетов обратно клиенту (браузеру).
Пример цикла "JSP -> Сервлет -> JSP":
Это может произойти, например, при отправке HTML-формы:
Отображает сообщение об успехе или ошибке, полученное из атрибутов запроса.
Преимущества такого взаимодействия:
Разделение ответственностей: Четкое разделение между логикой обработки (сервлет) и логикой представления (JSP).
Поддерживаемость: Легче изменять внешний вид (JSP) без затрагивания бизнеслогики (сервлет), и наоборот.
Тестируемость: Бизнес-логику в сервлетах и сервисных классах легче тестировать изолированно.
Повторное использование: JSP-страницы могут использоваться для отображения данных, подготовленных разными сервлетами. Сервлеты могут перенаправлять на разные JSP в зависимости от ситуации.
Это взаимодействие является основой для большинства традиционных Java вебприложений.
123. Какие области видимости переменных существуют в JSP?
В JSP существуют четыре стандартные области видимости (scopes), в которых могут храниться атрибуты (объекты, доступные по имени). Эти области видимости определяют, как долго атрибут существует и откуда он доступен. Доступ к атрибутам в этих областях обычно осуществляется с помощью Expression Language (EL) или через соответствующие Java-объекты (неявные объекты JSP или объекты, полученные программно).
1.
(Страница):
Описание: Атрибуты, хранящиеся в этой области, доступны только в пределах текущей JSP-страницы, включая любые файлы, статически включенные в нее с помощью директивы
.
Время жизни: Атрибуты существуют только во время обработки текущего запроса к данной JSP-странице. Они уничтожаются после того, как страница сгенерировала ответ.
Доступ через Java: Используется неявный объект
.
Доступ через EL: 
Когда использовать: Для временных переменных, которые нужны только для логики отображения на одной конкретной странице и не должны передаваться дальше. Используется реже, чем другие области, так как локальные переменные в скриптлетах или EL-выражения часто покрывают эти нужды.
2.
(Запрос):
Описание: Атрибуты доступны в рамках одного HTTP-запроса. Они видны на исходной JSP-странице, а также на любой другой странице или сервлете, на который запрос был передан (forwarded) с помощью
. Они также видны ресурсам, включенным с помощью
или
.
Время жизни: Атрибуты существуют с момента их установки до тех пор, пока не будет отправлен ответ клиенту на данный запрос.
Доступ через Java: Используется неявный объект
(экземпляр
).
Доступ через EL:
(или просто
, так как EL ищет по областям в определенном порядке, начиная с
, затем
,
,
).
Когда использовать: Наиболее частая область для передачи данных от сервлета-контроллера к JSP-представлению в паттерне MVC. Для данных, которые релевантны только для текущего запроса.
3.
(Сессия):
Описание: Атрибуты доступны в рамках одной пользовательской сессии.
Они видны всем страницам и сервлетам, которые обрабатывают запросы от одного и того же клиента (браузера) на протяжении всей его сессии.
Время жизни: Атрибуты существуют до тех пор, пока сессия не будет инвалидирована (например, по таймауту, явным вызовом
, или при закрытии браузера, если используются сессионные cookies).
Доступ через Java: Используется неявный объект
(экземпляр
). Необходимо убедиться, что сессия существует (например, 
- это значение по умолчанию).
Доступ через EL: 
Когда использовать: Для хранения информации, специфичной для пользователя, которая должна сохраняться между несколькими запросами от этого пользователя (например, информация о залогиненном пользователе, содержимое корзины покупок, пользовательские настройки).
4.
(Приложение):
Описание: Атрибуты доступны всем пользователям и всем компонентам (сервлетам, JSP, фильтрам, слушателям) всего веб-приложения.
Время жизни: Атрибуты существуют с момента запуска веб-приложения (или с момента их установки) до тех пор, пока веб-приложение не будет остановлено или выгружено.
Доступ через Java: Используется неявный объект
(экземпляр
).
Доступ через EL: 
Когда использовать: Для хранения глобальных данных, общих для всех пользователей и компонентов приложения (например, счетчик посетителей сайта, глобальные конфигурационные настройки, кешированные данные, которые редко меняются, пул соединений с БД, если он управляется не через JNDI). Использовать с осторожностью, так как это глобальное состояние, и доступ к нему должен быть потокобезопасным, если атрибуты изменяются.
Порядок поиска атрибутов в EL (если область не указана явно):
Когда вы используете EL без явного указания области (например,
), JSP-контейнер ищет атрибут в следующем порядке:
1. 
2. 
3. 
4. 
Первый найденный атрибут с таким именем будет использован. Если атрибут не найден ни в одной из областей, EL вернет
(или пустую строку в некоторых контекстах вывода, если используется
без
и значение null).
Пример использования разных областей в JSP:
Правильный выбор области видимости для атрибутов важен для управления состоянием веб-приложения, эффективного использования памяти и обеспечения корректного обмена данными между его компонентами.
124. Почему не нужно конфигурировать стандартные JSP теги в web.xml?
Стандартные JSP теги, о которых обычно идет речь в этом контексте, это:
1.Стандартные действия JSP (JSP Standard Actions): Теги с префиксом
,
такие как
,
,
,
,
,
,
,
,
,
,
,
,
,
.
2.JSTL (JSP Standard Tag Library): Набор библиотек тегов (core, fmt, sql, xml,
functions) для общих задач. Обычно используется с префиксами
(core),
(formatting) и т.д.
Причины, по которым их НЕ нужно конфигурировать в
(в смысле объявления
для них, как для пользовательских библиотек тегов):
Встроенная поддержка контейнером:
Стандартные действия JSP (
) являются неотъемлемой частью
спецификации JSP. Контейнер сервлетов (JSP-контейнер) знает о них по умолчанию и умеет их обрабатывать без какой-либо дополнительной конфигурации. Их префикс
зарезервирован и понятен контейнеру.
Автоматическое распознавание JSTL (при правильном подключении):
Для использования JSTL вам необходимо:
1.Добавить JAR-файлы JSTL в ваше приложение (обычно в каталог 
или как зависимость в Maven/Gradle). Основные JAR-файлы:
и
(или один
в старых версиях, или
и
для
Jakarta EE).
2.Объявить использование библиотеки тегов на JSP-странице с
помощью директивы
, указав URI библиотеки.
Контейнер сервлетов, поддерживающий JSTL (а большинство современных контейнеров его поддерживают), автоматически распознает эти стандартные URI (
и т.д.) и связывает их с реализациями тегов из JAR-файлов JSTL, находящихся в
. Нет необходимости прописывать для JSTL элемент
в
, указывая путь к TLD-файлу, как это делается для пользовательских библиотек тегов. Стандартные URI JSTL обрабатываются контейнером особым образом.
Когда
используется для конфигурации тегов:

):
):
).
) для отображения результата.
):