Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции 2025. Java. Белая / Ответы на билеты. Java

.pdf
Скачиваний:
4
Добавлен:
02.01.2026
Размер:
4.52 Mб
Скачать

Технология JavaServer Pages (JSP) была создана для решения ряда проблем и предоставления преимуществ при разработке динамических веб-страниц по сравнению с использованием только сервлетов для генерации HTML.

Основные причины, зачем нужен JSP:

1. Упрощение создания HTML-ориентированного контента:

Проблема с сервлетами: Генерация сложного HTML-кода внутри Javaсервлета с помощью множества вызовов очень громоздка, трудночитаема и подвержена ошибкам. Любое изменение в HTML-разметке требует перекомпиляции Javaкода.

Решение JSP: JSP позволяет писать HTML-код почти так же, как и для статических страниц, и вставлять в него динамические элементы (Java-код, EL, теги) только там, где это необходимо. Это делает процесс разработки вебинтерфейсов более естественным для веб-дизайнеров и разработчиков, знакомых с HTML.

2. Разделение представления (View) и бизнес-логики (Controller/Model):

JSP идеально подходит для роли Представления (View) в архитектурных паттернах, таких как Model-View-Controller (MVC).

Сервлет (Controller) обрабатывает входящий запрос, выполняет бизнес-логику, взаимодействует с Моделью (Model) (JavaBeans, сервисные классы, данные из БД) для получения данных.

Затем сервлет передает эти данные (обычно через атрибуты запроса) на JSPстраницу.

JSP-страница отвечает только за отображение этих данных, используя HTMLразметку, EL и теги JSTL. Она содержит минимальное количество Java-кода (в идеале — вообще без скриптлетов).

Такое разделение улучшает структуру приложения, его тестируемость, поддерживаемость и позволяет разным специалистам (Java-разработчикам и веб-дизайнерам) работать над своими частями более независимо.

3. Повышение продуктивности и удобства для разработчиков интерфейсов:

Веб-дизайнеры могут работать над HTML-структурой и внешним видом JSPстраниц, используя привычные им инструменты, в то время как Javaразработчики фокусируются на бэкенд-логике.

Внесение изменений в HTML-разметку на JSP-странице не требует перекомпиляции Java-классов (если не меняется встроенный Java-код). Контейнер автоматически перетранслирует и перекомпилирует JSP при необходимости.

4. Использование теговых библиотек (Tag Libraries):

JSP поддерживает использование пользовательских тегов и стандартных библиотек тегов, таких как JSTL (JSP Standard Tag Library).

Теги предоставляют XML-подобный синтаксис для выполнения общих задач (циклы, условная логика, форматирование данных, доступ к данным и т.д.) без необходимости писать Java-код (скриптлеты) напрямую в JSP.

Это делает JSP-страницы более чистыми, читаемыми и декларативными.

5. Поддержка JavaBeans:

JSP имеет встроенные действия (например, ,

, ) для легкой интеграции с компонентами JavaBeans, которые могут инкапсулировать данные и некоторую логику.

6. Expression Language (EL):

EL () предоставляет простой и мощный способ доступа к данным, хранящимся в различных областях видимости (page, request, session, application), параметрам запроса, заголовкам, cookies, а также к свойствам JavaBeans и элементам коллекций, без написания Java-кода.

7. Автоматическая компиляция и управление жизненным циклом:

JSP-страницы автоматически транслируются в сервлеты и компилируются контейнером "на лету". Разработчику не нужно явно компилировать JSP. Жизненный цикл сгенерированного сервлета управляется контейнером так же, как и для обычных сервлетов.

В итоге, JSP нужен для того, чтобы:

Сделать разработку динамического веб-контента, ориентированного на HTML, более удобной и эффективной.

Способствовать лучшему разделению логики представления от бизнеслогики.

Позволить веб-дизайнерам и Java-разработчикам более эффективно сотрудничать.

Уменьшить количество Java-кода в слое представления за счет использования EL и теговых библиотек.

Несмотря на появление более современных технологий и фреймворков для построения веб-интерфейсов (например, клиентские MVC-фреймворки типа React, Angular, Vue.js, или серверные шаблонизаторы типа Thymeleaf, FreeMarker), JSP все еще используется во многих существующих Java веб-приложениях и может быть полезен для определенных задач, особенно в сочетании с сервлетами и JSTL.

119. Опишите, как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю.

Процесс обработки JSP-страницы включает несколько этапов, которые выполняются контейнером сервлетов (JSP-контейнером). Вот как это происходит:

1. Клиентский запрос (Client Request):

Пользователь (через веб-браузер) запрашивает JSP-страницу, вводя URL в адресную строку или переходя по ссылке (например, ).

