На главную страницу
Форум txt.version   




Статья :: Синтаксис Ядра и Семантика

Глава JSP.2

Синтаксис Ядра и Семантика


В этой главе описаны синтаксис ядра и семантика спецификации JavaServer Pages 1.2 (JSP 1.2).

JSP.2.1 Что такое Страница JSP?

JSP-страница это текстовый документ, который описывает, как создавать объект response из объекта request для данного протокола. Процессинг JSP-страницы может включать создание и/или использование других объектов.

JSP-страница определяет класс реализации JSP-страницы который реализует семантику JSP-страницы. Этот класс является подклассом Servlet'а (см. Главу JSP.8). Во время запроса, запрос, предназначенный для JSP-страницы, направляется объекту реализации JSP-страницы для обработки/процесинга.

HTTP является протоколом по умолчанию для запросов и ответов. Дополнительные протоколы запроса/ответа могут поддерживаться JSP-контейнерами (см. ниже). Объекты request и response по умолчанию имеют тип HttpServletRequest и HttpServletResponse, соответственно.

JSP.2.1.1 Web-Контейнеры и Web-Компоненты

JSP-контейнер это экземпляр системного уровня, предоставляющий обслуживание жизненного цикла и поддержку на этапе прогона для JSP-страниц Servlet-компонентов. Запросы, направляемые JSP-странице, направляются JSP-контейнером подходящему объекту реализации JSP-страницы. Термин web-контейнер является синонимом JSP-контейнера.

Web-компонент это сервлет или JSP-страница. Элемент servlet в дескрипторе публикации web.xml используется для описания обоих типов web-компонентов. Компоненты - JSP-страницы - определяются неявно в дескрипторе публикации через использование неявного отображения расширения  .jsp

JSP.2.1.2 XML-Документ для Страницы JSP

JSP-страницы имеют эквивалент - XML-документ. XML-просмотр JSP-страницы создан для фазы трансляции (см. ниже).

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

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

JSP.2.1.3 Фазы Трансляции и Выполнения

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

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

JSP-контейнер гибко работает с деталями класса реализации JSP-страницы, что может использоваться для адресации вопросов quality-of-service/качества-сервиса.


В фазе выполнения JSP-контейнер направляет события объекту реализации JSP-страницы. Контейнер отвечает за инициацию объектов request и response и вызов подходящего объекта реализации JSP-страницы.

По окончании процессинга, объект response получается контейнером для соединения с клиентом.
Детали соглашения/контракта между классом реализации JSP-страницы и JSP-контейнером описаны в Главе JSP.8.


Трансляция JSP-страницы-источника в класс её реализации может произойти в любой момент между начальной публикацией JSP-страницы в JSP-контейнер и получением и процессингом запроса клиента для целевой JSP-страницы. В Разделе JSP.2.1.5 описывается выполнение фазы трансляции перед публикацией.

JSP.2.1.4 События на Страницах JSP

JSP-страница может отмечать обработку некоторых событий. В JSP 1.2 только события init и destroy могут быть описаны в JSP-странице.


Когда первый запрос направляется JSP-странице, метод jspInit(), если он имеется, будет вызван для подготовки страницы. Аналогично, JSP-контейнер может вызывать метод JSP jspDestroy() для переделки ресурсов, используемых JSP-страницей, в любой момент, когда запрос не обслуживается. Это такой же жизненный цикл, что и у сервлетов.

JSP.2.1.5 Компилирование Страниц JSP

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

Таким способом утилиты авторизации JSP-страниц и библиотеки тэгов JSP могут использоваться для создания сервлетов. Преимущества этого подхода таковы:

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

Компиляция JSP-страницы в контексте web-приложения предоставляет разрешение спецификаций относительных URL в директивы include (и в другом месте), ссылок на taglib и акции времени трансляции, используемых в специальных акциях.


JSP-страница может также компилироваться во время публикации.
 

JSP.2.1.5.1 Упаковка Страницы JSP
 

Когда класс реализации JSP-страницы зависит от поддержки классов (в дополнение к классам JSP 1.2 и Servlet 2.3), классы поддержки включаются в упакованный WAR-файл (как определено в спецификации Servlet 2.3) для обеспечения переносимости по JSP-контейнерам.


В Приложении JSP.A есть два примера упаковки JSP-страниц в WAR'ы:

  1. JSP-страница, направляемая в своей исходной форме (вероятно, это самый распространённый случай).
  2. JSP-страница, оттранслированная в класс реализации плюс информация для публикации.

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

JSP.2.1.6 Отладка Страниц JSP

Раньше утилиты отладки не имели стандартного формата для передачи информации отображения исходного кода, позволяющей использовать отладчик одного производителя с JSP-контейнером другого. Спецификация с поддержкой отладки, преодолевшая эти ограничения, разрабатывается как JSR-045 процесса JCP 2.0 под названием “Debugging Support for Non-Java Languages/Поддержка Отладки для Не-Java-Языков”.


Детали можно найти по адресу  http://jcp.org/jsr/detail/45.jsp

JSP.2.1.7 Соглашение по Именованию для Файлов JSP

JSP-страница упаковывается в один или более файлов, часто - как web-приложение, и направляется утилите типа JSP-контейнера, J2EE-контейнера или IDE. Полная JSP-страница может содержаться в одном файле. В других случаях основной файл содержит другие файлы, которые содержать полные JSP-страницы или включаемые фрагменты.

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

Определение типа файла также часто практикуется на уровне документации и обслуживания, как должно быть уже известно тем, кто работает с соглашениями “.c” и “.h” языка C.


Спецификация Servlet 2.3 использует расширение “.jsp” для обозначения JSP-страницы, но не дифференцирует основные JSP-файлы и включаемые фрагменты.

Мы рекомендуем (но не обязываем), чтобы:

  • “.jsp”-файлы соответствовали JSP-файлам верхнего уровня, содержащимся в JSP-странице;
  • включаемые фрагменты не использовали расширение “.jsp”. Любые другие расширения допустимы, хотя “.jspf” и “.jsf” кажутся осмысленными и предлагаются в качестве варианта.

JSP.2.2  Web-Приложения

Приложение web это коллекция ресурсов, которые доступны по указанным URL.

Web-приложение состоит из следующих компонентов:

  • Среда(ы) Java, запущенная на сервере (необходима);
  • JSP-страница(ы), обрабатывающие запросы и генерирующие динамическое содержимое;
  • Сервлет(ы), обрабатывающие запросы и генерирующие динамическое содержимое Web-Приложения;
  • Серверные/Server-side компоненты JavaBeans, инкапсулирующие поведение и статус;
  • Статические страницы HTML, DHTML, XHTML, XML и аналогичные;
  • Файлы ресурсов, используемых Java-классами;
  • Клиентские/Client-side Java-Аплеты, компоненты JavaBeans и файлы Java-классов;
  • Среда(ы) Java (загружаемая через Plugin и Java Web Start), запущенная на клиенте(клиентах).

