Лекции 2025. Java. Белая / Ответы на билеты. Java
.pdf
В итоге,
(и его HTTP-специфичный подтип
) является ключевым объектом, через который сервлет получает всю необходимую информацию о входящем клиентском запросе, включая параметры, заголовки, тело запроса, и может управлять атрибутами, связанными с этим запросом.
105. Что такое Request Dispatcher?
— это интерфейс в Java Servlet API, который
позволяет передавать управление обработкой запроса другому ресурсу на сервере (например, другому сервлету, JSP-странице или статическому HTML-файлу) в
рамках одного и того же запроса от клиента.
То есть,
используется для внутренней переадресации на стороне сервера. Клиент (браузер) не знает об этой переадресации; для него это выглядит как один запрос и один ответ.
Как получить
?
Объект
можно получить двумя способами:
1. От
:
должен быть абсолютным путем в пределах веб-приложения (начинаться с
).
Этот путь интерпретируется относительно корня контекста веб-приложения.
2. От
:
может быть как абсолютным (начинаться с
, интерпретируется относительно корня контекста), так и относительным (без
в начале, интерпретируется относительно пути текущего запроса).
Методы
:
После получения объекта
у него есть два основных метода для передачи управления:
1. 
:
Полностью передает управление от текущего сервлета/JSP к ресурсу, на который указывает
.
Содержимое ответа, которое могло быть сгенерировано исходным сервлетом
до вызова |
, игнорируется (буфер ответа очищается, если ответ еще |
||
не был скоммичен). |
|
|
|
Все заголовки ответа, установленные до вызова |
, также могут быть |
||
сброшены (зависит от контейнера, но обычно так). |
|
||
Ресурс, на который делается |
, получает те же самые объекты |
||
и |
(возможно, обернутые, если использовались фильтры- |
||
обертки).
URL в браузере клиента не изменяется. Клиент не знает, что его запрос был обработан другим ресурсом на сервере.
После того как целевой ресурс завершит свою работу, управление не возвращается в исходный сервлет.
Важно:
должен вызываться до того, как какой-либо контент ответа был отправлен клиенту (скоммичен). Если ответ уже скоммичен,
вызов
приведет к
.
2. 
:
Включает содержимое ресурса, на который указывает
, в ответ, генерируемый текущим сервлетом/JSP.
Управление временно передается целевому ресурсу. После того как целевой ресурс завершает свою работу, управление возвращается в исходный сервлет/JSP, который может продолжить генерацию своего ответа.
Целевой ресурс может записывать данные в тот же
или
, что и исходный сервлет.
Целевой ресурс не может устанавливать заголовки HTTP или вызывать методы, которые влияют на заголовки (например,
,
,
), если исходный сервлет уже начал отправлять заголовки. Обычно целевой ресурс должен генерировать только фрагмент контента. URL в браузере клиента не изменяется.
Пример использования: Включение общих частей страницы (шапка, подвал, меню) в разные JSP-страницы.
Это эквивалентно вызовам
в сервлете.
Сравнение
и
:
Характеристика |
|
|
|
|
|
Передача |
Полная, безвозвратная. |
Временная, с возвратом |
управления |
|
управления. |
|
|
|
Содержимое ответа |
Игнорируется (буфер |
Сохраняется, ответ |
исходного ресурса |
очищается). |
целевого ресурса |
|
|
добавляется к нему. |
|
|
|
URL в браузере |
Не изменяется. |
Не изменяется. |
|
|
|
Воздействие на |
Может устанавливать (если |
Обычно не должен |
заголовки ответа |
исходный не скоммитил). |
изменять заголовки, если |
целевым ресурсом |
|
они уже установлены |
|
|
исходным. |
|
|
|
Типичное |
Перенаправление на JSP |
Включение общих |
использование |
для отображения данных |
фрагментов страниц |
|
(MVC), обработка ошибок. |
(шапки, подвалы, меню). |
|
|
|
Когда использовать
:
Реализация паттерна Model-View-Controller (MVC): Сервлет (Controller)
обрабатывает запрос, подготавливает данные (Model) и затем использует
для передачи этих данных (через атрибуты запроса) на JSP-страницу (View) для отображения.
Включение общих компонентов страницы: Использование
для вставки стандартных заголовков, подвалов, меню на разные страницы, чтобы
избежать дублирования кода.
Централизованная обработка ошибок: Перенаправление на специальную страницу или сервлет для отображения информации об ошибке.
Создание составных страниц: Сборка страницы из нескольких независимых частей.
Важно отличать
от
:

:
Происходит на стороне сервера.
Клиент не знает о перенаправлении.
URL в браузере не меняется.
Исходный запрос и его атрибуты сохраняются и доступны целевому ресурсу.
Может перенаправлять только на ресурсы внутри того же веб-приложения.

