JSP.4.4 <jsp:include>
Элемент <jsp:include .../> предоставляется для включения статических и динамических ресурсов в тот же контекст, что и у текущей страницы. См. в резюме по облегчению включения.
Включение производится в текущее значение out/вывода. Этот ресурс специфицирован путём использования relativeURLspec/спецификации относительного URI, которая интерпретируется в контексте web-сервера (т.е. она отображается/mapped).
Атрибуты page акций jsp:include и jsp:forward интерпретируются относительно текущей JSP-страницы, поскольку атрибут file в директиве include интерпретируется относительно текущего JSP-файла. См. ниже примеры таких комбинаций.
Включаемая страница имеет доступ только к объекту JspWriter и не может устанавливать шапки/headers. Это предотвращает вызов методов, подобных setCookie(). Попытки вызова таких методов будут игнорироваться. Это ограничение эквивалентно ограничению, вводимому методом include() класса RequestDispatcher.
Акция jsp:include может иметь субэлементы jsp:param, которые могут предоставлять значения некоторым параметрам в запросе для использования в процессе включения.
Процессинг запроса продолжается вызовом JSP-страницы, после того как включение выполнено.
Атрибут flush управляет очисткой. Если он true, тогда, если вывод страницы буферизуется и атрибут flush получает значение ’true’, буфет очищается до включения, в ином случае буфер не очищается. По умолчанию атрибут flush имеет значение ’false’.
Примеры
<jsp:include page=”/templates/copyright.html”/>
Вышеприведённый пример - это простое включение объекта. Путь интерпретируется в контексте Web-Приложения. Это похоже на static/статичный объект, но он может также отображаться в, например, Servlet посредством web.xml.
Например, в качестве более сложного набора включений рассмотрим следующие 4 ситуации, построенные с использованием 4 JSP-файлов: A.jsp, C.jsp, dir/B.jsp и dir/C.jsp:
A.jsp говорит <%@ include file=”dir/B.jsp”%>, а dir/B.jsp говорит <%@ include file=”C.jsp”%>.
В данном случае относительная спецификация “C.jsp” разрешается в “dir/C.jsp”.
A.jsp говорит <jsp:include page=”dir/B.jsp”/>, а dir/B.jsp говорит <jsp:include page=”C.jsp” />.
В данном случае относительная спецификация “C.jsp” разрешается в “dir/C.jsp”.
A.jsp говорит <jsp:include page=”dir/B.jsp”/>, а dir/B.jsp говорит <%@ include file=”C.jsp” %>.
В данном случае относительная спецификация “C.jsp” разрешается в “dir/C.jsp”.
A.jsp говорит <%@ include file=”dir/B.jsp”%>, а dir/B.jsp говорит <jsp:include page=”C.jsp”/>.
В данном случае относительная спецификация “C.jsp” разрешается в “C.jsp”.
Синтаксис
<jsp:include page=”urlSpec” flush="true|false"/>
и
<jsp:include page=”urlSpec” flush="true|false">
{ <jsp:<code></code> .... /> }*
</jsp:include>
В первом примере синтаксиса выполняется включение на этапе запроса.
Во втором случае значения в субэлементах param используются для увеличения запроса с целью включения.
Верными атрибутами являются:
Таблица JSP.4-4
page | Этот URL является относительным urlSpec, как указано в . Относительные пути интерпретируются относительно текущей JSP-страницы. Принимает атрибут времени запроса value (который обязан вычисляться до String, которая является спецификацией относительного URL). |
flush | Необязательный булев атрибут. Если “true”, буфер немедленно очищается. По умолчанию - “false”. |
JSP.4.5 <jsp:forward>
Элемент <jsp:forward page=”urlSpec” /> позволяет направлять на этапе прогона текущий запрос статическому ресурсу - JSP-странице или Java-классу Servlet в том же контексте, что и текущая страница.
jsp:forward эффективно прерывает выполнение текущей страницы. Относительный
urlSpec - как в . Объект запроса будет настроен в соответствии со значением атрибута page.
Акция jsp:forward может иметь субэлементы jsp:param, которые могут предоставлять значения для некоторых параметров запроса, используемых для перенаправления.
Если вывод страницы буферизуется, то буфер очищается перед перенаправлением.
Если вывод страницы буферизуется и буфер был очищен, то попытка направить запрос вызовет исключение IllegalStateException.
Если вывод страницы не буферизовался и в него что-то было записано, то попытка направить запрос вызовет исключение IllegalStateException.
Примеры
Следующий элемент может использоваться для направления статической странице, на базе некоторого динамического условия.
<% String whereTo = “/templates/”+someValue; %>
<jsp:forward page=’<%= whereTo %>’ />
Синтаксис
<jsp:forward page=”relativeURLspec” />
и
<jsp:forward page=”urlSpec”>
{ <jsp:param .... /> }*
</jsp:forward>
Этот тэг позволяет автору страницы осуществлять воздействие на процессинг текущего запроса специфицированными атрибутами:
Таблица JSP.4-5
page | URL является относительным urlSpec, как указано в . Относительные пути интерпретируются относительно текущей JSP-страницы. Принимает атрибут времени запроса value (который обязан вычисляться до String, которая является спецификацией относительного URL). |
JSP.4.6.1 Синтаксис
<jsp:param name="name" value="value" />
Эта акция имеет два мандатных/обязательных атрибута: name и value.
Name это имя параметра, а value, которое может быть выражением времени запроса, это его значение.
JSP.4.6 <jsp:param>
Элемент jsp:param используется для предоставления информации ключ/значение. Этот элемент используется в элементах jsp:include, jsp:forward и jsp:params. Должна вызываться ошибка времени трансляции, если этот элемент используется в другом месте.
При выполнении jsp:include или jsp:forward, включаемая страница или перенаправляемая страница будет просматривать оригинал объекта запроса с оригинальными параметрами, дополненными новыми параметрами с новыми значениями, имеющими приоритет над существующими значениями, где это нужно.
Областью видимости новых параметров является вызов jsp:include или jsp:forward; т.е., в случае с jsp:include - новые параметры (и значения) не будут применяться после включения. Это то же поведение, что и при использовании методов include и forward в ServletRequest (см. Раздел 8.1.1 в спецификации Servlet 2.2).
Например, если запрос имеет параметр A=foo, и параметр A=bar специфицирован для перенаправления, направляемый запрос должен будет сдержать A=bar,foo. Обратите внимание, что новый param имеет приоритет.
JSP.4.7 <jsp:plugin>
Акция plugin даёт автору JSP-страниц возможность генерировать HTML, содержащий соответствующие клиентскому браузеру конструкции (OBJECT или EMBED), которые приводят к загрузке компонента Java Plugin (если это необходимо) и последующему выполнению специфицированного компонента Applet или JavaBeans.
Тэг <jsp:plugin> замещается тэгом <object> или <embed> - как больше подходит для запрашивающего Пользовательского Агента (ПА) - и выводится в поток вывода ответа/response.
Атрибуты тэга <jsp:plugin> предоставляют данные конфигурации для представления элемента, как показано далее в таблице.
Элементы <jsp:param> это параметры компонентов Applet или JavaBeans.
Элемент <jsp:fallback> это содержимое, используемое клиентским браузером, если компонент plugin не может стартовать (из-за того, что OBJECT или EMBED не поддерживаются клиентским браузером, либо по каким-то другим причинам).
Если plugin может стартовать, но компонент Applet или JavaBeans не может быть найден или не может стартовать, то сообщение, специфическое для данного plugin, будет показано пользователю: вероятнее всего - всплывающее окно, содержащее ClassNotFoundException.
Реальный код plugin не должен быть связан с JSP-контейнером. Ссылка на место размещения plugin'а Sun может использоваться вместо этого, хотя некоторые продавцы ПО предпочитают включать plugin для удобства пользователя.
Примеры
<jsp:plugin type=applet code=”Molecule.class” codebase=”/html” >
<jsp:params>
<jsp:param
name=”molecule”
value=”molecules/benzene.mol”/>
</jsp:params>
<jsp:fallback>
<p> unable to start plugin </p>
</jsp:fallback>
</jsp:plugin>
Синтаксис
<jsp:plugintype="bean|applet"
code="objectCode"
codebase="objectCodebase"
{ align="alignment" }
{ archive="archiveList" }
{ height="height" }
{ hspace="hspace" }
{ jreversion="jreversion" }
{ name="componentName" }
{ vspace="vspace" }
{ width="width" }
{ nspluginurl="url" }
{ iepluginurl="url" } >
{ <jsp:params>
{ <jsp:<code></code> name="paramName" value=”paramValue" /> }+
</jsp:params> }
{ <jsp:fallback> arbitrary_text </jsp:fallback> }
</jsp:plugin>
Таблица JSP.4-1
type | Идентифицирует тип компонента: Bean или Applet. |
code | Как определено в HTML. |
codebase | Как определено в HTML. |
align | Как определено в HTML. |
archive | Как определено в HTML. |
height | Как определено в HTML. Принимает значение выражения времени прогона программы. |
hspace | Как определено в HTML. |
jreversion | Идентифицирует номер версии JRE, необходимый компоненту для работы; по умолчанию: "1.2" |
name | Как определено в HTML. |
vspace | Как определено в HTML. |
title | Как определено в HTML. |
width | Как определено в HTML. Принимает значение выражения времени прогона программы. |
nspluginurl | URL, с которого JRE-plugin может быть загружен для использования в Netscape Navigator, по умолчанию - определяется реализацией. |
iepluginurl | URL, с которого JRE-plugin может быть загружен для использования в IE, по умолчанию - определяется реализацией. |
JSP.4.8 <jsp:params>
Акция jsp:params является частью акции jsp:plugin и может появляться только как прямой потомок элемента <jsp:plugin>.
Использование элемента jsp:params в любом ином контексте должно приводит к ошибке времени трансляции.
Семантика и синтаксис jsp:params описаны в .
JSP.4.9 <jsp:fallback>
Акция jsp:fallback является частью акции jsp:plugin и может появляться только как прямой потомок элемента <jsp:plugin>.
Использование элемента jsp:fallback в любом ином контексте должно приводит к ошибке времени трансляции.
Семантика и синтаксис jsp:fallback описаны в Разделе .
JSP.5.1 Использование Синтаксиса XML для Страниц JSP
Синтаксис XML для JSP-страниц может использоваться по-разному, с том числе:
JSP-документы могут передаваться непосредственно JSP-контейнеру; это будет становиться всё более актуальным по мере увеличения количества содержимого, авторизованного с помощью XML;
XML-просмотр JSP-страницы может использоваться для проверки JSP-страницы относительно некоторого описания набора верных страниц;
С JSP-документами можно работать с помощью XML-утилит;
JSP-документ может генерироваться из текстуального представления путём применения трансформации XML, например, XSLT;
JSP-документ может генерироваться автоматически, скажем, при сериализации некоторых объектов.
Проверка JSP-страницы поддерживается в спецификации JSP 1.2 с помощью класса TagLibraryValidator, ассоциированного с библиотекой тэгов. Класс-проверщик работает с объектом PageData, который представляет XML-просмотр JSP-страницы (см., например, Раздел ).
JSP-страница с любым синтаксисом может подключать с помощью директивы JSP-страницу с любым синтаксисом. Нельзя, однако, смешивать стандартный JSP-синтаксис и XML-синтаксис в одном исходном файле.
JSP.5.2.1 Модель Семантики
Модель семантики JSP-документа не изменилась по сравнению с моделью семантики JSP-страницы с синтаксисом JSP: JSP-страницы генерируют ответный поток символов из шаблонных данных и динамических элементов. Шаблонные данные могут быть описаны явно элементом jsp:text или неявно фрагментом XML.
Динамические элементы являются элементами скриптинга, стандартными акциями или специальными акциями. Элементы скриптинга представляются как элементы XML, кроме выражений времени/этапа запроса, которые представляются специальным синтаксисом атрибутов.
Чтобы точнее показать процессинг пробелов, мы следуем структуре спецификации XSLT. Первым шагом обработки JSP-документа является идентификация узлов документа. При этом все текстуальные узлы, содержащие только пробелы, из документа удаляются; единственным исключением являются узлы элемента jsp:text, которые сохраняются дословно. Результирующие узлы интерпретируются так, как описано в последующих разделах. Шаблонные данные либо передаются непосредственно в ответ/response, либо опосредованно через (стандартные или специальные/custom) акции.
В соответствии со спецификацией XML (и спецификацией XSLT), пробельными символами являются #x20, #x9, #xD и #xA.
JSP.5.2.2 Элемент jsp:root
JSP-документ содержит элемент jsp:root в качестве корневого элемента. Элемент root содержит атрибут xmlns, который даёт возможность использовать стандартные элементы, определённые в спецификации JSP 1.2. Кроме того, root это место, где будут вставляться атрибуты пространства имён для директив taglib.
Все библиотеки тэгов, используемые в JSP-документе, представлены в элементе root
с помощью дополнительных атрибутов xmlns.
Элемент root содержит один мандатный атрибут - версию спецификации JSP, используемой данной страницей. Никакие иные атрибуты для этого элемента не определены.
<jsp:root
xmlns:jsp=”http://java.sun.com/JSP/Page”
xmlns:prefix1=”URI-для-taglib1”
xmlns:prefix2=”URI-для-taglib2”... >
version="1.2">
JSP-страница
</jsp:root>
Атрибут xmlns специальной библиотеки тэгов в форме xml:префикс=’uri’
идентифицирует библиотеку тэгов через значение uri. Значение uri
может иметь две формы, “uri” или “urn:jsptld:путь”.
Если значение uri имеет форму “urn:jsptld:путь”, тогда TLD определяется в соответствии с механизмом из Раздела .
Если значение uri является обычным “uri”, тогда путь определяется путём сравнения с указанным отображением в web.xml, расширенным с использованием неявного отображения в упакованные библиотеки тэгов (Разделы и ), как указано в .
JSP.5.2.3 Элемент jsp:directive.page
Элемент jsp:directive.page определяет несколько зависящих от страницы свойств и передаёт их JSP-контейнеру. Этот элемент обязан быть потомком элементаroot и появляться в начале JSP-документа.
Его синтаксис:
<jsp:directive.page список_атрибутов_директивы_page />
где список_атрибутов_директивы_page\page_directive_attr_list - такой, как описано в .
Интерпретация элемента jsp:directive.page описана в , а его областью видимости/scope является JSP-документ и любой фрагмент, включённый директивой include.
JSP.5.2.4 Элемент jsp:directive.include
Элемент jsp:directive.include используется для замещения текста и\или кода на этапе трансляции JSP-страницы. Этот элемент может появляться в любом месте JSP-документа.
Его синтаксис:
<jsp:directive.include file="relativeURLspec\спецификация относительного URL” />
Интерпретация элемента jsp:directive.include описана в 3.
XML-просмотр JSP-страницы не содержит элементов jsp:directive.include, вместо этого включённый файл разворачивается непосредственно в этом месте. Это делается для упрощения проверки.
JSP.5.2.5 Элемент jsp:declaration
Элемент jsp:declaration используется для объявления конструкций языка скриптинга, которые доступны всем другим элементам скриптинга. Элемент jsp:declaration не имеет атрибутов, и его тело/body - это само объявление.
Его синтаксис:
<jsp:declaration> здесь идёт объявление </jsp:declaration>
Интерпретация элемента jsp:declaration описана в .
JSP.5.2.6 Элемент jsp:scriptlet
Элемент jsp:scriptlet используется для описания акций, выполняемых в ответ на некоторый запрос. Скриптлеты являются фрагментами программы. Элемент jsp:scriptlet не имеет атрибутов, и его тело - это фрагмент программы, содержащий скриптлет.
Его синтаксис:
<jsp:scriptlet> здесь - фрагмент кода </jsp:scriptlet>
Интерпретация элемента jsp:scriptlet описана в .
JSP.5.2.7 Элемент jsp:expression
Элемент jsp:expression используется для описания сложных выражений на языке скриптинга, вычисляемых на этапе ответа. Элемент jsp:expression не имеет атрибутов, и его тело - это выражение.
Его синтаксис:
<jsp:expression> здесь - выражение </jsp:expression>
Интерпретация элемента jsp:expression описана в .
JSP.5.2.8 Элементы Стандартных и Специальных Акций
JSP-документ может использовать стандартные акции, описанные в . Поскольку синтаксис этих элементов уже базируется на XML, описания этой главы достаточно, за исключением того, что в шаблоне JSP-документа текст может быть описан элементом jsp:text, либо посредством элемента XML, который не является ни стандартной, ни специальной акцией (см. ).
Для полноты приведём элементы-акции:
jsp:useBean
jsp:setProperty
jsp:getProperty
jsp:include
jsp:forward
jsp:param
jsp:params
jsp:plugin
jsp:text
Семантика и ограничения описаны в , а интерпретация элементов скриптинга - в .
Библиотеки тэгов вводят новые элементы атрибутам xmlns или элементом jsp:root, а их синтаксис и семантика описаны в .
JSP.5.2.9 Атрибуты Времени Запроса
Элемент акции, который может принимать атрибут времени запроса (), принимает аргумент для этого атрибута в форме “%= text %” (пробелы вокруг text
не нужны, и отметьте отсутствие ‘<‘ и ‘>’). Text, после применения кавычек (как и в любом другом документе XML), является выражением, вычисляемым по правилам .
JSP.5.2.10 Элемент jsp:text
Элемент jsp:text можно использовать для включения шаблонных данных в представление XML.
Элемент jsp:text не имеет атрибутов и может появляться в любом месте, где могут появляться шаблонные данные.
Его синтаксис:
<jsp:text> шаблонные данные </jsp:text>
При интерпретации элемента jsp:text, его содержимое передаётся текущему значению out/вывода. Это очень напоминает работу элемента xsl:text из XSLT.
JSP.5.2.11 Другие XML-Элементы
Синтаксис XML для JSP-страниц допускает также появление XML-элементов, которые не представляют ни стандартных, ни специальных акций, в любом месте, где может появляться jsp:text.
Интерпретация такого XML-элемента - это передача его текстуального представления текущему значению out после процессинга пробелов, описанного в .
Как пример, если фрагмент JSP-документа таков:
Таблица 5.1: Пример 1 - Ввод
1 | <hello><jsp:scriptlet>i=3;</jsp:scriptlet> |
2 | <hi> |
3 | <jsp:text> hi you all |
4 | </jsp:text><jsp:expression>i</jsp:expression> |
5 | </hi> |
6 | </hello> |
то результат будет:
Таблица 5.2: Пример 1 - Вывод
1 | <hello> <hi> hi you all |
2 | 3 </hi></hello> |
Обратите внимание на работу с пробелами.
JSP.5.2 Документы JSP
JSP-документ это XML-документ, "знающий" о пространстве имён. Пространства имён используются для идентификации основного синтаксиса и библиотек тэгов, используемых на странице, и все относящиеся к JSP пространства имён вводятся в корне/root документа XML.
Основной синтаксис/core syntax определяется с помощью своего собственного URI. Хотя в этой главе используется префикс jsp, верным является любой префикс, если используется корректный URI, идентифицирующий основной синтаксис.
JSP-документ использует то же расширение файла (.jsp), что и JSP-страница с синтаксисом JSP. Контейнер может различить их, поскольку JSP-документ является XML-документом с верхним элементом jsp:root, а jsp:root не может появляться на JSP-странице с синтаксисом JSP.
Многие элементы XML в JSP-документе соответствуют элементам языка JSP, но можно включать элементы XML, непосредственно описывающие шаблон. Эти элементы могут иметь квалифицированные имена (и, таким образом, находиться в пространстве имён) или являться неквалифицированными.
JSP-страница с синтаксисом XML может использовать следующие элементы:
элемент jsp:root, который используется для ввода пространства имён для специальных тэгов страницы;
элементы-директивы JSP;
элементы скриптинга JSP;
элементы - стандартные акции JSP;
элементы - специальные акции JSP;
элементы jsp:text, соответствующие шаблонным данным;
другие фрагменты XML, также соответствующие шаблонным данным.
JSP.5.3.1 JSP-Документы
XML-просмотр JSP-страницы, написанной с синтаксисом XML, очень похож на оригинал JSP-страницы.
Выполняются только две трансформации:
Все директивы include разворачиваются в JSP-фрагменты.
Если JSP-контейнер поддерживает атрибут jsp:id, этот атрибут добавляется. См. .
JSP.5.3.2 Страницы JSP и Синтаксис JSP
XML-просмотр JSP-страницы, написанной с синтаксисом XML, определяется следующей трансформацией:
все директивы include разворачиваются в JSP-фрагменты;
элемент jsp:root добавляется в качестве корневого, с соответствующим атрибутом xmlns:jsp, и директива taglib конвертируется в атрибуты xmlns: элемента jsp:root;
объявления, скриптлеты и выражения конвертируются в верные элементы XML, как описано в и в последующих разделах;
конвертируются выражения атрибутов времени запроса, как описано в ;
кавычки JSP конвертируются в кавычки XML;
создаются элементы jsp:text для всего шаблонного текста;
если JSP-контейнер поддерживает атрибут jsp:id, этот атрибут добавляется. См. .
Обратите внимание, что XML-просмотр JSP-страницы не имеет информации DOCTYPE; см. .
Краткий обзор трансформации дан в Таблице JSP.5-1:
Таблица JSP.5-1 Трансформации XML-Просмотра
<%-- комментарий --%> | удалён. |
<%@ page ... %> | <jsp:directive.page ... />. По выбору добавляется jsp:id. |
<%@ taglib ... %> | элемент jsp:root снабжается информацией пространства имён. По выбору добавляется jsp:id. |
<%@ include ... %> | развёртывается в этом месте. |
<%! ... %> | <jsp:declaration> .... </jsp:declaration>. По выбору добавляется jsp:id. |
<% ... %> | <jsp:scriptlet> ... </jsp:scriptlet>. По выбору добавляется jsp:id. |
<%= ... %> | <jsp:expression> ... </jsp:expression>. По выбору добавляется jsp:id. |
Стандартная акция | замещается синтаксисом XML уточняются выражения времени запроса; по выбору добавляется jsp:id) |
Специальная акция | как есть (уточняются выражения времени запроса; по выбору добавляется jsp:id) |
Шаблон | замещается элементом jsp:text. По выбору добавляется jsp:id. |
Более детально:
JSP.5.3.3 Комментарии JSP
JSP-комментарии (в форме <%-- комментарий --%>) не передаются в XML-просмотр JSP-страницы.
JSP.5.3.4 Директива page
Директива page в форме:
<%@ page { атрибут=”значение” }* %>
транслируется в элемент в форме:
<jsp:directive.page { атрибут=”значение” }* />
JSP.5.3.5 Директива taglib
Директива taglib в форме:
<%@ taglib uri=”uriValue\значениеURI” prefix=”префикс” %>
транслируется в атрибут xmlns:prefix элемента root JSP-документа со значением. которое зависит от uriValue. Если uriValue является относительным путём, то используемое значение будет “urn:jsptld:uriValue”; иначе uriValue используется напрямую.
JSP.5.3.6 Директива include
Директива include в форме:
<%@ include file=”value” %>
развёртывается в JSP-фрагмент, обозначенный value. Это сделано для того, чтобы дать возможность проверять страницу.
JSP.5.3.7 Объявления
Объявления транслируются в элемент jsp:declaration. Например, второй пример из :
<%! public String f(int i) { if (i<3) return(“...”); ... } %>
транслируется в:
<jsp:declaration> <![CDATA[ public String f(int i) { if (i<3) return(“...”); } ]]> </jsp:declaration>
Альтернативно мы можем использовать < и записать:
<jsp:declaration> public String f(int i) { if (i<3) return(“...”); } </jsp:declaration>
JSP.5.3.8 Скриптлеты
Скриптлеты транслируются в элементы
jsp:scriptlet. В XML-документе, соответствующем JSP-страницам, директивы представлены с использованием следующего синтаксиса:
<jsp:scriptlet> здесь - фрагмент кода </jsp:scriptlet>
JSP.5.3.9 Выражения
В XML-документе, соответствующем JSP-страницам, директивы представлены с использованием элемента jsp:expression:
<jsp:expression> здесь - выражение </jsp:expression>
JSP.5.3.10 Стандартные и Специальные Акции
Синтаксис элементов стандартных и специальных акций базируется на XML. Необходимы трансформации в связи с соглашениями по кавычкам и с синтаксисом выражений атрибутов времени запроса.
JSP.5.3.11 Выражения Атрибутов Времени Запроса
Выражения атрибутов времени запроса/Request-time attribute expressions имеют форму “<%= expression %>”.
Хотя этот синтаксис следует синтаксису, используемому в JSP-странице, он не является допустимым в XML.
Отображение XML для таких выражений - это значение в форме “%= выражение’%”, где соглашение по кавычкам спецификации JSP конвертировано в соглашение по кавычкам XML.
JSP.5.3.12 Шаблонный Текст и Элементы XML
Весь текст, который не интерпретируется JSP-транслятором, конвертируется в тело/body элемента jsp:text. Как следствие, никакие XML-элементы в форме, описанной в , не будут появляться в XML-просмотре JSP-странице, написанной с синтаксисом JSP.
JSP.5.3.13 Атрибут jsp:id
JSP-контейнер может, по выбору, поддерживать атрибут jsp:id. Этот атрибут может присутствовать только в XML-просмотре JSP-страницы и может использоваться для повышения качества сообщений об ошибках времени трансляции. Он вводится по выбору, и соответствующий JSP-контейнер может выбрать, поддерживать его или нет.
В JSP-контейнере, поддерживающем атрибут jsp:id, XML-просмотр любой JSP-страницы будет содержать дополнительный атрибут jsp:id во всех XML-элементах. Этому атрибуту даётся значение, уникальное среди всех элементов XML-просмотра. См. детали в .
JSP.5.3 XML-Просмотр Страницы JSP
В этом разделе описан XML-просмотр/view JSP-страницы: отображение между JSP-страницей, написанной с синтаксисом XML или JSP, и XML-документом, описывающим её.
JSP.5.4 Проверка XML-Просмотра Страницы JSP
XML-просмотр JSP-страницы это документ, связанный с пространством имён, и он не может быть проверен относительно ОТД/DTD (Определение Типа Данных), за исключением лишь наиболее простых случаев.
Чтобы уменьшить конфликты и возможные нежелательные последствия, XML-просмотр JSP-страницы не будет включать DOCTYPE. Однако пока ОТД могут содержать некоторое значение в качестве документации, Приложение содержит описания и DTD, и XSchema JSP-документов.
Есть несколько механизмов с участием пространства имён, которые могут использоваться для проверки XML-просмотра JSP-страниц. Самым популярным механизмом является язык XML Schema консорциума W3C, но подойдут также и другие, включая некоторые простейшие, которые, например, могут использовать только некоторые элементы, или, напротив, которые не используют их. Проверщик TagLibraryValidator для библиотеки тэгов разрешает инкапсуляцию этих сведений в библиотеке тэгов.
TagLibraryValidator работает в XML-просмотре JSP-страницы. Если страница создана с синтаксисом JSP, этот просмотр не предоставляет никаких деталей о шаблонных данных (всё группируется внутри элементов jsp:text), но отдельные детали могут быть описаны при использовании JSP-документов. Аналогично, когда XSLT-трансформация применяется к JSP-документу, XML-фрагменты будут нормально видимы, в то время как содержимое элементов jsp:text - нет.
JSP.5.5.1 Страница JSP и Соответствующий Ей JSP-Документ
Пример отображения между синтаксисом JSP и XML.
JSP-СТРАНИЦА С СИНТАКСИСОМ JSP:
<html>
<title>positiveTagLib</title>
<body>
<%@ taglib uri="http://java.apache.org/tomcat/examples-taglib" prefix="eg" %>
<%@ taglib uri="/tomcat/taglib" prefix="test" %>
<%@ taglib uri="WEB-INF/tlds/my.tld" prefix="temp" %>
<eg:test toBrowser="true" att1="Working">
Positive Test taglib directive </eg:test>
</body>
</html>
XML-ПРОСМОТР JSP-СТРАНИЦЫ:
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:eg="http://java.apache.org/tomcat/examples-taglib"
xmlns:test="urn:jsptld:/tomcat/taglib"
xmlns:temp="urn:jsptld:/WEB-INF/tlds/my.tld"
version="1.2">
<jsp:text><![CDATA[<html>
<title>positiveTagLig</title>
<body>
]]></jsp:text>
<eg:test toBrowser="true" att1="Working>
<jsp:text>Positive test taglib directive</jsp:text>
</eg:test>
<jsp:text><![CDATA[
</body>
</html>
]]></jsp:text>
</jsp:root>
JSP.5.5.2 JSP-Документ
Это пример очень простого JSP-документа, содержащего некоторые шаблонные XML-элементы.
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:mytags="prefix1-URL"
version="1.2">
<mytags:iterator count="4">
<foo> </foo>
</mytags:iterator>
</jsp:root>
JSP.5.5 Примеры
В этом разделе представлены два примера JSP-документов. В первом дана JSP-страница с синтаксисом JSP и её отображение в синтаксис XML. Во втором - JSP-страница с синтаксисом XML, включающая XML-фрагменты.
JSP.6.1.1 Верная Страница JSP
JSP-страница является таковой для Платформы Java, если, и только если, класс реализации JSP-страницы, определённый по (после применения всех директив 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, |
(2) Раздел Неявных/Implicit Объектов | // код, определяющий и инициализирующий request, response, page, pageContext и т.п. |
(3) Главный/Main Раздел | // код, определяющий выражение отображения request/response метода _jspService |
закрытие метода _jspService | } |
закрытие _jspXXX | } |
JSP.6.1 Общая Структура
Некоторые детали того, что делает JSP-страницу таковой, весьма специфичны для языка скриптинга, используемого на странице. Это особенно усложнено из-за того, что скриптлеты являются фрагментами, а не законченными операторами языка.
JSP.6.2 Раздел Объявлений
Раздел объявлений соответствует элементам объявлений. Содержимое этого раздела определяется путём конкатенации всех объявлений на странице в порядке их появления.
JSP.6.3 Раздел Инициализации
Этот раздел определяет и инициализирует неявные объекты, доступные 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/область видимости не влияет на видимость переменных внутри генерируемой программы. Оно влияет на то, где и как долго будут существовать дополнительные ссылки на объект, обозначенный этой переменной.
JSP.6.4 Раздел Main/Главный
Этот раздел осуществляет главное отображение/mapping между объектами request и response.
Содержимое кодового сегмента 2 определяется скриптлетами, выражениями и текстовым телом JSP-страницы.
Элементы обрабатываются последовательно в порядке их появления на странице. Трансляция каждого из них определяется так, как показано ниже, и вставляется в данный раздел.
Трансляция зависит от типа элемента:
JSP.7.1.1 Цели
Механизм расширения/развёртывания тэгов преследует следующие цели:
Переносимость - Акция , описанная в библиотеке тэгов, должна использоваться в любом JSP-контейнере.
Простота - Неискушённый пользователь должен понимать и использовать этот механизм. Производители JSP-функциональности должны учитывать удобство использования потребителем акций.
Выразительность - Этот механизм должен поддерживать широкий диапазон акций, включая вложенные акции, элементы скриптинга внутри тела акции и создание, использование и обновление переменных скриптинга.
Возможность использования в различных языках скриптинга - Хотя спецификация JSP в настоящее время определяет семантику скриптов только для языка программирования Java, мы хотим оставить возможность использования других языков скриптинга.
Создание на основе существующих концепций и "железа" - Мы не хотим изобретать велосипед. Также мы хотели бы исключить в будущем конфликты, которые можно предвидеть уже сейчас.
JSP.7.1.2.1 Обработчики Тэгов
Семантика специфики специальной акции в библиотеке тэгов описывается через класс обработчика тэга, который обычно инстанциируется на этапе прогона классом реализации JSP-страницы.
Если библиотека тэгов известна JSP-контейнеру (), это контейнер может использовать альтернативные реализации, пока семантика сохраняется.
Обработчик тэга это класс Java, реализующий интерфейс Tag, IterationTag или BodyTag и являющийся представлением специальной акции на этапе прогона.
Класс реализации JSP-страницы инстанциирует класс обработчика тэга или использует существующий объект обработчика тэга для каждой акции на JSP-странице. Объект обработчика это Java-объект, реализующий интерфейс javax.servlet.jsp.tagext.Tag. Объект обработчика отвечает за взаимодействие JSP-страницы и дополнительных серверных объектов/server-side objects.
Существуют три главных интерфейса: Tag, IterationTag и BodyTa.
Интерфейс Tag определяет базовые методы, необходимые всем обработчикам тэгов. Это методы setter для инициализации обработчика тэга, в контексте данных и значений атрибутов акции, и методы doStartTag() и doEndTag().
Интерфейс IterationTag является расширением Tag'а, предоставляя дополнительный метод doAfterBody(), вызываемый для повторного обсчёта тела тэга.
Интерфейс BodyTag является расширением IterationTag'а с двумя новыми методами для обработчика тэга для манипулирования телом тэга: setBodyContent() передаёт буфер, объект BodyContent, а doInitBody() даёт возможность обработки буфера до первого обсчёта тела в буфере.
Использование интерфейсов упрощает создание обработчика тэга из существующего Java-объекта.
Имеются также два класса поддержки, которые могут использоваться в качестве базовых классов: TagSupport и BodyTagSupport.
В JSP 1.2 имеется новый интерфейс, помогающий поддерживать целостность данных и обслуживать ресурсы при возникновении исключительных ситуаций.
Интерфейс TryCatchFinally может добавляться в класс, реализующий любой интерфейс: Tag, IterationTag или BodyTag.