Web-приложения описаны более детально в спецификации Servlet 2.3. Web-приложение содержит дескриптор публикации web.xml, содержащий информация о JSP-страницах, сервлетах и других ресурсах, используемых в этом web-приложении. Дескриптор публикации детально описан в спецификации Servlet 2.3.

JSP 1.2 требует, чтобы эти ресурсы были неявно/косвенно ассоциированы с, и доступны через, уникальный экземпляр ServletContext, доступный как неявный объект приложения (Раздел JSP.2.8).

Приложение, которому принадлежит JSP-страница, отражается в объекте application и влияет на семантику следующих элементов:

JSP 1.2 поддерживает переносимую упаковку и публикацию/deployment web-приложений через спецификацию Servlet 2.3. Спецификация JavaServer Pages наследует от спецификации Servlet концепцию приложений, ServletContext'ы, Sessions/Сессии, Requests/Запросы и Responses/Ответы.

JSP.2.2.1 Специфицирование Относительных URL

Элементы могут использовать спецификации относительных URL, называемые “URI-пути” в спецификации Servlet 2.3. Эти пути описаны в спецификации RFC 2396. Мы имеем в виду часть path данной спецификации, а не части scheme или authority.

Некоторые примеры:

Путь относительно контекста это путь, начинающийся со знака “/”. Он интерпретируется относительно приложения, к которому принадлежит JSP-страница, то есть говорится, что её объект ServletContext предоставляет базовый контекстный URL.


Путь относительно страницы это путь, не начинающийся со знака “/”. Он интерпретируется как относительный к текущей JSP-странице или текущему JSP-файлу, в зависимости от того, где путь используется:

для директивы include (Раздел JSP.2.10.3); когда путь используется в  атрибуте файла - интерпретация относительно JSP-файла;

для акции jsp:include (Раздел JSP.4.4), когда путь используется атрибуте страницы - интерпретация относительно JSP-страницы.

В обоих случаях текущая страница (или файл) обозначается некоторой частью пути, начинающейся с “/”, который (путь) затем модифицируется новой спецификацией, производящей путь с начальным “/”.

Новый путь интерпретируется через объект ServletContext. См. точную информацию об этой интерпретации в Разделе JSP.2.10.4.


Спецификация JSP универсально интерпретирует пути в контексте web-сервера, где JSP-страница публикуется. Спецификация проходит через отображающую трансляцию. Семантика, обрисованная здесь, применяется к фазе времени трансляции, а не к фазе времени запроса.

JSP.2.3 Синтаксические Элементы Страницы JSP

В этом разделе описаны базовые синтаксические правила JSP-страниц.

JSP.2.3.1 Элементы и Шаблонные Данные

JSP-страница содержит элементы и шаблонные данные.

Элемент
является экземпляром типа элемента, известного JSP-контейнеру.

Шаблонные данные
это то, о чём JSP-танслятор ничего не знает.

Тип элемента описывает его синтаксис и семантику. Если элемент имеет атрибуты, тип описывает имена, верные типы атрибутов и их интерпретацию. Если элемент определяет объекты, семантика включает эти определяемые объекты и их типы.

JSP.2.3.2 Синтаксис Элемента

Имеются элементы трёх типов: директивы, элементы скриптинга и акции.

Директивы
 

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


Синтаксис элемента-директивы  <%@ директива...%>

Акции
 

Акции предоставляют информацию для фазы обработки запроса. Интерпретация акции может, и часто так и бывает, зависеть от специфики запроса, полученного JSP-страницей. Акции могут быть стандартными, то есть определёнными этой спецификацией, или custom/специальными, то есть предоставленными через посредство механизма развёртывания переносимых тэгов.

Элементы action следуют синтаксису XML-элемента: они имеют начальный тэг, включающий имя элемента, и могут иметь атрибуты, необязательное тело/body и соответствующий конечный тэг, или они могут быть пустыми тэгами, возможно, с атрибутами:
 

<mytag attr1=”значение атрибута”...>body</mytag>
 

и


<mytag attr1=”значение атрибута”.../>

<mytag attr1=”значение атрибута” ...></mytag>
 

Элемент имеет тип элемента, описывающий имя его тэга, верные атрибуты и их семантику.

Мы обращаемся к типу по имени его тэга.


JSP-тэги чувствительны к регистру, как в XML и XHTML.


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

Элементы Скриптинга


Элементы Скриптинга являются связкой между шаблонным текстом и акциями.

Есть три типа элементов скриптинга: declarations\объявления, scriptlets\скриптлеты и expressions\выражения.


Объявления имеют синтаксис <%! ... %>

скриптлеты   <% ... %>

выражения     <%= ... %>

JSP.2.3.3 Начальный и Конечный Тэги

Элементы, имеющие разные начальный и конечный тэги (при наличии тела), обязаны иметь начало и конец в одном файле. Стартовый тэг не может быть в одном файле, когда конечный тэг находится в другом файле.
То же самое правило применяется к элементам с альтернативным синтаксисом. Например, скриптлет имеет синтаксис <% скриптлет %>. Открывающий <% и закрывающий %> символы обязаны находиться в одном и том же физическом файле.
Язык скриптинга может также вводить ограничения на размещение начальных и конечных тэгов для специфических конструкций скриптинга. Например, в Главе 6 демонстрируется, как блоки языка Java не могут разделять начальный и конечный тэг; см. детали в Разделе JSP.6.4.

JSP.2.3.4 Пустые Элементы

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

<x:foo></x:foo>

<x:foo />

<x:foo/>

<x:foo><%-- любой комментарий --%></x:foo>
 

Далее - примеры непустых тэгов:
 

<foo> </foo>

<foo><%= выражение %></foo>

<foo><% скриптлет %></foo>

<foo><bar/></foo>

<foo><!-- комментарий --></foo>

JSP.2.3.5 Значения Атрибутов

Следуя спецификации XML, атрибуты всегда заключаются в кавычки. Одинарные или двойные кавычки могут использоваться для уменьшения необходимости ввода кавычек мнемониками; соглашения по кавычкам описаны в Разделе JSP.2.6. Есть два типа значений атрибутов: литералы и выражения времени запроса (Раздел JSP.2.13.1), но правила применения кавычек - одинаковы.

JSP.2.3.6 Правильные Имена Акций и Атрибутов

Имена акций обязаны следовать соглашению XML (т.е. обязаны быть NMTOKEN, как указано в спецификации XML 1.0). Имена атрибутов обязаны следовать соглашениям, описанным в спецификации JavaBeans.
Имена атрибутов, начинающиеся с jsp, _jsp, java или sun зарезервированы данной спецификацией.