Браузер отправляет HTTP-запрос на веб-сервер.

2. Получение запроса контейнером сервлетов:

Веб-сервер (или непосредственно контейнер сервлетов, если он выполняет и функции веб-сервера) получает HTTP-запрос.

Контейнер определяет, что запрошенный ресурс является JSP-страницей (по расширению или по маппингу, если он настроен).

3. Проверка наличия и актуальности скомпилированного сервлета:

Контейнер проверяет, существует ли уже скомпилированный Java-сервлет ( файл), соответствующий этой JSP-странице.

Если сервлет существует, контейнер также проверяет, не был ли исходный файл изменен с момента последней компиляции этого сервлета. Это

делается путем сравнения временных меток файла и сгенерированного файла.

4.Фаза трансляции и компиляции (Translation and Compilation Phase) - если необходимо:

Этот этап выполняется только если:

Это первый запрос к данной JSP-странице.

Или файл был изменен с момента последней компиляции.

Или скомпилированный файл отсутствует.

Шаг 4а: Трансляция (Translation):

JSP-контейнер (часто называемый JSP-движком, например, Jasper в Tomcat) парсит файл.

Он преобразует (транслирует) JSP-код в исходный код Java-сервлета

( файл).

В этом процессе:

Статический HTML/текст из JSP преобразуется в Java-код, который записывает этот текст в (обертку над из

). Например, станет чем-то

вроде

.

 

JSP-директивы (

) обрабатываются для установки свойств

страницы.

 

 

JSP-скриптлеты (

) вставляются как есть в метод

 

.

 

 

JSP-выражения (

) преобразуются в

.

JSP-объявления () помещаются на уровень класса сгенерированного сервлета.

JSP-действия () и пользовательские теги преобразуются в вызовы соответствующих Java-классов (обработчиков тегов).

Сгенерированный сервлет обычно наследует

(в Tomcat), который, в свою очередь, наследует . Он будет иметь метод

, который содержит всю логику.

Шаг 4б: Компиляция (Compilation):

Сгенерированный файл сервлета компилируется стандартным Java-компилятором в байт-код ( файл).

Если на этом этапе возникают ошибки компиляции (например, синтаксические ошибки в Java-коде внутри скриптлетов), контейнер обычно возвращает клиенту страницу с сообщением об ошибке компиляции.

5.Загрузка класса сервлета и создание экземпляра (Loading and Instantiation) -

если необходимо:

Если класс сгенерированного сервлета еще не загружен, контейнер загружает его с помощью класслоадера.

Контейнер создает экземпляр этого сервлета (обычно один экземпляр, который используется для обработки всех запросов к этой JSP).

Вызывается метод сгенерированного сервлета (аналог для обычных сервлетов, но определен в интерфейсе ). Этот метод вызывается только один раз.

6. Фаза выполнения (Execution Phase / Request Processing):

Для каждого входящего запроса к JSP-странице контейнер:

Создает новые объекты и (или получает их из пула).

Вызывает метод

сгенерированного сервлета, передавая ему эти объекты.

Внутри :

Инициализируются неявные объекты JSP (такие как ,

, , , , , , ,

).

Выполняется Java-код из скриптлетов и выражений.

Статический HTML-контент записывается в поток вывода (). Обрабатываются JSP-действия и пользовательские теги.

Результатом выполнения является HTTP-ответ (обычно HTML), который формируется в объекте .

7. Отправка ответа клиенту (Sending Response):

После того как метод завершает свою работу, контейнер сервлетов берет сформированный HTTP-ответ из объекта и отправляет его обратно клиенту (браузеру) по сети.

8. Уничтожение (Destruction Phase) - при выгрузке JSP/приложения:

Когда JSP-страница (или все веб-приложение) выгружается контейнером (например, при остановке сервера или приложения), вызывается метод

сгенерированного сервлета. Этот метод вызывается только один раз и предназначен для освобождения ресурсов, захваченных в .

Схема процесса:

Клиент (Браузер)

Сервер/Контейнер

HTTP Запрос (например, /mypage.jsp)

Передать запрос для my

Нуж

a

1

2.

HTTP Ответ

Клиент (Браузер)

Сервер/Контейнер

Этот процесс (особенно фаза трансляции и компиляции) происходит автоматически и прозрачно для разработчика. Благодаря этому JSP-страницы легко обновлять –

достаточно изменить файл, и контейнер при следующем запросе его перекомпилирует. Однако, первая загрузка JSP-страницы после изменения или старта сервера может быть немного медленнее из-за этих этапов.

120. Как можно предотвратить прямой доступ к JSP странице из браузера?

