Синтаксис страницы JSP

Страницы JSP имеют комбинированный синтаксис : объединение стандартного синтаксиса, соответствующего спецификации HTML, и синтаксиса JSP, определенного спецификацией Java Server Pages. Синтаксис JSP определяет правила записи страниц JSP, состоящих из стандартных тегов HTML и тегов JSP.

Страницы JSP, кроме HTML-тегов, содержат теги JSP следующих категорий:

JSP директивы

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

Синтаксис JSP директив выглядит следующим образом:

<%@ директива имяАтрибута="значение" %>

Синтаксис задания директив на XML:

<jsp:directive.директива имяАтрибута="значение" />

JSP директива может иметь несколько атрибутов. В этом случае директива может быть повторена для каждого из атрибутов. В то же время пары "имяАтрибута=значение" могут располагаться под одной директивой с пробелом в качестве разделителя.

Существует три типа директив :

  • page (страница)
  • taglib (библиотека тегов)
  • include (включить)

JSP директива page

JSP директива page определяет свойства страницы JSP, которые воздействуют на транслятор. Порядок следования атрибутов в директиве page не имеет значения. Нарушение синтаксиса или наличие нераспознанных атрибутов приводит к ошибке трансляции. Примером директивы page может служить следующий код:

<%@ page buffer="none" isThreadSafe="yes" errorPage="/error.jsp" %>

Директива page объявляет, что данная страница JSP не использует буферизацию, что возможно одновременное обращение к данной странице JSP многих пользователей, и что поддерживается страница ошибок с именем error.jsp.

JSP директива page может содержать информацию о странице:

<%@ page info = "JSP Sample 1" %>

Список возможных атрибутов директивы page представлен в таблице.

Наименование атрибутаЗначение Описание
language Строка Определяет язык, используемый в скриптлетах файла JSP, выражениях или любых включаемых файлах, в том числе, в теле оттранслированного кода. По умолчанию принимается значение "java"
extends Строка Задает суперкласс для генерируемого сервлета. Этот атрибут следует использовать с большой осторожностью, поскольку возможно что сервер уже использует какой-нибудь суперкласс
import Строка Определение импортируемых пакетов., например:
<%@ page import="java.util.* %>
Session true или false Значение true (принимается по умолчанию) свидетельствует о том, что заранее определенная переменная session (тип HttpSession) должна быть привязана к существующей сессии, если таковая имеется, в противном случае создается новая сессия, к которой осуществляется привязка. Значение false определяет что сессии не будут использоваться, и попытки обращения к переменной session приведут к возникновению ошибки при трансляции JSP страницы в сервлет
Buffer none или размер буфера в кБ. Задает размер буфера для JspWriter out. Значение принимаемое по умолчанию зависит от настроек сервера, и не должно превышать 8 кБ. Если значение равно none вывод происходит непосредственно в объект ServletResponse
autoFlush true или false Определяет, должен ли буфер освобождаться автоматически, когда он переполнен или произошла ошибка. По умолчанию значение true
isThreadSafe true или false Значение true (принимается по умолчанию) задает нормальный режим выполнения сервлета, когда множественные запросы обрабатываются одновременно с использованием одного экземпляра сервлета, исходя из соображения, что автор синхронизировал доступ к переменным этого экземпляра. Значение false ("ложь") сигнализирует о том, что сервлет должен наследовать SingleThreadModel (однопоточную модель), при которой последовательные или одновременные запросы обрабатываются отдельными экземплярами сервлета
info Строка Определяет строку информации о странице JSP, которая будет доступна с помощью метода Servlet.getServletInfo ()
errorPage Строка Значение атрибута представляет собой URL страницу, которая должна выводиться в случае возможных ошибок, вызывающих исключения
isErrorPage true или false Сигнализирует о том, может ли эта страница использоваться для обработки ошибок для других JSP страниц. По умолчанию принимается значение false
contentType Строка Определяет кодировку для страницы JSP и ответа, а также MIME-тип ответа JSP. Значение по умолчанию типа содержания - text/html, кодировки - ISO-8859-1. Например:
contentType="text/html;charset=ISO-8859-1"
pageEncoding Строка Определяет кодировку символов страницы JSP. По умолчанию используется charset из атрибута contentType, если оно там определено. Если значение charset в атрибуте contentType не определено, значение pageEncoding устанавливается равным ISO-8859-1

JSP директива taglib

JSP директива taglib объявляет, что данная страница JSP использует библиотеку тегов, уникальным образом идентифицируя ее с помощью URI, и ставит в соответствие префикс тега, с помощью которого возможны действия в библиотеке. Если контейнер не может найти библиотеку тегов, возникает фатальная ошибка трансляции.

Директива taglib имеет следующий синтаксис:

<%@ taglib uri="URI включаемой библиотеки тегов" prefix="имяПрефикса" %>

Префикс "имяПрефикса" используется при обращении к библиотеке. Пример использования библиотеки тегов mytags:

<%@ taglib uri="http://www.taglib/mytags" prefix="customs" %>
 . . .
<customs:myTag>

В данном примере библиотека тегов имеет URI-адрес "http://www.taglib/mytags", в качестве префикса назначена строка customs, которая используется в странице JSP при обращении к элементам библиотеки тегов.

JSP директива include

JSP Директива include позволяет вставлять текст или код в процессе трансляции страницы JSP в сервлет. Синтаксис директивы include имеет следующий вид:

<%@ include file="Относительный URI включаемой страницы" %>

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

<%@ include file="copyright.html" %>

Контейнер JSP получает доступ к включаемому файлу. Если включаемый файл изменился, контейнер может перекомпилировать страницу JSP. Директива include рассматривает ресурс, например, страницу JSP, как статический объект.

Заданный URI обычно интерпретируется относительно JSP страницы, на которой расположена ссылка, но, как и при использовании любых других относительных URI, можно задать системе положение интересующего ресурса относительно домашнего каталога WEB-сервера добавлением в начало URI символа "/". Содержимое подключаемого файла обрабатывается как обычный текст JSP и поэтому может включать такие элементы, как статический HTML, элементы скриптов, директивы и действия.

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

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

JSP директива declarations

JSP директива declarations предназначены для определения переменных и методов на языке скриптов, которые в дальнейшем используются на странице JSP. Синтаксис declarations имеет следующий вид :

<%! код Java %>

declarations располагаются в блоке объявлений, а вызываются в блоке выражений страницы JSP. Код в блоке объявлений обычно пишется на языке Java, однако серверы приложений могут использовать синтаксис и других скриптов. Объявления иногда используются для того, чтобы добавить дополнительную функциональность при работе с динамическими данными, получаемыми из свойств компонентов JavaBeans. Примеры объявлений представлены в таблице.

<%! int i ; %> Объявление глобальной целочисленной переменной i.
<%! String s = "Hello, World!"; %> Объявление и инициализация глобальной строковой переменной s.
<%! int n = 100; %> Объявление и инициализация глобальной целочисленной переменной n.
<%! public int adding (int a, int b){return a + b}; %> Объявление метода adding сложения двух целочисленных значений,
глобального для всей страницы JSP

Declarations может содержать несколько строк, как например, в приведенном ниже коде вычисления значения функции fact (int n), которая должна быть равна 1 при n меньше 2 и n! при положительном значении n;

<%! 
  public static int fact (int n) 
  { 
     if (n <= 1) 
         return 1; 
     else 
         return n * fact (n - 1); 
  } 
  %>

declarations не производят никакого вывода в стандартный выходной поток out. Переменные и методы, декларированные в объявлениях, инициализируются и становятся доступными для скриптлетов и других объявлений в момент инициализации страницы JSP.

Скриптлеты scriptlets

scriptlets включают различные фрагменты кода, написанного на языке скрипта, определенного в директиве language. Фрагменты кода должны соответствовать синтаксическим конструкциям языка скриптлетов, т.е., как правило, синтаксису языка Java. scriptlets имеют следующий синтаксис:

  <% текст скриптлета %>

Эквивалентом синтаксиса скриптлета для XML является:

<jsp:scriptlet> текст скриптлета </jsp:scriptlet>
Если в тексте скриптлета необходимо использовать последовательность символов %> именно как сочетание символов, а не как тег - признак окончания скриптлета, вместо последовательности %> следует использовать следующее сочетание символов %\>.

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

<% if (Calendar.getInstance ().get (Calendar.AM_PM) == Calendar.AM) {%>
   Good Morning 
<% } else { %>
   Good Afternoon 
<% } %>

Необходимо отметить, что код внутри скриплета вставляется в том виде, как он записан, и весь статический HTML-текст (текст шаблона) до или после скриплета конвертируется при помощи оператора print. Это означает что скриплеты не обязательно должны содержать завершенные фрагменты на Java, и что оставленные открытыми блоки могут оказать влияние на статический HTML-текст вне скриплета.

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

<% 
    String queryData = request.getQueryString (); 
    out.println ("Дополнительные данные запроса: " + queryData); 
%>

Выражения expressions

Выражения expressions в странице JSP - это исполняемое выражение, написанное на языке скрипта, указанного в объявлении language (как правило Java). Результат выражения JSP, имеющий обязательный тип String, направляется в стандартный поток вывода out с помощью текущего объекта JspWriter. Если результат выражения не может быть приведен к типу String, возникает либо ошибка трансляции, если проблема была выявлена на этапе трансляции, либо возбуждается исключение ClassCastException, если несоответствие было выявлено в процессе выполнения запроса. Выражение имеет следующий синтаксис:

 <%= текст выражения %>

альтернативный синтаксис для JSP expressions при использовании XML :

 <jsp:expression> текст выражения </jsp:expression>

Порядок выполнения expressions на странице JSP слева-направо. Если выражение появляется более чем в одном атрибуте времени выполнения, то оно выполняется слева-направо в данном теге. Выражение должно быть полным выражением на определенном скрипте (как правило Java).

expressions выполняются во время работы протокола HTTP. Значение выражения преобразуется в строку и включается в соответствующую позицию файла JSP.

Выражения обычно используются для того, чтобы вычислить и вывести на экран строковое представление переменных и методов, определенных в блоке объявлений страницы JSP или полученных от компонентов JavaBeans, которые доступны из JSP. Следующий код expressions служит для отображения даты и времени запроса страницы:

  Текущее время: <%= new java.util.Date () %>

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

  • request, HttpServletRequest;
  • response, HttpServletResponse;
  • session, HttpSession - ассоциируется с запросом , если таковой имеется;
  • out, PrintWriter - буферизированный вариант типа JspWriter для отсылки данных клиенту.

Комментарии JSP

В страница JSP можно использовать два типа комментариев:

  1. Выводимый комментарий (output comment).
  2. Закомментированный блок (commented block).

Выводимый комментарий - это такой стиль комментирования, при котором комментарий выводится в выходной поток и отображается в браузере. Синтаксис комментариев данного типа следующий:

  <!-- Текст комментария -->

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

  <!-- Начало комментария <%= expression %> продолжение комментария -->

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

  <%-- Текст комментария --%>
Наверх
  Рейтинг@Mail.ru