JSP.2.3.7 Пробелы

В HTML и XML пробел обычно не является значащим, но есть исключения. Например, файл XML может начинаться символами <?xml, и, если это так, ведущих пробельных символов не должно быть.

Данная спецификация следует поведению пробелов, определённому в спецификации XML.

Пробел в теле текста документа не является значащим, но сохраняется.


Далее идут два фрагмента JSP с ассоциированным выводом.
Обратите внимание, что директивы не генерируют никаких данных и применяются глобально к JSP-странице.

Таблица 2.1: Пример 1 - Ввод
№ Строки Исходный Текст
1 <?xml version=”1.0” ?>
2 <%@ page buffer=”8kb” %>
3Здесь - остальная часть документа.


Результат:

Таблица 2.2: Пример 1 - Вывод
№ СтрокиТекст на Выходе
1<?xml version=”1.0” ?>
2 
3Здесь - остальная часть документа.


Следующие две таблицы - другой пример ввода и вывода:


Таблица 2.3: Пример 2 - Ввод
№ СтрокиИсходный Текст
1<% response.setContentType(“....”);
2что-нибудь... %><?xml version=”1.0” ?>
3<%@ page buffer=”8kb” %>
4Здесь - остальная часть документа.


Результат:

Таблица 2.4: Пример 2 - Вывод
№ СтрокиТекст на Выходе
1<?xml version=”1.0” ?>
2 
4Здесь - остальная часть документа.

JSP.2.4  Обработка Ошибок

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

JSP.2.4.1 Ошибки Процесса Времени Трансляции

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

Если трансляция возникает до получения клиентского запроса целевой JSP-страницы, обработка ошибок и уведомление зависят от реализации и не рассматриваются в данной спецификации. Фатальные ошибки трансляции должны в результате приводить к невозможности выполнения последующих клиентских запросов на трансляцию целевой страницы с соответствующей спецификацией ошибки: для протоколов HTTP будет возвращаться код ошибки 500 (Server Error/Ошибка Сервера).

JSP.2.4.2 Ошибки Процесса Времени Запроса

В процессе обработки запросов клиентов ошибки могут возникать в теле класса реализации JSP-страницы или в каком-либо другом коде (языка Java или других языков программирования реализации), вызываемом из тела класса реализации JSP-страницы.

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


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


Эти исключения могут отлавливаться и обрабатываться (как необходимо) в теле класса реализации JSP-страницы. Любые неотловленные исключения, вызываемые в теле класса реализации JSP-страницы, приводят к перенаправлению клиентского запроса и неотловленного исключения по URL errorPage, специфицированному этой JSP-страницей (или выполнением действий по умолчанию, если ничего не специфицировано).


Нарушающее java.lang.Throwable, описывающее появляющуюся ошибку, хранится в экземпляре javax.ServletRequest клиентского запроса, использующего метод setAttribute(), использующего имя “javax.servlet.jsp.jspException”.

Имена, начинающиеся с префиксов “java” и “javax”, зарезервированы различными спецификациями платформы Java. Префикс “javax.servlet” зарезервирован и используется спецификациями Servlet и JSP.

Если атрибут errorPage директивы страницы именует URL, который ссылается на другую JSP и та JSP сигнализирует, что на странице имеется ошибка (установкой атрибута isErrorPage директивы страницы в true), тогда неявная переменная языка программирования “exception” этой страницы инициализируется ссылкой Throwable-нарушителя.

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

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

JSP.2.5.1 Генерирование Комментариев при Выводе Клиенту

Для генерации комментариев, появляющихся в потоке вывода response к запрашивающему клиенту, используется следующий синтаксис комментариев HTML и XML:
 

<!-- комментарии ... -->
 

Такие комментарии рассматриваются JSP-контейнером как неизменяемый шаблонный текст. Если генерируемый комментарий должен содержать динамические данные, это может быть сделано посредством такого синтаксиса:
 

<!-- комментарии <%= выражение %> ещё комментарии ... -->

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

JSP-комментарий имеет форму:
 

<%-- что-либо, кроме закрывающих символов --%> ... --%>


Содержимое тела комментария полностью игнорируется. Комментарии используются для документирования, а также для “закомментирования” некоторой части JSP-страницы.

Обратите внимание, что JSP-комментарии не вкладываются.


Альтернативным способом размещения "комментария" на JSP-странице является использование механизма комментария языка скриптинга. Например:
 

<% /** это комментарий ... **/ %>

JSP.2.6 Соглашения по Кавычкам
и Escape-Последовательностям

В JSP-страницах применяются следующие соглашения по кавычкам:

Кавычки в Элементах Скриптинга
 

Литерал %> закавычивается %\>

Кавычки в Шаблонном Тексте


Литерал <% закавычивается <\%

Закавычивание Атрибутов


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

  • ‘ записывается \’. Это необходимо делать внутри значения атрибута, ограниченного одинарными кавычками.
  • “ записывается \”. Это необходимо делать внутри значения атрибута, ограниченного двойными кавычками.
  • \ записывается \\
  • %> записывается %\>
  • <% записывается <\%
  • Мнемоники &apos; и &quot; могут использоваться для ввода одинарных и двойных кавычек..
Примеры
 

В следующей строке показаны неправильные значения атрибутов:

  • <mytags:tag value="<%= "hi!" %>" />

В следующей строке дан верный скриптлет, но с, возможно, неожиданным результатом. Результат будет “Joe said %\>”, а не “Joe said %>”:

  • <%= "Joe said %\\>" %>


В следующих строках - правильное закавычивание:

  • <%= "Joe said %/>" %>
  • <%= "Joe said %\>" %>
  • <% String joes_statement = "hi!"; %>
    <%= "Joe said \"" + joes_statement + "\"." %>
    <x:tag value='<%="Joe said \\"" + joes_statement + "\\"."%>'/>
  • <x:tag value='<%= "hi!" %>' />
  • <x:tag value="<%= \"hi!\" %>" />
  • <x:tag value='<%= \"name\" %>' />
  • <x:tag value="<%= \"Joe said 'hello'\" %>"/>
  • <x:tag value="<%= \"Joe said \\\"hello\\\" \" %>"/>
  • <x:tag value="end expression %\>"/>
  • <% String s="abc"; %>
    <x:tag value="<%= s + \"def\" + \"jkl\" + 'm' + \'n\' %>" />
    <x:tag value='<%= s + \"def\" + "jkl" + \'m\' + \'n\' %>' />
Представление XML


Соглашения по кавычкам отличаются от соглашений XML. См. Главу JSP.5.

JSP.2.7 Общая Семантика Страницы JSP

Класс реализации JSP-страницыопределяет отображение метода _jspService() из объекта request в объект response. Некоторые детали этой трансформации специфичны для используемого языка скриптинга (см. Главу JSP.6). Некоторые детали не зависят от языка и описаны в данной главе.