:
Происходит на стороне клиента.
Сервер отправляет клиенту HTTP-ответ с кодом состояния 3xx (например, 302 Found) и новым URL в заголовке
.
Браузер клиента автоматически делает новый запрос на этот новый URL.
URL в браузере изменяется на новый.
Исходный запрос и его атрибуты теряются (так как это новый запрос). Может перенаправлять на любой URL (в том числе на внешние сайты).
— это ключевой механизм для построения структурированных и модульных веб-приложений на Java, позволяющий эффективно управлять потоком выполнения запроса на стороне сервера.
106. Как из одного сервлета вызвать другой сервлет?
Вызвать другой сервлет из текущего сервлета (в смысле передать ему управление обработкой текущего запроса) можно с помощью механизма
, используя его методы
или
.
Способы вызова другого сервлета:
1.
:
Полностью передает обработку текущего запроса и ответа другому сервлету (или JSP, или статическому ресурсу).
Исходный сервлет больше не может изменять ответ после вызова
(буфер ответа очищается).
URL в браузере клиента не меняется.
Целевой сервлет получает те же объекты
и
. Атрибуты, установленные в
исходным сервлетом, будут доступны целевому.
Когда использовать:
Когда один сервлет выполняет начальную обработку или диспетчеризацию, а другой сервлет отвечает за основную логику или генерацию ответа.
В паттерне MVC, где контроллер (сервлет) передает управление на представление (JSP или другой сервлет, генерирующий вид).
Пример:
При запросе
,
установит атрибут и передаст управление
, который сгенерирует ответ. URL в браузере останется
.
2.
:
Включает вывод другого сервлета (или JSP, или статического ресурса) в ответ текущего сервлета.
Управление временно передается целевому сервлету, а затем возвращается обратно к исходному сервлету, который может продолжить формировать свой ответ.
Целевой сервлет может записывать в тот же поток ответа. Он не должен изменять заголовки HTTP, если они уже были установлены исходным сервлетом.
URL в браузере клиента не меняется.
Когда использовать:
Для включения общих частей контента (например, шапка, подвал, меню), которые могут генерироваться отдельными сервлетами или JSP.
Для модульной сборки ответа.
Пример:
При запросе |
, |
сгенерирует основную структуру, а |
и |
|
вставят свои части в ответ. |
Получение
:
Как упоминалось ранее,
можно получить:
: Путь должен быть абсолютным (начинаться с
) относительно корня приложения.
: Путь может быть абсолютным или относительным.
Важно отличать от
:
выполняет клиентский редирект. Сервер отправляет клиенту ответ с кодом 3xx и новым URL. Браузер делает новый, отдельный запрос на этот URL. Атрибуты исходного запроса теряются. URL в браузере меняется.

(
/
) выполняет серверную переадресацию/
включение. Все происходит в рамках одного клиентского запроса. URL в браузере не меняется. Атрибуты запроса сохраняются.
Выбор между
и
зависит от того, хотите ли вы полностью передать управление или просто включить вывод другого ресурса.
используется чаще для реализации MVC и диспетчеризации, а
— для композиции страниц.
107. Для чего используются атрибуты сервлетов и как происходит работа с ними?
Атрибуты в контексте Java Servlet API — это объекты (пары ключ-значение), которые могут быть сохранены и извлечены из трех различных областей видимости (scopes):
,
и
. Они служат для обмена данными между компонентами веб-приложения (сервлетами, фильтрами, JSP) или для хранения состояния.
Основные цели использования атрибутов:
1.Передача данных между компонентами в рамках одного запроса
(
атрибуты):
Часто используется в паттерне MVC, где сервлет-контроллер обрабатывает запрос, подготавливает данные и сохраняет их как атрибуты запроса. Затем он передает управление (forward) JSP-странице (представлению), которая извлекает эти атрибуты и отображает их.
Фильтры также могут устанавливать атрибуты запроса для использования последующими фильтрами или сервлетами.
Время жизни: Атрибуты запроса существуют только на время обработки одного HTTP-запроса. Они уничтожаются после того, как ответ отправлен клиенту.
2.Хранение данных, специфичных для пользовательской сессии (
атрибуты):
Используются для хранения информации, которая должна быть доступна на протяжении нескольких запросов от одного и того же клиента (в рамках одной сессии).
Примеры: информация о залогиненном пользователе, содержимое корзины покупок, пользовательские настройки.
Время жизни: Атрибуты сессии существуют до тех пор, пока сессия активна (не истек таймаут, сессия не была инвалидирована явно).
3.Хранение глобальных данных для всего приложения (
атрибуты):
Используются для хранения объектов или информации, которые должны быть доступны всем сервлетам и JSP в веб-приложении на протяжении всего времени его работы.
Примеры: пул соединений с БД, глобальные конфигурационные настройки, кешированные данные, счетчики на уровне приложения.
Время жизни: Атрибуты контекста существуют с момента инициализации вебприложения до его остановки.
Как происходит работа с атрибутами (общие методы для всех трех областей):
Для каждой из областей видимости (
,
,
) существуют схожие методы для управления атрибутами:
1. Установка (или замена) атрибута:
: Строковый ключ (имя атрибута).
: Объект любого типа, который нужно сохранить. Если атрибут с таким именем уже существует, его значение будет заменено. Если передать
в качестве объекта, это эквивалентно удалению атрибута (хотя лучше использовать
).
2. Получение (извлечение) атрибута:
