Глава JSP.6

Скриптинг


В этой главе детально разбираются Элементы Скриптинга, когда значением директивы language является "java". Этот язык скриптинга базируется на языке программирования Java (как специфицировано в "The Java Language Specification"), но заметьте, что верная Java-программа не является верной JSP-страницей или её разделом.
 

Далее детально описаны взаимоотношения объявлений скриптинга, скриптлетов и выражений скриптов и языка программирования Java. Описание дано в терминах структуры класса реализации JSP-страницы.

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

JSP.6.1 Общая Структура

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

JSP.6.1.1 Верная Страница JSP

JSP-страница является таковой для Платформы Java, если, и только если, класс реализации JSP-страницы, определённый по Таблице JSP.6-1 (после применения всех директив include), вместе со всеми прочими классами, определёнными JSP-контейнером, является верной программой для данной Java-Платформы и если он передаёт методы проверки для всех библиотек тэгов, ассоциированных с этой JSP-страницей.

JSP.6.1.2 Зарезервированные Имена

Sun Microsystems резервирует для спецификаций JSP все имена, имеющие форму {_}jsp_* и {_}jspx_*, в любом сочетании верхнего и нижнего регистров.

Имена, имеющие такую форму и не определённые в данной спецификации, зарезервированы фирмой Sun для будущих расширений.

JSP.6.1.3 Гибкость Реализации

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

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

Таблица JSP.6-1  Структура Класса JavaProgramming
необязательное выражение импорта, как указано директивой jsp. import name1
SuperClass выбирается JSP-контейнером, либо автором JSP через использование директивы jsp. Имя класса (_jspXXX) зависит от реализации. class _jspXXX extends SuperClass
Начало тела/body класса реализации JSP-страницы. {
(1) Раздел Объявлений // объявления...
Подпись для генерируемого метода. public void _jspService(<ServletRequestSubtype>
request,
<ServletResponseSubtype> response)
 throws ServletException, IOException {
(2) Раздел Неявных/Implicit Объектов // код, определяющий и инициализирующий request, response, page, pageContext и т.п.
(3) Главный/Main Раздел // код, определяющий выражение отображения request/response метода _jspService
закрытие метода _jspService }
закрытие _jspXXX }

JSP.6.2 Раздел Объявлений

Раздел объявлений соответствует элементам объявлений. Содержимое этого раздела определяется путём конкатенации всех объявлений на странице в порядке их появления.

JSP.6.3 Раздел Инициализации

Этот раздел определяет и инициализирует неявные объекты, доступные JSP-странице. См. Раздел JSP.2.8.3, "Неявные Объекты.

JSP.6.4 Раздел Main/Главный

Этот раздел осуществляет главное отображение/mapping между объектами request и response.

Содержимое кодового сегмента 2 определяется скриптлетами, выражениями и текстовым телом JSP-страницы.

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

Трансляция зависит от типа элемента:

JSP.6.4.1 Шаблонные Данные

Шаблонные данные трансформируются в код, который будет размещать шаблонные данные в потоке, именованном неявной переменной out в процессе исполнения кода. Пробелы сохраняются.
 

Опуская подробности закавычивания и производительности, это соответствует оператору вида:

Оригинал Эквивалентный Текст
шаблон out.print(шаблон)

JSP.6.4.2 Скриптлеты

Скриптлет трансформируется во фрагмент кода вида:

Оригинал Эквивалентный Текст
<% фрагмент %> фрагмент

JSP.6.4.3 Выражения

Выражение трансформируется в оператор Java для вставки значения выражения (конвертированного, если необходимо, в java.lang.String), в поток, именованный неявной переменной out. Никакие дополнительные символы новой строки или пробелы не включаются.

Опуская подробности закавычивания и производительности, это соответствует оператору вида:

Оригинал Эквивалентный Текст
<%= выражение %> out.print(выражение)

JSP.6.4.4 Акции

Акция, определяющая один или более объектов, трансформируется в одно или несколько объявлений переменных для этих объектов вместе с кодом, инициализирующим эти переменные. На их видимость влияют другие конструкции, например, скриптлеты.

Семантика типа акции определяет имена переменных (обычно имя атрибута id, если он имеется) и их тип.

Единственной стандартной акцией в спецификации JSP, которая определяет объекты, является акция jsp:usebean. Имя вводимой переменной это имя атрибута id, а тип - атрибута класса.

Оригинал Эквивалентный Текст

<x:tag>
  foo
</x:tag>

объявляются переменные AT_BEGIN
{
объявляются переменные NESTED
трансформации foo
}
объявляются переменные AT_END

Обратите внимание, что значение атрибута scope/область видимости не влияет на видимость переменных внутри генерируемой программы. Оно влияет на то, где и как долго будут существовать дополнительные ссылки на объект, обозначенный этой переменной.