Содержимое JSP-страницы большей частью описывает данные, которые записываются в поток вывода ответа. (JSP-контейнер обычно посылает эти данные обратно клиенту.) Это описание базируется на объекте JspWriter, который выводится через неявный объект out (см. Раздел JSP.2.8.3, “Неявные Объекты).

Его значение варьируется:

  • Сначала out - это новый объект JspWriter. Этот объект может отличаться от объекта stream, возвращаемого от response.getWriter(), и может рассматриваться как вставляемый позднее в последнем, чтобы реализовать буферизацию (см. Раздел JSP.2.10.1, “Директива page”). Это - начальный объект out. Авторам JSP-страниц запрещено записывать непосредственно в PrintWriter или OutputStream, ассоциированные с ServletResponse.
  • JSP-контейнер не должен вызывать response.getWriter() до тех пор, пока первая часть содержимого не будет переслана клиенту. Здесь поднимаются вопросы использования JSP, включая использование JSP как языка для ‘склейки’ акций, дающих бинарный контекст, или надёжного перенаправления сервлету, или динамического изменения типа содержимого ответа до генерации содержимого. См. Главу JSP.3.
  • В теле некоторых акций out может быть временно переназначен другому (вложенному) экземпляру объекта JspWriter. То, какой это случай, зависит от деталей семантики акции. Обычно содержимое этих временных потоков присоединяется к потоку, на который out ссылался перед этим, и out последовательно переназначается для того, чтобы ссылаться на предыдущий (внешний) поток. Такие вложенные потоки всегда буферизуются и требуют явной очистки/flushing, чтобы выгрузить вкладывающие потоки и их содержимое.
  • Если начальный out-объект JspWriter буферизуется, тогда, в зависимости от значения атрибута autoFlush директивы page, содержимое этого буфера будет либо автоматически очищаться перед потоком вывода ServletResponse, чтобы избежать переполнения, либо должно вызываться исключение, чтобы сигнализировать о переполнении буфера. Если начальный out-объект JspWriter не буферизуется, тогда содержимое, записанное в него, будет передано прямо в поток вывода ServletResponse.
    JSP-страница может также описывать, что должно происходить, когда возникают некоторые конкретные события. В JSP 1.2 могут быть описаны только события инициализации и ликвидации страницы. Эти события описаны с использованием “имён хорошо известных методов” в элементах обявления/declaration. (См. Раздел JSP.8.1.1.1).

JSP.2.8 Объекты

JSP-страница может создавать и модифицировать серверные объекты/server-side и получать к ним доступ.

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

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

Элементы скриптинга могут получать доступ к объектам непосредственно через переменную скриптинга.

Некоторые неявные объекты видны через переменные скриптинга на любой JSP-странице.

JSP.2.8.1 Объекты и Переменные

Объект может быть сделан доступным для кода в элементах скриптинга через переменную языка скриптинга.


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

Тип элемента указывает имя и тип таких переменных, хотя в деталях имя переменной может зависеть от Языка Скриптинга.

Язык скриптинга может также влиять на то, как происходит доступ к различным свойствам объекта. Например, в спецификации JavaBeans доступ к свойствам осуществляется через методы getter и setter, в то время как эти свойства доступны напрямую как переменные в языке JavaScript™.

Точные правила видимости переменных зависят от языка скриптинга. В Главе JSP.2.1 определены правила для случая, когда атрибут language директивы page установлен в “java”.

JSP.2.8.2 Объекты и Область Видимости

JSP-страница может создавать и/или получать доступ к Java-объектам при обработке запроса. Спецификация JSP указывает, что некоторые объекты создаются неявно, возможно, как результат директивы (см. Раздел JSP.2.8.3, "Неявные Объекты"). Другие объекты создаются явно через акции или непосредственно путём использования кода скрипта. Созданные объекты имеют атрибут scope, определяющий, где находится ссылка на объект и когда эта ссылка удаляется.

Созданные объекты могут также непосредственно видимы элементам скриптинга через переменные уровня скриптинга (см. Раздел JSP.2.8.3, "Неявные Объекты"). Каждая акция и объявление определяют, как часть своей семантики, какой объект они создают, с каким атрибутом scope и доступны ли они элементам скриптинга.


Объекты создаются внутри экземпляра JSP-страницы, которая отвечает объекту request.

Имеется несколько областей видимости:

  • page - Объекты с областью видимости page доступны только в пределах страницы, на которой они создаются. Все ссылки на такие объекты должны быть разорваны после того, как response/ответ отослан обратно клиенту из JSP-страницы или запрос направляется куда-либо ещё. Ссылки на объекты с областью видимости page хранятся в объекте pageContext.
  • request - Объекты с областью видимости request доступны со страниц, обрабатывающих этот же самый запрос там, где они были созданы. Ссылки на такой объект должны быть разорваны после обработки запроса. Конкретнее, если запрос направляется ресурсу на том же самом этапе прогона/runtime, объект остаётся доступным. Ссылки на объекты с областью видимости request хранятся в объекте request.
  • session - Объекты с областью видимости session доступны для страниц, обрабатывающих запросы, находящихся в той же сессии, что и страница, на которой они были созданы. Нельзя определять объект с областью видимости session из страницы, которая не находится в данной сессии (см. Раздел JSP.2.10.1, "Директива page"). Все ссылки на такой объект должны быть разорваны после того, как ассоциированная сессия закончилась. Ссылки на объекты с областью видимости session хранятся в объекте session, ассоциированном с активацией страницы.
  • application - Объекты с областью видимости application доступны для страниц, обрабатывающих запросы, находящихся в в том же приложении, что и страница, на которой они были созданы. Объекты с областью видимости application могут быть определены (и быть доступными) из страниц, не находящихся в данной сессии. Ссылки на объекты с областью видимости application хранятся в объекте application, ассоциированном с активацией страницы. Объект application является контекстом сервлета, получаемым из объекта конфигурации сервлета. Все ссылки на этот объект должны быть разорваны, когда рабочая среда/runtime environment запрашивает ServletContext.

Имя/name должно ссылаться на уникальный объект из всех точек в ходе выполнения, то есть все области видимости должны в действительности вести себя как единое пространство имён. Реализация JSP-контейнера может или может не форсировать это правило явно по соображениям производительности.

JSP.2.8.3 Неявные/Implicit Объекты

Авторы JSP-страниц имеют доступ к определённым неявным (неявно создаваемым) объектам, которые всегда доступны для использования в скриптлетах и выражениях через переменные скриптинга, которые объявляются неявно в начале страницы. Все языки скриптинга должны предоставлять доступ к этим объектам.

Неявные объекты доступны обработчикам тэгов через объект pageContext (см. ниже).

