Введение

Технология динамических веб-страниц Jakarta EE

Jakarta Server Pages (JSP; ранее JavaServer Pages) – это набор технологий, помогающих разработчикам программного обеспечения создавать динамически генерируемые веб-страницы на основе HTML, XML, SOAP или других типов документов. Выпущенная в 1999 году компанией Sun Microsystems, JSP аналогична PHP и ASP, но использует язык программирования Java. Для развертывания и запуска Jakarta Server Pages требуется совместимый веб-сервер с контейнером сервлетов, например Apache Tomcat или Jetty.

Обзор

С архитектурной точки зрения, JSP можно рассматривать как высокоуровневую абстракцию Jakarta Servlets. JSPs преобразуются в сервлеты во время выполнения, следовательно, JSP является сервлетом; каждый сервлет JSP кэшируется и повторно используется до тех пор, пока исходный JSP не будет модифицирован. Jakarta Server Pages могут использоваться независимо или в качестве компонента представления в архитектуре "модель-представление-контроллер" на стороне сервера, обычно с JavaBeans в качестве модели и Java-сервлетами (или фреймворком, таким как Apache Struts) в качестве контроллера. Это один из типов архитектуры Модели 2. JSP позволяет вставлять Java-код и определенные предопределенные действия в статический веб-контент, такой как HTML. Полученная страница компилируется и выполняется на сервере для отправки документа. Скомпилированные страницы, а также любые зависимые Java-библиотеки содержат байт-код Java, а не машинный код. Как и любая другая JAR-программа или Java-программа, код должен выполняться в виртуальной машине Java (JVM), которая взаимодействует с операционной системой хост-сервера, обеспечивая абстрактную, платформенно-независимую среду. JSP обычно используются для отправки документов HTML и XML, но с помощью OutputStream они могут отправлять и другие типы данных. Веб-контейнер создает неявные объекты JSP, такие как запрос, ответ, сессия, приложение, конфигурация, страница, pageContext, out и исключение. JSP Engine создает эти объекты на этапе преобразования.

Директивы, скрипты и выражения, декларация

JSP используют несколько разделителей для скриптовых функций. Наиболее базовым является <% %>, который заключает в себе скриптлет JSP. Скриптлет – это фрагмент кода Java, который выполняется при запросе страницы пользователем. Другие распространенные разделители включают <%= %> для выражений, где скриптлет и разделители заменяются результатом вычисления выражения, и директивы, обозначаемые <%@ %>. Код Java не обязан быть полным или самодостаточным внутри одного скриптлет-блока. Он может пересекаться с содержимым разметки, при условии, что страница в целом синтаксически корректна. Например, любой блок Java if/for/while, открытый в одном скриптлете, должен быть правильно закрыт в последующем скриптлете, чтобы страница успешно скомпилировалась. Это позволяет перемешивать код и может привести к некачественным практикам программирования. Содержимое, попадающее внутрь разделенного блока кода Java (охватывающего несколько скриптлетов), подчиняется этому коду. Содержимое внутри блока if будет отображаться в выходных данных только тогда, когда условие if истинно. Аналогично, содержимое внутри циклической конструкции может появляться в выходных данных несколько раз, в зависимости от количества итераций цикла.

Название

Тег JSP useBean позволяет разработчику получить доступ и создать Javabean. Хотя использование тега useBean выглядит как HTML-тег, все теги JSP для JavaBeans используют синтаксис XML. Поэтому код, содержащий тег useBean, чувствителен к регистру. Тег useBean содержит несколько атрибутов. Атрибут id объявляет имя, которое используется для доступа к компоненту. Атрибут class объявляет пакет и класс компонента. Атрибут scope определяет объект, ответственный за хранение компонента. Значение атрибута scope определяет время, в течение которого компонент доступен для остальной части Java-приложения. Область видимости может принимать одно из следующих четырех значений:

Область видимости page подразумевает, что компонент находится в неявно определенном объекте и доступен только для текущей страницы. По умолчанию, все компоненты имеют область видимости page. Область видимости request подразумевает, что компонент можно найти в объекте request. Этот компонент может быть доступен всем другим JSP и сервлетам, имеющим доступ к текущему объекту запроса. Область видимости session подразумевает, что компонент можно найти в объекте session. Этот компонент может быть доступен всем другим JSP и сервлетам, имеющим доступ к указанному объекту session. Область видимости application подразумевает, что компонент можно найти в объекте application. Этот компонент может быть доступен всем другим JSP и сервлетам, имеющим доступ к указанному объекту application.

Теги getProperty и setProperty

После создания компонента с помощью тега useBean, теги getProperty и setProperty можно использовать для получения и установки свойств этого компонента. JSP getProperty используется для получения значения свойства созданного компонента. Тег setProperty JSP используется для установки значений свойств компонента. Для тегов getProperty и setProperty атрибут name используется для указания имени компонента. Следовательно, значение атрибута name должно соответствовать значению атрибута id, указанному в теге useBean.

Язык выражения

Версия 2.0 спецификации JSP добавила поддержку языка выражений (EL), используемого для доступа к данным и функциям в объектах Java. В JSP 2.1 он был объединен в Unified Expression Language, который также используется в JavaServer Faces. Язык выражений JSP использует компактный синтаксис, позволяющий разработчику получать атрибуты и свойства JavaBean из заданного объекта запроса. При использовании EL в начале кода необходимо добавить знак доллара ("$"). За знаком доллара следуют открывающая фигурная скобка ("{") и закрывающая фигурная скобка ("}"). Код затем записывается между открывающей и закрывающей фигурными скобками.

Дополнительные теги

Синтаксис JSP добавляет дополнительные теги, называемые JSP actions, для вызова встроенных функций. Одной из таких библиотек является JSTL.

Библиотека стандартных тегов Джакарты

Jakarta Standard Tag Library (JSTL) поддерживает общие задачи, которые необходимо выполнять в JSP. Примеры включают итерацию и условные операторы (эквивалент операторов "for" и "if" в Java). Такие JSP-файлы часто используют альтернативное расширение файла jspx, что обычно приводит к проверке синтаксиса XML сервером приложений. Поскольку обычный синтаксис JSP <% %> не является допустимым в XML, разработчику необходимо использовать альтернативные теги, предоставляемые JSP. Например, общая директива <%@ page %> может быть записана как тег <jsp:directive.page />, а библиотеки тегов импортируются с использованием пространств имен XML вместо обычного тега <%@ taglib %>.

Компилятор

Компилятор JavaServer Pages – это программа, которая разбирает JSP-страницы и преобразует их в исполняемые Java Servlets. Программа такого типа обычно встроена в сервер приложений и запускается автоматически при первом обращении к JSP-странице, но страницы также могут быть предварительно скомпилированы для повышения производительности или скомпилированы в процессе сборки для проверки на наличие ошибок. Некоторые JSP-контейнеры позволяют настраивать частоту проверки сервером временных меток JSP-файлов для определения, были ли внесены изменения в страницу. Обычно эта временная метка устанавливается на короткий интервал (например, секунды) во время разработки программного обеспечения и на более длительный интервал (например, минуты или вообще не проверяется) для развернутого веб-приложения.

Критика

По словам Джоэла Мурача и Майкла Урбана, авторов книги "Murach's Java Servlets and JSP", встраивание кода Java в JSP, как правило, является плохой практикой. Лучшим подходом было бы перенести логику серверной части, встроенную в JSP, в код Java. В этом сценарии компонент серверной части отвечает за обработку данных, а JSP – за отображение HTML, обеспечивая четкое разделение ответственности. В 2000 году Джейсон Хантер, автор книги "Программирование Java Servlet", описал ряд "проблем", связанных с JavaServer Pages. Тем не менее, он отметил, что, хотя JSP может быть не "лучшим решением для платформы Java", это было "решение Java, наиболее похожее на не-Java решение", подразумевая под этим Active Server Pages от Microsoft. Позже он добавил на свой сайт комментарий, что JSP улучшился с 2000 года, но также упомянул его конкурентов, Apache Velocity и Tea (язык шаблонов). Сегодня ряд альтернативных решений и большое количество JSP-страниц в крупных веб-приложениях рассматриваются как технический долг.