Глава JSP.5

JSP-Документы


В этой главе определён синтаксис XML для JSP-страниц и интерпретация страниц, написанных с этим синтаксисом. Мы используем термин JSP-документ для обозначения JSP-страницы с синтаксисом XML.

Эта глава также определяет отображение/mapping между JSP-страницей и XML-описанием этой страницы, её XML view\XML-просмотр. XML-просмотр определён для JSP-страниц, написанных на JSP с синтаксисом XML.

JSP.5.1 Использование Синтаксиса XML для Страниц JSP

Синтаксис XML для JSP-страниц может использоваться по-разному, с том числе:

Проверка JSP-страницы поддерживается в спецификации JSP 1.2 с помощью класса TagLibraryValidator, ассоциированного с библиотекой тэгов. Класс-проверщик работает с объектом PageData, который представляет XML-просмотр JSP-страницы (см., например, Раздел JSP.7.5.1.2).


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

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.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 определяется в соответствии с механизмом из Раздела JSP.7.3.2.

Если значение uri является обычным "uri", тогда путь определяется путём сравнения с указанным отображением в web.xml, расширенным с использованием  неявного отображения в упакованные библиотеки тэгов (Разделы JSP.7.3.3 и JSP.7.3.4), как указано в Разделе JSP.7.3.6.

JSP.5.2.3 Элемент jsp:directive.page

Элемент jsp:directive.page определяет несколько зависящих от страницы свойств и передаёт их JSP-контейнеру. Этот элемент обязан быть потомком элементаroot и появляться в начале JSP-документа.

Его синтаксис:
 

<jsp:directive.page список_атрибутов_директивы_page />
 

где список_атрибутов_директивы_page\page_directive_attr_list - такой, как описано в Разделе JSP.2.10.1.

Интерпретация элемента jsp:directive.page описана в Разделе JSP.2.10.1, а его областью видимости/scope является JSP-документ и любой фрагмент, включённый директивой include.

JSP.5.2.4 Элемент jsp:directive.include

Элемент jsp:directive.include используется для замещения текста и\или кода на этапе трансляции JSP-страницы. Этот элемент может появляться в любом месте JSP-документа.

Его синтаксис:
 

<jsp:directive.include file="relativeURLspec\спецификация относительного URL" />

 

Интерпретация элемента jsp:directive.include описана в Разделе JSP.2.10.3.

XML-просмотр JSP-страницы не содержит элементов jsp:directive.include, вместо этого включённый файл разворачивается непосредственно в этом месте. Это делается для упрощения проверки.

JSP.5.2.5 Элемент jsp:declaration

Элемент jsp:declaration используется для объявления конструкций языка скриптинга, которые доступны всем другим элементам скриптинга. Элемент jsp:declaration не имеет атрибутов, и его тело/body - это само объявление.

Его синтаксис:
 

<jsp:declaration> здесь идёт объявление </jsp:declaration>


Интерпретация элемента jsp:declaration описана в Разделе JSP.2.11.1.

JSP.5.2.6 Элемент jsp:scriptlet

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

Его синтаксис:


<jsp:scriptlet> здесь - фрагмент кода </jsp:scriptlet>


Интерпретация элемента jsp:scriptlet описана в Разделе JSP.2.11.2.

JSP.5.2.7 Элемент jsp:expression

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

Его синтаксис:


<jsp:expression> здесь - выражение </jsp:expression>


Интерпретация элемента jsp:expression описана в Разделе JSP.2.11.3.

JSP.5.2.8 Элементы Стандартных и Специальных Акций

JSP-документ может использовать стандартные акции, описанные в Главе JSP.4. Поскольку синтаксис этих элементов уже базируется на XML, описания этой главы достаточно, за исключением того, что в шаблоне JSP-документа текст может быть описан элементом jsp:text, либо посредством элемента XML, который не является ни стандартной, ни специальной акцией (см. Раздел JSP.5.2.11).

Для полноты приведём элементы-акции:

Семантика и ограничения описаны в Главе JSP.4, а интерпретация элементов скриптинга - в Главе JSP.6.
Библиотеки тэгов вводят новые элементы атрибутам xmlns или элементом jsp:root, а их синтаксис и семантика описаны в Главе JSP.7.

JSP.5.2.9 Атрибуты Времени Запроса

Элемент акции, который может принимать атрибут времени запроса (Раздел JSP.2.13.1), принимает аргумент для этого атрибута в форме "%= text %" (пробелы вокруг text не нужны, и отметьте отсутствие  '<' и '>'). Text, после применения кавычек (как и в любом другом документе XML), является выражением, вычисляемым по правилам Раздела JSP.2.13.1.

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.2.1.


Как пример, если фрагмент JSP-документа таков:

Таблица 5.1: Пример 1 - Ввод
N Строки Исходный Текст
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 - Вывод
N Строки Итоговый Текст
1 <hello> <hi> hi you all
2 3 </hi></hello>

Обратите внимание на работу с пробелами.

JSP.5.3 XML-Просмотр Страницы JSP

В этом разделе описан XML-просмотр/view JSP-страницы: отображение между JSP-страницей, написанной с синтаксисом XML или JSP, и XML-документом, описывающим её.

JSP.5.3.1 JSP-Документы

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

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

XML-просмотр JSP-страницы, написанной с синтаксисом XML, определяется следующей трансформацией:

Обратите внимание, что XML-просмотр JSP-страницы не имеет информации DOCTYPE; см. Раздел JSP.5.4.


Краткий обзор трансформации дан в Таблице JSP.5-1:

Таблица JSP.5-1 Трансформации XML-Просмотра
Элемент JSP-страницы 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 . Например, второй пример из Раздела JSP.2.11.1:


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


транслируется в:


<jsp:declaration> <![CDATA[ public String f(int i) { if (i<3) return("..."); } ]]> </jsp:declaration>


Альтернативно мы можем использовать &lt; и записать:


<jsp:declaration> public String f(int i) { if (i&lt;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-элементы в форме, описанной в Разделе JSP.5.2.11, не будут появляться в XML-просмотре JSP-странице, написанной с синтаксисом JSP.

JSP.5.3.13 Атрибут jsp:id

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


В JSP-контейнере, поддерживающем атрибут jsp:id, XML-просмотр любой JSP-страницы будет содержать дополнительный атрибут jsp:id во всех XML-элементах. Этому атрибуту даётся значение, уникальное среди всех элементов XML-просмотра. См. детали в Главе 10.

JSP.5.4 Проверка XML-Просмотра Страницы JSP

XML-просмотр JSP-страницы это документ, связанный с пространством имён, и он не может быть проверен относительно ОТД/DTD (Определение Типа Данных), за исключением лишь наиболее простых случаев.
Чтобы уменьшить конфликты и возможные нежелательные последствия, XML-просмотр JSP-страницы не будет включать DOCTYPE. Однако пока ОТД могут содержать некоторое значение в качестве документации, Приложение JSP.C содержит описания и DTD, и XSchema JSP-документов.

Есть несколько механизмов с участием пространства имён, которые могут использоваться для проверки XML-просмотра JSP-страниц. Самым популярным механизмом является язык XML Schema консорциума W3C, но подойдут также и другие, включая некоторые простейшие, которые, например, могут использовать только некоторые элементы, или, напротив, которые не используют их. Проверщик TagLibraryValidator для библиотеки тэгов разрешает инкапсуляцию этих сведений в библиотеке тэгов.

TagLibraryValidator
работает в XML-просмотре JSP-страницы. Если страница создана с синтаксисом JSP, этот просмотр не предоставляет никаких деталей о шаблонных данных (всё группируется внутри элементов jsp:text), но отдельные детали могут быть описаны при использовании JSP-документов. Аналогично, когда XSLT-трансформация применяется к JSP-документу, XML-фрагменты будут нормально видимы, в то время как содержимое элементов jsp:text - нет.

JSP.5.5 Примеры

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

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>