Каждый неявный объект имеет тип класса или интерфейса, определённый в основной технологии Java или в пакете Java Servlet API, как показано в Таблице JSP. 2-1.


Таблица JSP.2-1 Неявные Объекты, Доступные в JSP-страницах
Имя Переменной Тип Семантика & Области Видимости
request подтип, зависящий от протокола: javax.servlet.ServletRequest,
например:
javax.servlet.http.HttpServletRequest
Запрос, включающий вызов сервиса/службы.
Область видимости: request.
response подтип, зависящий от протокола: javax.servlet.ServletResponse,
например:
javax.servlet.http.HttpServletResponse
Ответ на запрос.
Область видимости: page.
pageContext javax.servlet.jsp.PageContext Контекст страницы для данной JSP-страницы.
Область видимости: page.
session javax.servlet.http.HttpSession Объект session, созданный для запрашивающего клиента (если клиент имеется).
Эта переменная верна только для протоколов Http.
Область видимости: session.
application javax.servlet.ServletContext Контекст сервлета, полученный из объекта конфигурации сервлета (как при вызове
getServletConfig().getContext())
Область видимости: application.
out javax.servlet.jsp.JspWriter Объект, записывающий в поток вывода.
Область видимости: page.
config javax.servlet.ServletConfig ServletConfig для данной JSP-страницы.
Область видимости: page.
page java.lang.Object Экземпляр класса реализации данной страницы, обрабатывающий текущий запрос.
Область видимости: page.

a. Если язык скриптинга - “java”, тогда “page” является синонимом для “this” в теле/body страницы.
Кроме того, может быть получен доступ к неявному объекту exception на странице ошибок, как указано в Таблице JSP.2-2.

JSP.2.8.4 Объект pageContext

PageContext это объект, предоставляющий контекст для хранения ссылок на объекты, используемые страницей. Он инкапсулирует зависящие от реализации свойства и предоставляет нужные методы. Класс реализации JSP-страницы может использовать PageContext для прогона в неизменённом виде в любом подходящем JSP-контейнере, одновременно используя преимущества специфичных для реализации улучшений типа высокопроизводительного JspWriters. См. детали в Главе JSP.9.

Таблица JSP.2-2 Неявные Объекты, Доступные на Страницах Ошибок\Error Pages
Имя ПеременнойТип Семантика & Область Видимости

exception

java.lang.Throwable Неотловленный Throwable, приводящий к вызову страницы информации об ошибках.
Область видимости: page.

Имена объектов с префиксами jsp, _jsp, jspx и _jspx, в любой комбинации нижнего и верхнего регистров, зарезервированы данной спецификацией JSP. См. в Разделе JSP.7.6.1 некоторые ненормативные соглашения для введения новых неявных объектов.

JSP.2.9 Семантика Шаблонного Текста

Семантика шаблонного (или неинтерпретированного) Текста очень проста: шаблонный текст передаётся текущему out\выводящему неявному объекту JspWriter после применения замен Раздела JSP.2.6, "Соглашения по Кавычкам и Escape-Последовательностям".

JSP.2.10 Директивы

Директивы являются сообщениями JSP-контейнеру.

Синтаксис директивы:


<%@ директива { атрибут=”значение” }* %>


Могут иметься необязательные пробелы после “<%@” и перед “%>”. Это синтаксис легко вводится и понятен, но он несовместим с XML. В Главе JSP.5 описано отображение директив в элементы XML.

Директивы не производят никакого вывода в текущий поток out. Есть три директивы: page и taglib описаны здесь, а директива include - в следующей главе.

JSP.2.10.1 Директива page

Директива page определяет количество свойств страницы и сообщает о них JSP-контейнеру.

Трансляционный модуль (JSP файл-источник и любые файлы, включённые директивой include) может содержать более одного экземпляра директивы page, все атрибуты будут применяться ко всему трансляционному модулю (т.е. директивы page не зависят от позиции). Однако должно быть только одно вхождение любого атрибута/значения, определённого этой директивой, в данном трансляционном модуле, исключая атрибут “import”; многократные использования этого атрибута накапливаются (с семантикой объединения упорядоченного набора/ordered set union). Другие такие множественные (пере)определения атрибута/значения приводят к фатальной ошибке трансляции. Пространство имён attribute/value зарезервировано для использования данной и последующими спецификациями JSP.

Нераспознаваемые атрибуты или значения приводят к фатальным ошибкам трансляции.

Примеры


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

<%@ page info=”my latest JSP Example” %>
 

Следующая директива запрашивает отсутствие буферизации, указывает, что страница является "безопасным потоком"/thread safe и предоставляет страницу для сообщений об ошибке:
 

<%@ page buffer=”none” isThreadSafe=”yes” errorPage=”/oops.jsp” %>
 

Следующая директива указывает, что язык скриптинга базируется на Java, что типы, объявленные в пакете com.myco, непосредственно доступны коду скриптинга и что должна использоваться буферизация в 16KB:
 

<%@ page language=”java” import=”com.myco.*” buffer=”16kb” %>

Синтаксис
 

<%@ page список_атрибутов_директивы_page %>
 

список_атрибутов_директивы_page ::= { language=”scriptingLanguage\языкСкриптинга”}