Предотвращение прямого доступа к JSP-страницам из браузера является обычной практикой, особенно когда JSP используются в качестве представлений (Views) в паттерне MVC (Model-View-Controller). В этом случае доступ к JSP должен осуществляться только через сервлет-контроллер, который подготавливает данные и передает (forward) запрос на JSP для отображения.

Вот основные способы предотвратить прямой доступ:

1. Размещение JSP-файлов в каталоге (или его подкаталогах):

Это наиболее распространенный и рекомендуемый способ.

Каталог является приватным для веб-приложения. Ресурсы,

находящиеся внутри , не могут быть запрошены напрямую клиентом (браузером) через URL. Контейнер сервлетов защищает его содержимое.

Однако сервлеты и другие компоненты приложения, работающие на сервере,

могут получить доступ к ресурсам в с помощью

.

Пример структуры:

Как получить доступ из сервлета:

Если клиент попытается напрямую обратиться к , он получит ошибку (обычно 404 Not Found или другую ошибку доступа, в зависимости от сервера).

2. Использование фильтра безопасности (Security Filter):

Можно создать фильтр, который перехватывает все запросы к определенным JSP-страницам (или ко всем JSP, если они не в ) и проверяет, пришел ли запрос напрямую или был перенаправлен (forwarded) с сервлета.

Это более сложный подход и обычно менее предпочтителен, чем размещение в

, так как требует дополнительного кодирования и может быть менее надежным, если логика фильтра некорректна.

Как фильтр может определить "прямой" запрос:

Можно проверять наличие определенных атрибутов запроса, которые устанавливает ваш контроллер перед . Если атрибутов нет, значит, запрос прямой.

Можно проверять заголовок, но он не всегда надежен.

Пример (концептуальный):

```java

// В фильтре

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String requestedUri = request.getRequestURI();

Этот метод сложнее и имеет больше подводных камней, чем простое размещение в .

3. Конфигурация безопасности в (Security Constraints):

Можно использовать ограничения безопасности в для запрета прямого доступа к определенным URL-шаблонам, соответствующим вашим JSP.

Например, можно определить для URL-паттерна, указывающего на JSP, и не определить для него никаких (ролей), что фактически закроет доступ. Однако, это также закроет доступ и для из сервлета, если не настроить это очень хитро (например, через специальные роли для внутреннего использования, что усложняет).

Обычно используется для аутентификации и авторизации, а не просто для скрытия JSP.

Пример (НЕ РЕКОМЕНДУЕТСЯ для простого скрытия JSP, так как может заблокировать и forward):

Этот способ более сложен в настройке для данной цели и может иметь непредвиденные побочные эффекты на доступ через .

Наилучшая практика:

Помещайте все JSP-файлы, которые не должны быть доступны напрямую из браузера, в каталог или его подкаталоги (например, ,

).

Это самый простой, надежный и стандартный способ обеспечить, что доступ к этим JSP будет осуществляться только программно с сервера (например, через

или из сервлета). Контейнер сервлетов автоматически обеспечивает защиту содержимого от прямых клиентских запросов.

121. Какая разница между динамическим и статическим содержимым JSP?

Разница между динамическим и статическим содержимым в JSP-странице заключается в том, как это содержимое обрабатывается и генерируется сервером

перед отправкой клиенту.

Статическое содержимое (Static Content) в JSP:

Что это: Это части JSP-страницы, которые не изменяются от запроса к запросу и отправляются клиенту как есть, без какой-либо обработки или вычислений на сервере (кроме как быть включенными в общий поток вывода).

Примеры:

 

 

 

 

Обычный HTML-код (теги

,

,

, таблицы, формы и т.д.).

CSS-стили (внутри тегов

 

или в отдельных

файлах, на которые

ссылается JSP).

 

 

 

 

Клиентский JavaScript-код (внутри тегов

или в отдельных

файлах).

 

 

 

 

Изображения, на которые ссылается JSP (хотя сами изображения являются

отдельными ресурсами, их теги

являются частью статического HTML).

Любой другой текст, который не является JSP-элементом (директивой, скриптлетом, выражением, действием или тегом библиотеки).

Обработка:

Во время фазы трансляции JSP-страницы в сервлет, статическое содержимое преобразуется в Java-код, который просто записывает этот текст в выходной поток ответа (например, ).

Во время выполнения запроса этот Java-код выполняется, и статический текст отправляется клиенту без изменений.

Характеристики:

Не зависит от параметров запроса, состояния сессии или других динамических факторов.

Быстро обрабатывается, так как не требует вычислений на сервере.

Динамическое содержимое (Dynamic Content) в JSP:

Что это: Это части JSP-страницы, которые генерируются или изменяются на

сервере во время обработки запроса, прежде чем страница будет отправлена клиенту. Их содержимое может зависеть от различных факторов.