Серверные страницы Jakarta ( JSP ; ранее JavaServer Pages ) [1] — это набор технологий, которые помогают разработчикам программного обеспечения создавать динамически генерируемые веб-страницы на основе HTML , XML , SOAP или других типов документов. Выпущенный в 1999 году компанией Sun Microsystems , [2] JSP похож на PHP и ASP , но использует язык программирования Java .
Для развертывания и запуска Jakarta Server Pages требуется совместимый веб-сервер с контейнером сервлетов , например Apache Tomcat или Jetty .
С архитектурной точки зрения JSP можно рассматривать как высокоуровневую абстракцию сервлетов Jakarta . JSP транслируются в сервлеты во время выполнения, поэтому JSP является сервлетом; каждый сервлет JSP кэшируется и используется повторно до тех пор, пока исходный JSP не будет изменен. [3]
Серверные страницы Jakarta можно использовать независимо или как компонент представления в конструкции модель-представление-контроллер на стороне сервера , обычно с JavaBeans в качестве модели и сервлетами Java (или такой структурой, как Apache Struts ) в качестве контроллера. Это тип архитектуры Модели 2 . [4]
JSP позволяет чередовать код Java и определенные предопределенные действия со статическим содержимым веб-разметки, например HTML. Полученная страница компилируется и выполняется на сервере для доставки документа. Скомпилированные страницы, а также любые зависимые библиотеки Java содержат байт-код Java, а не машинный код . Как и любая другая программа .jar или Java, код должен выполняться на виртуальной машине Java (JVM), которая взаимодействует с операционной системой хоста сервера, создавая абстрактную, нейтральную к платформе среду.
JSP обычно используются для доставки документов HTML и XML, но с помощью OutputStream они могут доставлять и другие типы данных. [5]
Веб -контейнер создает неявные объекты JSP, такие как запрос, ответ, сеанс, приложение, конфигурация, страница, контекст страницы, выход и исключение. JSP Engine создает эти объекты на этапе трансляции.
JSP используют несколько разделителей для функций сценариев . Самым простым является файл <% ... %>
, который включает в себя скриптлет JSP . Скриптлет — это фрагмент кода Java [6] , который запускается, когда пользователь запрашивает страницу.
Другие распространенные разделители включают в себя выражения <%= ... %>
for , где скриптлет и разделители заменяются результатом вычисления выражения, а также директивы , обозначаемые <%@ ... %>
. [6] [7]
Код Java не обязательно должен быть полным или самодостаточным в одном блоке скриптлетов. Он может охватывать содержимое разметки при условии, что страница в целом синтаксически правильна. Например, любые Java- блоки if/for/ while, открытые в одном скриптлете, должны быть корректно закрыты в следующем скриптлете, чтобы страница успешно скомпилировалась. Это позволяет смешивать код и может привести к ухудшению практики программирования.
Содержимое, которое попадает в разделенный блок кода Java (охватывающий несколько скриптлетов), подчиняется этому коду. Содержимое внутри блока if появится в выходных данных только тогда, когда условие if станет истинным. Аналогично, содержимое внутри конструкции цикла может появляться в выходных данных несколько раз, в зависимости от того, сколько раз выполняется тело цикла.
Следующее будет допустимым циклом for на странице JSP:
<p> Считаем до трех: </p> <% for ( int i = 1 ; i < 4 ; i ++ ) { %> <p> Это число < %= i %> . </p> <% } %> <p> Хорошо. </p>
Вывод, отображаемый в веб-браузере пользователя, будет следующим:
Считаем до трёх:Это число 1.Это число 2.Это число 3.ХОРОШО.
Тег JSP useBean
позволяет разработчику получать доступ к Javabean и создавать его. [8]
Хотя использование useBean
тега похоже на тег HTML, все теги JSP для JavaBeans используют синтаксис XML. Поэтому код, содержащий useBean
тег, чувствителен к регистру. [9]
Тег useBean
содержит несколько атрибутов. Атрибут id
объявляет имя, которое используется для получения доступа к компоненту. Атрибут class
объявляет пакет и класс компонента. Объявляет scope
объект, ответственный за хранение компонента. Значение области определяет продолжительность, в течение которой компонент доступен для использования остальной частью приложения Java. Областью действия может быть одно из следующих четырех значений: [9]
page
действия подразумевает, что компонент расположен в неявно определенном PageContext
объекте и доступен только для текущей страницы. По умолчанию все bean-компоненты имеют область действия page
.request
видимости подразумевает, что компонент можно найти в HttpServletRequest
объекте. Доступ к этому bean-компоненту могут получить все другие JSP и сервлеты, имеющие доступ к текущему объекту запроса.session
видимости подразумевает, что компонент можно найти в HttpSession
объекте. Доступ к этому bean-компоненту могут получить все другие JSP и сервлеты, имеющие доступ к указанному HttpSession
объекту.application
видимости подразумевает, что компонент можно найти в ServletContext
объекте. Доступ к этому компоненту могут получить все другие JSP и сервлеты, имеющие доступ к указанному ServletContext
объекту.После того, как компонент был создан с использованием useBean
тега, теги getProperty
и setProperty
можно использовать для получения и установки свойств компонента. JSP getProperty
используется для получения свойств созданного компонента. Тег JSP setProperty
используется для установки свойств компонента. Для тегов getProperty
и setProperty
атрибут name используется для указания имени компонента. Таким образом, атрибут name должен соответствовать атрибуту id, предоставленному тегом useBean
. [10]
В версии 2.0 спецификации JSP добавлена поддержка языка выражений (EL), используемого для доступа к данным и функциям в объектах Java. В JSP 2.1 он был свёрнут в Unified Expression Language , который также используется в JavaServer Faces . [11]
Язык выражений JSP использует компактный синтаксис, который позволяет разработчику получать атрибуты и свойства JavaBean из заданного объекта запроса. При использовании EL в начале кода необходимо добавить знак доллара («$»). За символом доллара следует открывающая скобка («{»), а также закрывающая скобка («}»). Затем код записывается между открывающими и закрывающими скобками. [12]
Ниже приведен пример синтаксиса EL :
Значение variable
в объекте javabean
равно ${javabean.variable}
.
Синтаксис JSP добавляет дополнительные теги, называемые действиями JSP, для вызова встроенных функций. [7] Кроме того, технология позволяет создавать собственные библиотеки тегов JSP , которые действуют как расширения стандартного синтаксиса JSP. [13] Одной из таких библиотек является JSTL . [14]
Стандартная библиотека тегов Джакарты (JSTL) поддерживает общие задачи, которые необходимо выполнять в JSP. [15] Примеры включают итерацию и условные выражения (эквивалент операторов «for» и «if» в Java). [14]
Из всех библиотек JSTL наиболее часто используется базовая библиотека JSTL. Директива taglib должна использоваться для указания URI базовой библиотеки JSTL с использованием префикса. Хотя существует множество различных вариантов префикса, для этой библиотеки обычно используется префикс «c». [16]
Страницы JSP также могут быть написаны с использованием полностью допустимого синтаксиса XML. [17] Такие файлы JSP обычно используют альтернативное .jspx
расширение файла, которое обычно заставляет сервер приложений проверять синтаксис XML.
Поскольку обычный синтаксис JSP <% ... %>
недопустим в XML, разработчик должен использовать альтернативные теги, предоставляемые JSP. Например, <%@ page .. %>
вместо этого общая директива может быть записана в виде <jsp:directive.page .. />
тега, а библиотеки тегов импортируются с использованием пространств имен XML вместо обычного <%@ taglib .. %>
тега.
Компилятор JavaServer Pages — это программа, которая анализирует JSP и преобразует их в исполняемые Java-сервлеты . Программа этого типа обычно встраивается в сервер приложений и запускается автоматически при первом доступе к JSP, но страницы также могут быть предварительно скомпилированы для повышения производительности или скомпилированы как часть процесса сборки для проверки на наличие ошибок. [18]
Некоторые контейнеры JSP поддерживают настройку того, как часто контейнер проверяет метки времени файла JSP , чтобы узнать, изменилась ли страница. Обычно для этой временной метки устанавливается короткий интервал (возможно, секунды) во время разработки программного обеспечения и более длительный интервал (возможно, минуты или даже никогда) для развернутого веб-приложения . [19]
По мнению Джоэла Мураха и Майкла Урбана, авторов книги «Java-сервлеты Мураха и JSP», встраивание Java-кода в JSP обычно является плохой практикой. [20] Лучшим подходом было бы перенести внутреннюю логику, встроенную в JSP, в код Java в формате Servlet
. [20] В этом сценарии Servlet
отвечает за обработку, а JSP — за отображение HTML, [20] обеспечивая четкое разделение задач .
В 2000 году Джейсон Хантер, автор книги «Программирование сервлетов на Java», описал ряд «проблем» с JavaServer Pages. [21] Тем не менее, он написал, что, хотя JSP, возможно, и не является «лучшим решением для платформы Java», это «решение для Java, которое больше всего похоже на решение, не связанное с Java», под которым он имел в виду Active Server Pages от Microsoft . Позже он добавил на свой сайт заметку, в которой говорилось, что JSP улучшился с 2000 года, но также сослался на его конкурентов, Apache Velocity и Tea (язык шаблонов). [21] Сегодня несколько альтернатив и ряд JSP-ориентированных страниц в более крупных веб-приложениях считаются техническим долгом.