{ extends=”className”}
{ import=”importList”}
{ session=”true|false” }
{ buffer=”none|sizekb” }
{ autoFlush=”true|false” }
{ isThreadSafe=”true|false” }
{ info=”info_text” }
{ errorPage=”error_url” }
{ isErrorPage=”true|false” }
{ contentType=”ctinfo” }
{ pageEncoding=”peinfo”

Далее дана детальная информация об атрибутах:

Таблица JSP.2-1
Атрибут Описание
language Определяет язык скриптинга, используемый в скриптлетах, скриптлетах выражений и объявлениях внутри тела трансляционного модуля (JSP-страница любые файлы, включённые с использованием последующей директивы include). В JSP 1.2 единственным определённым и необходимым для данного атрибута значением языка скриптинга является “java”. Данная спецификация описывает семантику только для скриптов со значением атрибута языка “java”. Если “java” является значением языка скриптинга, фрагменты исходного кода Java Programming Language, используемые внутри данного трансляционного модуля, должны соответствовать спецификации Java Programming Language Specification так, как описано в Главе JSP.6.
Все языки скриптинга обязаны предоставлять неявные объекты, которые автор JSP-страниц может использовать в объявлениях, скриптлетах и выражениях. Специфические объекты, которые могут использоваться, определены в Разделе JSP.2.8.3, “Неявные Объекты.”
Все языки скриптинга обязаны поддерживать Java Runtime Environment (JRE)/Среду Java. Все языки скриптинга обязаны представлять объектную модель технологии Java окружению скрипта, особенно неявные переменные, свойства компонентов JavaBeans и публичные методы. Будущие версии спецификации JSP могут определять дополнительные значения атрибута language, и все такие значения резервируются.
Для директивы с атрибутом language не-”java” будет фатальной ошибкой появление после первого вычисленного элемента скриптинга.
extends Значением является полное квалифицированное имя класса языка программирования Java, которое именует суперкласс класса, к которому JSP-страница трансформируется (см. Главу JSP.8). Этот атрибут не должен использоваться без тщательного учёта ограничения им способности JSP-контейнера предоставлять специализированные суперклассы, которые могут улучшить качество службы представления. См. в Разделе JSP.7.6.1 альтернативный способ ввода объектов на JSP-страницу, не имеющий такого недостатка.
import Атрибут import описывает типы, которые доступны среде скриптинга. Значение - такое же, как для объявления import в языке программирования Java, т.е. список (разделённых запятыми) полных квалифицированных имён типов языка программирования Java, обозначающих этот тип, или имя пакета с последующей строкой “.*”, обозначающей все публичные типы, объявленные в этом пакете. Список import должен будет импортироваться транслируемой реализацией транслируемой JSP-страницы и будет, таким образом, доступен среде скриптинга.
По умолчанию список импорта - java.lang.*, javax.servlet.*, javax.servlet.jsp.* и javax.servlet.http.*. В настоящее время это значение определено только тогда, когда значением директивы language является “java”.
session Означает, что данная страница требует участия в (http) сессии. Если “true”, тогда неявная переменная языка скрипта с названием “session” типа javax.servlet.http.HttpSession ссылается на текущую/новую сессию для этой страницы. Если “false” - тогда эта страница не участвует в сессии; неявная переменная “session” недоступна, и любая ссылка на неё в теле JSP-страницы является недопустимой и приводит к фатальной ошибке трансляции. По умолчанию “true”.
buffer Специфицирует модель буферизации для начального “out” JspWriter для обработки содержимого вывода с этой страницы. Если “none”, тогда буферизации нет и весь вывод записывается непосредственно в ServletResponse PrintWriter. Размер может специфицироваться только в килобайтах, и суффикс “kb” является мандатным (обязательным). Если размер буфера специфицирован, тогда вывод буферизуется с размером буфера не меньше специфицированного. В зависимости от значения атрибута “autoFlush”, содержимое этого буфера автоматически очищается, или возникает исключение при появлении переполнения. По умолчанию буферизуется с размером буфера реализации не менее 8kb.
autoFlush Специфицирует, должен ли буферизованный вывод очищаться автоматически (значение “true”), когда буфер заполнен, или должно вызываться исключение/exception (значение “false”), означающее переполнение буфера.
По умолчанию “true”.
Примечание: не допускается установка autoFlush в “false”, если “buffer=none”.
isThreadSafe Обозначает уровень потока, безопасно выполняемого на странице. Если “false” - тогда JSP-контейнер должен выполнять диспетчеризацию множественных внешних запросов клиентов, по одному за раз в порядке их поступления, реализации страницы для процессинга. Если “true”, тогда JSP-контейнер может избрать одновременное направление странице  множественных внешних запросов клиентов. Авторы страниц, использующие “true”, должны быть уверены, что осуществляется соответствующая синхронизация доступа к странице.
По умолчанию “true”.
Заметьте, что, даже если атрибут isThreadSafe имеет значение “false”, автор JSP-страницы должен иметь уверенность, что доступы к любым объектам раздельного использования/shared соответствующим образом синхронизированы. Объекты могут использоваться раздельно в ServletContext или в HttpSession.
info Определяет произвольную строку, которая внедряется в транслируемую страницу, которая затем может быть получена из реализации страницы методом Servlet.getServletInfo().
isErrorPage Указывает, предназначена ли текущая JSP-страница служить целевым URL для другой JSP-страницы как errorPage. Если “true”, тогда неявная переменная языка скриптинга “exception” определяется и её значением является ссылка на нарушающий Throwable из исходной JSP-страницы, в случае ошибки.
Если “false” - неявная переменная “exception” недоступна, и любая ссылка на неё в теле JSP-страницы является недопустимой и приведёт к фатальной ошибке трансляции.
По умолчанию “false”.
errorPage Определяет URL ресурса, которому любой объект(ы) Throwable языка программирования Java, вызываемый, но не отлавливаемый реализацией страницы, направляется для обработки ошибки. Спецификация предоставляемого URL выполняется так, как указано в Разделе JSP.2.2.1. Если URL именует другую JSP-страницу, тогда неявная переменная скрипта вызываемого исключения этой JSP-страницы содержит ссылку на начальный неотловленый Throwable. URL по умолчанию зависит от реализации.
Обратите внимание, что объект Throwable передаётся реализацией страницы, вызывающей исключение/throwing, реализации страницы ошибки, сохраняя ссылку на объект в обычном объекте ServletRequest путём использования метода setAttribute(), с именем “javax.servlet.jsp.jspException”.
Примечание: если autoFlush=true, то, если содержимое начального Jsp-Writer было очищено для потока вывода ServletResponse, любая последующая попытка диспетчеризации неотловленного исключения из страницы-нарушителя странице errorPage может потерпеть неудачу. Если страница обработки ошибок указана также в дескрипторе web.xml, то сначала применяется JSP-страница обработки ошибок, а затем страница web.xml.
contentType

Определяет кодировку символов для JSP-страницы и для JSP-страницы - ответа и тип MIME для JSP-страницы - ответа. Значения могут иметь форму “TYPE” или “TYPE; charset=CHARSET” с необязательным пробелом после “;”.
CHARSET, если имеется, обязан быть значением IANA для кодировки символов.
TYPE это MIME-тип: см. в регистре IANA используемые значения.
Для TYPE значение по умолчанию - “text/html”; значение по умолчанию для кодировки символов - ISO-8859-1.
См. в Главе 3 детальную информацию о кодировках символов.

pageEncoding Определяет кодировку символов для JSP-страницы. Значения имеют форму “CHARSET”, который обязан быть IANA-значением для кодировки символов. Значение contentType для CHARSET используется по умолчанию, если имеется, в противном случае - ISO-8859-1. См. в Главе 3 детальную информацию о кодировках символов.

JSP.2.10.2 Директива taglib

Набор значащих тэгов, интерпретируемых JSP-контейнером, может быть расширен “tag library/библиотекой тэгов”. Директива taglib на JSP-странице объявляет, что данная страница использует библиотеку тэгов, уникально идентифицирует библиотеку тэгов, используя URI, и ассоциирует префикс тэгов, который служит для отличения использования акций в этой библиотеке. Если реализация JSP-контейнера не может локализовать описание библиотеки тэгов, должна возникать фатальная ошибка трансляции. Фатальная ошибка трансляции возникнет также, если директива taglib появится после акций, использующих данный префикс.

Библиотека тэгов может включать метод проверки корректности использования JSP-страницей функциональности библиотеки тэгов. См. более конкретные детали в Главе JSP.7. Также см. замечания по реализации в Разделе JSP.7.2.3.

Примеры


В следующем примере библиотека тэгов вводится и становится доступной данной странице путём использования префикса super; никакие другие библиотеки тэгов не должны вводиться на данной странице, используя этот префикс. В данном конкретном случае мы принимаем, что библиотека тэгов включает тип элемента doMagic, который используется на странице.
 

<%@ taglib uri=”http://www.mycorp/supertags” prefix=”super” />

...

<super:doMagic>

...

</super:doMagic>

Синтаксис


<%@ taglib uri=”tagLibraryURI” prefix=”tagPrefix” %>
 

где атрибуты:
 

Таблица JSP.2-1
uri Спецификация абсолютного или относительного URI, который уникально идентифицирует дескриптор библиотеки тэгов, ассоциированной с данным префиксом.
URI используется для локализации описания библиотеки тэгов, как указано в Главе 7.
tagPrefix Определяет строку prefix в конструкции <prefix>:<tagname>, которая используется для отличения специальной акции, например, <myPrefix:myTag>.
Использование префиксов, начинающихся с jsp:, jspx:, java:, javax:, servlet:, sun: и sunw:, зарезервировано.
Префикс обязан следовать соглашению об именовании, специфицированному в спецификации пространств имён XML.
Пустые префиксы в данной версии спецификации не допускаются.

Фатальная ошибка трансляции возникнет, если транслятор JSP-страницы обнаруживает тэг с именем prefix: Name, использующий префикс, введённый директивой taglib, и если Name не распознаётся соответствующей библиотекой тэгов.

JSP.2.10.3 Директива include

Директива include используется для подстановки текста и/или кода в JSP-страницу на этапе трансляции.

Директива <%@ include file=”спецификация относительного URL” %> вставляет текст специфицированного ресурса в .jsp-файл. Включённый файл является субъектом контроля доступа, доступного JSP-контейнеру. Атрибут file рассматривается в Разделе JSP.2.2.1. JSP-контейнер может включать механизм уведомления в случае изменения включённого файла, чтобы контейнер мог перекомпилировать эту JSP-страницу, однако спецификация JSP 1.2 не содержит способа указания JSP-контейнеру, что включённые файлы должны изменяться.

Примеры
 

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

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

Синтаксис
 

<%@ include file="спецификация относительного URL" %>

JSP.2.10.4 Включение Данных в Страницы JSP

Включение данных является важной частью задач JSP-страницы. Соответственно, спецификация JSP 1.2 имеет два механизма включения для различных задач. Обобщение их семантики дано в Таблице JSP.2-1.

Таблица JSP.2-1 Обобщение Механизмов include в спецификации JSP 1.2
1
Синтаксис СпецификацияОбъект Описание
Директива include - Время Трансляции
<%@ include file=... %> относительно файла статический/static Содержимое разбирается/parsed JSP-контейнером. JSP.2.10.3
Акция include - Время Запроса
<jsp:include page= /> относительно страницы статический и динамический Содержимое не разбирается; оно вставляется в этом месте. JSP.4.4

Колонка Спецификация описывает, какой тип спецификации является верным для данного элемента. Данная спецификация JSP требует специфицировать относительный URL. Ссылка разрешается сервером web/приложений, и выполняется отображение её URL. Директивы include интерпретируются относительно текущего JSP-файла; акции jsp:include интерпретируются относительно текущей JSP-страницы. Директива include относится к ресурсу вроде JSP-страницы как к статичному/static объекту; т.е. байты в JSP-странице включаются. Акция include относится к ресурсу вроде JSP-страницы как к динамическому/dynamic объекту; т.е. запрос направляется этому объекту, и результат процессинга включается .

JSP.2.11 Элементы Скриптинга/Сценариев

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

Есть три класса элементов скриптинга: declarations\объявления, scriptlets\скриптлеты и expressions\выражения. Язык скриптинга, используемый на данной странице, задаётся значением директивы language (см. Раздел JSP.2.10.1, "Директива page"). В JSP 1.2 единственным определённым значением является “java”.

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

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

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

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

Все такие языки скриптинга обязаны поддерживать:

  • манипуляцию объектами Java,
  • вызов методов объектов Java,
  • отлов исключений языка Java.

Точное определение семантики скриптинга, выполняемого с использованием элементов на базе языка Java, дано в Главе JSP.6.

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

Каждый элемент скриптинга имеет следующий синтаксис на базе “<%”:
 

<%! это объявление %>
 

<% это скриптлет %>
 

<%= это выражение %>
 

Могут иметься необязательные пробелы после “<%!”, “<%” и “<%=” и до “%>”.


Эквивалентные данным элементам скриптинга элементы XML описаны в Разделе JSP.5.2.

JSP.2.11.1 Объявления

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

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

Примеры


Например, первое объявление здесь объявляет целое число, глобальное в пределах страницы.

Второе объявление делает то же самое и инициализирует число в нуль. Этот тип инициализации должен выполняться осторожно при наличии нескольких запросов к странице.

В третьем случае объявляется метод, глобальный в пределах страницы.
 

<%! int i; %>
 

<%! int i = 0; %>
 

<%! public String f(int i) { if (i<3) return(“...”); ... } %>

Синтаксис
 

<%! объявление(-я) %>

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

Скриптлеты могут содержать любые фрагменты кода, которые являются верными для языка скриптинга, специфицированного директивой language. Является ли фрагмент кода действующим, зависит от деталей языка скриптинга (см. Главу JSP.6).

Скриптлеты выполняются во время обработки запроса. Производят они вывод в поток вывода или нет, зависит от кода скриптлета.

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

Чтобы использовать последовательность символов %> как литеральные символы в скриптлете, вместо того , чтобы они оканчивали скриптлет, вводите их так %\>.

Примеры


Вот простой пример динамического изменения страницы, в зависимости от времени суток.
 

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

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


<% int i; i= 0; %>
Привет, значение i равно <% i++ %>

Синтаксис


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

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

Элемент expression в JSP-странице является выражением языка скриптинга, которое вычисляется, а результат приводится к String. Результат затем посылается в текущий объект вывода JspWriter. Если результат выражения не может быть приведён к String, обязаны выполняться следующие действия:

Если проблема обнаружена на этапе трансляции, должна возникать ошибка времени трансляции.

Если приведение не обнаруживается в процессе трансляции, должно вызываться исключение ClassCastException/ОшибкаПриведенияКласса во время запроса.

Язык скриптинга может поддерживать побочные эффекты в выражениях, когда выражение вычисляется.

Выражения вычисляются слева направо на JSP-странице. Если выражения появляется в более чем одном атрибуте времени выполнения, они должны вычисляться слева направо в тэге. Выражение может изменять значение объекта out, хотя это не всегда легко выполнимо. Выражение обязано быть полным выражением языка скриптинга, на котором оно написано.

Выражения вычисляются во время HTTP-процессинга.

Значение выражения конвертируется к String и вставляется в соответствующую позицию в .jsp-файл.

Примеры


Вставляется текущая дата:


<%= (new java.util.Date()).toLocaleString() %>

Синтаксис


<%= выражение %>

JSP.2.12 Акции

Акции могут воздействовать на текущий поток вывода и использовать, модифицировать и/или создавать объекты. Акции могут зависеть от деталей конкретного объекта request/запроса, получаемого JSP-страницей.
Данная спецификация JSP содержит некоторые акции, которые являются стандартными и обязаны реализовываться всеми соответствующими JSP-контейнерами; эти акции описываются в Главе 4.

Новые акции определяются в соответствии с механизмами, описанными в Главах 7 и 10, и вводятся с использованием директивы taglib.

Синтаксис элементов акций базируется на XML. Акции могут быть пустыми и непустыми.

JSP.2.13 Семантика Интерпретации Атрибута Тэга

Интерпретация всех акций начинается с вычисления значений, данных их атрибутам, слева направо и присвоения этих значений атрибутам. В этом процессе могут производиться конверсии; правила конверсии описаны в Разделе JSP.2.13.2.

Многие значения являются фиксированными ‘значениями времени трансляции’, но JSP 1.2 предоставляет также механизм описания этих значений, когда они вычисляются на этапе запроса, правила описаны в Разделе JSP.2.13.1.

JSP.2.13.1 Значения Атрибутов Времени Запроса

Значение атрибута в форме “<%= scriptlet_expr %>” или ‘<%= scriptlet_expr %>’ обозначает значение атрибута времени запроса. Указываемое значение является значением включаемого скриптлета. Значения атрибутов времени запроса могут использоваться только в акциях и не могут использоваться в директивах. Если в тэге имеется более одного такого атрибута, выражения вычисляются слева направо.

Закавычивание выполняется так же, как и в других значениях атрибута (Раздел JSP.2.6). Таким способом могут обозначаться только значения атрибута (имя атрибута всегда является явно определённым именем).

Выражение обязано появляться само по себе (множественные выражений и смешивание выражений и строковых констант не допускаются).

Множественные операции обязаны выполняться внутри выражения.

Конверсия типов описана в Разделе JSP.2.13.2. По умолчанию все атрибуты имеют семантику времени трансляции страницы. Попытка специфицировать выражение скриптлета как значение атрибута, который (по умолчанию или нет) имеет семантику времени трансляции, является недопустимой и приводит к фатальной ошибке трансляции.

Тип элемента action указывает, будет ли данный атрибут принимать значения атрибута времени запроса.

Большинство атрибутов стандартных акций из Главы 4 имеют семантику времени трансляции страницы, но следующие атрибуты принимают выражения атрибутов времени запроса:

JSP.2.13.2 Соглашения о Типах

Мы описываем два случая конверсии типов:

JSP.2.13.2.1 Конверсия из Значений String


Значение строки может использоваться для описания значения типа не-String через конверсию. Возможна ли конверсия и, если да, какая она, зависит от типа назначения.


Значения String могут использоваться для присвоения значений типу, который имеет класс PropertyEditor, как указано в спецификации JavaBeans. Если это именно тот случай, используется метод setAs-Text(String).

Конверсия терпит неудачу, если метод вызывает исключение IllegalArgumentException.


Значения String могут также использоваться для присвоения типов, как указано в Таблице JSP.2-2. Применяется так конверсия, которая указана в таблице. Неудача конверсии ведёт к ошибке времени трансляции или времени запроса.

Таблица JSP.2-2 Конверсия из Строковых Значений в Тип Назначения
Тип Назначения Исходное Строковое Значение
Свойство Bean Использовать setAsText(string-literal)
boolean или Boolean Как указано в java.lang.Boolean.valueOf(String)
byte или Byte Как указано в java.lang.Byte.valueOf(String)
char или Character Как указано в String.charAt(0)
double или Double Как указано в java.lang.Double.valueOf(String)
int или Integer Как указано в java.lang.Integer.valueOf(String)
float или Float Как указано в java.lang.Float.valueOf(String)
long или Long Как указано в java.lang.Long.valueOf(String)
short или Short Как указано в java.lang.Short.valueOf(String)
Object Как если бы new String(string-literal)

Эти конверсии являются частью общего механизма, используемого для присвоения значений атрибутам акций: когда значение атрибута, который не является атрибутом времени запроса, присваивается данному атрибуту, используется описанная здесь конверсия, использующая тип атрибута как целевой тип. Тип каждого атрибута стандартных акций описан в данной спецификации, а типы атрибутов специальных/custom акций описаны в ассоциированном с ними Дескрипторе Библиотеки Тэгов/Tag Library Descriptor.

Конкретная акция может также определять дополнительные способы использования конверсии типа/значения.

В Разделе JSP.4.2 описан механизм, используемый для стандартной акции setProperty.

JSP.2.13.2.3 Конверсия из Выражений Времени Запроса


Выражения времени запроса могут назначаться свойству любого типа.

Автоматическая конверсия не выполняется.

Синтаксис Ядра и Семантика

страницы в данном разделе 
 Упаковка JSP-страниц  ОТД и Схема для Синтаксиса XML
 ОТД Дескриптора Библиотеки Тэгов  ОТД для TLD JSP 1.1
 Приложение Е - Изменения.  Приложение F - Словарь.
 Содержание  Обзор
 Синтаксис Ядра и Семантика  Вопросы Локализации
 Стандартные Акции  Документы JSP
 Скриптинг  Расширения Тэгов
 JSP-Контейнер  Основной API
 API Развёртывания Тэгов  Содержание
 right-index   


Разделы
Околокомпьютерная литература (375)
Программирование (102)
Программы (75)
ОС и Сети (49)
Интернет (29)
Аппаратное обеспечение (16)
Базы данных (6)

Содержание сайта (выборка)
Apache
Протоколы TCP/IP (принципы, протоколы и архитектура)

PHP, PELR, JSP
PHP
JavaServer Pages (JSP)

Базы данных
Основы mysql
СУБД INFORMIX
СУБД POSTGRES
Основы проектирования реляционных баз данных

HTML, javascript
Спецификация HTML 4.01
Каскадные Таблицы Стилей, Уровень 2
Клиентский JavaScript. Справочник.
JavaScript руководство пользователя
Серверный JavaScript 1.4. Руководство по Использованию.

Паскаль, C, C++, C#
GCC (примеры)
FAQ Валентинa Озеровa DELPHI
C





 
©  programming-lang.com  справочник программиста