JSP (JavaServer Pages) — платформенно-независимая, переносимая и легко расширяемая технология для разработки веб-приложений, работающая на виртуальной машине Java (JVM). JSP позволяет веб-разработчикам создавать содержимое, состоящее из статических исходных данных, которые могут быть оформлены в одном из текстовых форматов HTML, SVG, WML, или XML, и JSP-элементов, которые конструируют динамическое содержимое. Кроме этого могут использоваться библиотеки JSP-тегов, а также Expression Language (EL), для внедрения Java-кода в статичное содержимое JSP-страниц.
Код JSP-страницы транслируется в Java-код сервлета с помощью компилятора JSP-страниц Jasper, затем компилируется в байт-код Java, после чего сервлет может быть запущен в контейнерах сервлетов. JSP-страницы загружаются на сервере и управляются из структуры специального Java server packet, который называется Jakarta EE Web Application. Обычно страницы упакованы в файловые архивы .war и .ear.
Версии Начиная с версии 1.2, разработка JavaServer Pages происходила в рамках Java Community Process. JSR 53 определяет стандарты JSP 1.2 и Servlet 2.3, а JSR 152 определяет спецификацию JSP 2.0. В мае 2006 года JSP спецификация 2.1 была выпущена под JSR 245 в рамках Java EE 5. 10 декабря 2009 года была выпущена спецификация JSP 2.2 как содержание выпуска JSR 245.
JSP 1.0 и JSP 1.1 Эти версии кардинально отличаются от предыдущих, которые воспринимались как ответ Java на ASP. Некоторые основные возможности прошлых версий (например, возможность разрабатывать библиотеки тегов) были убраны или заменены в соответствии с принципом разделения кода и содержимого. Так как в больших объёмах исходного кода трудно сориентироваться и отделить контент от самого кода, то пришла идея их разделить (перенести) с помощью JSP тегов, таких как <jsp:useBean/>. Для реализации этой идеи JSP-теги разделили на три логические группы: директивы, скриптовые элементы и действия.
JSP 1.2
JSP 1.2 расширяет спецификацию JavaServer Pages 1.1 (JSP 1.1) следующим образом: требуют платформы Java 2 версии 1.2 или более поздней; использует Servlet 2.3 как основу своей семантики; определяет синтаксис XML для страниц JSP; предоставляет проверку страниц JSP на этапе трансляции; специфицирует очистку библиотеки тегов на этапе прогона; улучшает контракт обработчика тегов; предоставляет улучшенную поддержку авторизации страниц; улучшает поддержку кодировки символов и локализации; устраняет ограничение «flush before you include» из JSP 1.1.
JSP 2.0 Новая версия спецификации JSP дополнена следующей функциональностью: Expression Language (EL) — язык выражений, позволяет среди прочего создавать разработчикам шаблоны в стиле Velocity; более простой и быстрый способ создавать новые теги с помощью файлов .tag, теперь для создания новых тегов не обязательно знать Java; удобный способ управления вложенными бинами (JavaBeans); более быстрый и лёгкий способ отображения параметров переменных: Hello, ${param.visitor} <%-- аналогично коду: Hello, <%=request.getParameter("visitor")%> --%>
JSP 2.1 аключает в себя JSTL и JavaServer Faces; новая версия EL поддерживает отложенное исполнение выражений и литеральные выражения, а также J5EE enumeration.
Платформа Java EE 5 фокусируется на простой разработке с использованием языковых аннотаций Java, которые были введены J2SE 5.0. JSP 2.1 поддерживает эту цель определением аннотаций для зависимых инъекций в JSP операторах и в контекстных слушателях (Listeners).
Обзор JavaServer Pages (JSP) позволяют отделить динамическую часть страниц от статического HTML. Динамическая часть заключается в специальные теги "<% %>": Имя вашего хоста: <%= request.getRemoteHost() %>
JSP страницы имеют расширение .jsp и размещаются там же, где и обычные Web-страницы. Структура таких страниц может состоять из пяти конструкций: HTML, комментарии, скриптовые элементы, директивы и действия. JSP-страница при компиляции преобразуется в сервлет со статическим содержимым, которое направляется в поток вывода, связанный с методом service. Поэтому при первом запросе этот процесс может вызвать небольшую задержку. Комментарии в документе или программе не являются причиной замедления программы, так как транслятор и исполнитель их игнорируют. Скриптовые элементы позволяют указать код на языке Java, который впоследствии станет частью конечного сервлета, директивы дают возможность управлять всей структурой сервлета, а действия служат для задания существующих используемых компонентов и также для контроля над поведением движка JSP. Для упрощения работы со скриптами имеются заранее определённые переменные, такие как request, response, pageContext, session, out, application, config, page, exception. Пример JSP страницы с использованием всех составляющих JSP:
Комментарии Комментарии используются для пояснения исходного текста программы. В JSP-страницах комментарии можно разделить на две группы: комментарии исходного кода JSP; комментарии HTML-разметки.
Комментарии исходного кода JSP отмечаются специальной последовательностью символов: <%-- в начале и --%> в конце комментария. Данный вид комментариев удаляется на этапе компиляции JSP-страницы. Пример JSP-комментария: <%-- Отобразит каталог изделий и актуальную корзину покупателя. --%>
Комментарии HTML-разметки оформляются в соответствии с правилами языка HTML. Данный вид комментариев рассматривается JSP-компилятором как статический текст и помещается в выходной HTML-документ. JSP-выражения внутри HTML-комментариев исполняются. Пример HTML-комментария: <!-- Дата создания страницы: <%= new java.util.Date() %> -->
Скриптовые элементы Спецификация JSP различает три типа скриптовых элементов: объявления <%! одна или несколько деклараций %>; выражения <%= одно выражение %>; скриплеты <% скриплет %>. Объявления обычно используются для определения переменных, методов, внутренних классов и остальных действующих Java конструкций на уровне класса. Выражения становятся аргументами для метода out.print(). С помощью скриплетов в JSP страницы вкладываются работающие части Java-кода.
Объявления JSP Объявления JSP позволят вам задавать переменные, методы, внутренние классы и так далее. Объявления используются для определения используемых в программе конструкций Java. Так как объявления не осуществляют вывода, обычно они используются совместно с JSP-выражениями или скриплетами. В приведённом в качестве примера фрагменте JSP отображается количество запросов к данной странице с момента загрузки сервера (или с момента последнего изменения и перезагрузки сервлета). Обратите внимание, что в примере мы используем как объявление, так и выражение и что внутри конструкции после объявления стоит точка с запятой (;): <%! private int accessCount = 0; %> Количество обращений к странице с момента загрузки сервера: <%= ++accessCount %>
Выражения JSP Выражения JSP применяются для того, чтобы вставить значения Java непосредственно в вывод. Выражения Java вычисляются, конвертируются в строку и вставляются в страницу. Эти вычисления проходят во время выполнения (то есть при запросе страницы), а потому существует полный доступ к информации о самом запросе. В выражениях можно использовать постоянные, переменные, вызовы различных методов. Все выражения, вне зависимости от сложности их содержимого, вычисляются в один результат или число. JSP страницы полагаются на JSP Writer, который берёт любой результат выражения, переводит его в тип String (текстовый) и заносит в буферную память. Например, следующий код служит для отображения даты и времени запроса данной страницы: Текущее время: <%= new java.util.Date() %> Имя вашего хоста: <%= request.getRemoteHost() %> Необходимо обратить внимание на три правила: JSP выражения должны в себе содержать выражения Java. Каждое JSP выражение должно содержать только одно выражение Java. Выражения JSP обязаны не заканчиваться точкой с запятой (;), в отличие от Java объявлений.
Скриплеты JSP Скриплеты JSP дают возможность вставить любой код в метод сервлета, который будет создан при обработке страницы, позволяя использовать большинство конструкций Java. Скриплеты также имеют доступ к тем же заранее определённым переменным, что и выражения. Поэтому, например, для вывода значения на страницу необходимо использовать заранее определённую переменную out. <% String queryData = request.getQueryString(); out.println("Дополнительные данные запроса: " + queryData); %> Код внутри скриплета вставляется в том виде, как он был записан. Весь статический HTML (текст шаблона) до или после скриплета конвертируется при помощи оператора print. Например, следующий фрагмент JSP содержит смешанный текст шаблона и скриплета: <% if (Math.random() < 0.5) { %> <B>Удачного</B> вам дня! <% } else { %> <B>Неудачного</B> вам дня! <% } %> После преобразования скриплета код будет выглядеть следующим образом: if (Math.random() < 0.5) { out.println("<B>Удачного</B> вам дня!"); } else { out.println("<B>Неудачного</B> вам дня!"); } Это означает, что скриплеты не обязательно должны содержать завершённые фрагменты Java, и что оставленные открытыми блоки могут оказать влияние на статический HTML вне скриплета.
Директивы JSP JSP страница может послать сообщение соответствующему контейнеру с указаниями действий, которые необходимо провести. Эти сообщения называются директивами. Все директивы начинаются с <%@, затем следует название директивы и один или несколько атрибутов со значениями, и заканчиваются %>. Директивы в JSP странице приводят к тому, что контейнер пошлёт заявку на исполнение определённой службы, которая в генерированном документе не объявляется. Форму записи директив можно изобразить следующим образом: <%@ директива атрибут="значение" %> Вы также можете объединить установку нескольких атрибутов для одной директивы: <%@ директива атрибут1="значение1" атрибут2="значение2" ... атрибутN="значениеN" %> Существует три основных типа директив: page, которая позволяет вам совершать такие операции, как импорт классов, изменение суперкласса сервлета, и т. п.; include, которая даёт вам возможность вставить в класс сервлета при трансляции JSP файла в сервлет; и taglib, позволяющий расширить множество тегов своими собственными, которые JSP контейнер способен истолковать.
Директива JSP page Как можно догадаться из названия, данная директива предоставляет атрибуты для JSP страницы. Атрибуты, определённые в этой директиве, внедряются в данную JSP страницу и на все её вложенные статические элементы, независимо от того, были ли они вставлены с помощью директивы include или с помощью действия jsp:include. Форма записи директивы page следующая: <%@ page атрибут=“значение“ %> В качестве примера приведём следующую запись: <%@ page import=”java.util.*, com.myclasses.*” buffer=”15kb” %> Эта директива заявляет, что JSP страница импортирует классы из двух пакетов Java, java.util и com.myclasses, а потом уточняет размер буферной памяти, которая должна быть использована для обработки данной JSP страницы.
Далее рассмотрим атрибуты директивы page: import="пакет.class1, пакет.class2, ..., пакет.classN". Позволяет вам задать пакеты, которые должны быть импортированы. Это единственный атрибут, который может использоваться несколько раз в одной директиве. В список необходимо включить все классы Java, которые Вы хотите использовать и которые не являются частью исходного набора импортируемых классов. Исходный набор содержит: java.lang.*, javax.servlet.*, javax.servlet.jsp.* и javax.servlet.http.*. Пример использования атрибута import: <%@ page import="java.util.Date, javax.text.SimpleDateFormat, com.myclasses.*" %> language="java". Данный атрибут предназначен для задания используемого языка программирования. По умолчанию принимается значение "java". Этот атрибут необязательно использовать, но тем не менее проблема потом может наступить в случае, если поставщик JSP контейнера будет использовать другие языки (например, JavaScript). Пример записи данного атрибута следующий: <%@ page language=”java” %>