В этой главе определён синтаксис XML для JSP-страниц и интерпретация страниц, написанных с этим синтаксисом. Мы используем термин JSP-документ для обозначения JSP-страницы с синтаксисом XML.
Эта глава также определяет отображение/mapping между JSP-страницей и XML-описанием этой страницы, её XML view\XML-просмотр. XML-просмотр определён для JSP-страниц, написанных на JSP с синтаксисом XML.
Синтаксис XML для JSP-страниц может использоваться по-разному, с том числе:
Проверка JSP-страницы поддерживается в спецификации JSP 1.2 с помощью класса
TagLibraryValidator
, ассоциированного с библиотекой тэгов. Класс-проверщик
работает с объектом PageData
, который представляет XML-просмотр JSP-страницы (см.,
например, Раздел JSP.7.5.1.2).
JSP-страница с любым синтаксисом может подключать с помощью директивы JSP-страницу
с любым синтаксисом. Нельзя, однако, смешивать стандартный JSP-синтаксис и XML-синтаксис в одном исходном файле.
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:text
, соответствующие шаблонным данным;Модель семантики JSP-документа не изменилась по сравнению с моделью семантики JSP-страницы
с синтаксисом JSP: JSP-страницы генерируют ответный поток символов из шаблонных
данных и динамических элементов. Шаблонные данные могут быть описаны явно
элементом jsp:text
или неявно фрагментом XML.
Динамические элементы являются элементами
скриптинга, стандартными акциями или специальными акциями. Элементы скриптинга
представляются как элементы XML, кроме выражений времени/этапа запроса,
которые представляются специальным синтаксисом атрибутов.
Чтобы точнее показать процессинг пробелов, мы следуем структуре спецификации
XSLT. Первым шагом обработки JSP-документа является идентификация узлов
документа. При этом все текстуальные узлы, содержащие только пробелы, из
документа удаляются; единственным исключением являются узлы элемента jsp:text
,
которые сохраняются дословно. Результирующие узлы интерпретируются так, как
описано в последующих разделах. Шаблонные данные либо передаются непосредственно
в ответ/response, либо опосредованно через (стандартные или специальные/custom) акции.
В соответствии со спецификацией XML (и спецификацией XSLT), пробельными символами являются #x20, #x9, #xD и #xA.
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: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: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:declaration
Элемент jsp:declaration
используется для объявления конструкций языка скриптинга,
которые доступны всем другим элементам скриптинга. Элемент
jsp:declaration
не имеет атрибутов, и его тело/body - это само объявление.
Его синтаксис:
<jsp:declaration> здесь идёт объявление </jsp:declaration>
Интерпретация элемента
jsp:declaration
описана в Разделе JSP.2.11.1.
jsp:scriptlet
Элемент jsp:scriptlet
используется для описания акций, выполняемых в ответ на некоторый
запрос. Скриптлеты являются фрагментами программы. Элемент
jsp:scriptlet
не имеет атрибутов, и его тело - это фрагмент программы, содержащий скриптлет.
Его синтаксис:
<jsp:scriptlet> здесь - фрагмент кода </jsp:scriptlet>
Интерпретация элемента jsp:scriptlet
описана в Разделе
JSP.2.11.2.
jsp:expression
Элемент jsp:expression
используется для описания сложных выражений на языке скриптинга,
вычисляемых на этапе ответа. Элемент jsp:expression
не имеет атрибутов, и его тело - это выражение.
Его синтаксис:
<jsp:expression>
здесь - выражение </jsp:expression>
Интерпретация элемента
jsp:expression
описана в Разделе JSP.2.11.3.
JSP-документ может использовать стандартные акции, описанные в
Главе JSP.4.
Поскольку синтаксис этих элементов уже базируется на XML, описания этой главы
достаточно, за исключением того, что в шаблоне JSP-документа текст может быть
описан элементом jsp:text
, либо посредством элемента XML, который не является ни
стандартной, ни специальной акцией (см. Раздел
JSP.5.2.11).
Для полноты приведём элементы-акции:
jsp:useBean
jsp:setProperty
jsp:getProperty
jsp:include
jsp:forward
jsp:param
jsp:params
jsp:plugin
jsp:text
Семантика и ограничения описаны в Главе JSP.4, а интерпретация элементов
скриптинга - в Главе JSP.6.
Библиотеки тэгов вводят новые элементы атрибутам
xmlns
или элементом
jsp:root
, а их синтаксис и семантика описаны в Главе JSP.7.
Элемент акции, который может принимать атрибут времени запроса (Раздел JSP.2.13.1), принимает аргумент для этого атрибута в форме "%= text %" (пробелы вокруг text не нужны, и отметьте отсутствие '<' и '>'). Text, после применения кавычек (как и в любом другом документе XML), является выражением, вычисляемым по правилам Раздела JSP.2.13.1.
jsp:text
Элемент jsp:text
можно использовать для включения шаблонных данных в представление XML.
Элемент jsp:text
не имеет атрибутов и может появляться в любом месте, где могут появляться шаблонные данные.
Его синтаксис:
<jsp:text
> шаблонные данные </jsp:text
>
При интерпретации элемента jsp:text
, его содержимое передаётся текущему значению out/вывода.
Это очень напоминает работу элемента xsl:text
из XSLT.
Синтаксис XML для JSP-страниц допускает также появление XML-элементов, которые
не представляют ни стандартных, ни специальных акций, в любом месте, где может появляться
jsp:text
.
Интерпретация такого XML-элемента - это передача его текстуального представления
текущему значению out после процессинга пробелов, описанного в Разделе JSP.5.2.1.
Как пример, если фрагмент JSP-документа таков:
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>
|
то результат будет:
N Строки | Итоговый Текст |
---|---|
1 |
<hello> <hi> hi you all
|
2 |
3 </hi></hello>
|
Обратите внимание на работу с пробелами.
В этом разделе описан XML-просмотр/view JSP-страницы: отображение между JSP-страницей, написанной с синтаксисом XML или JSP, и XML-документом, описывающим её.
XML-просмотр JSP-страницы, написанной с синтаксисом XML, очень похож на оригинал JSP-страницы.
Выполняются только две трансформации:
include
разворачиваются в JSP-фрагменты.jsp:id
, этот атрибут добавляется. См. Раздел JSP.5.3.13.XML-просмотр JSP-страницы, написанной с синтаксисом XML, определяется следующей трансформацией:
include
разворачиваются в JSP-фрагменты;jsp:root
добавляется в качестве корневого, с соответствующим атрибутом
xmlns:jsp
, и директива taglib
конвертируется в атрибуты xmlns:
элемента jsp:root
;jsp:text
для всего шаблонного текста;jsp:id
, этот атрибут добавляется. См.
Раздел JSP.5.3.13.Обратите внимание, что XML-просмотр JSP-страницы не имеет информации DOCTYPE; см. Раздел JSP.5.4.
Краткий обзор трансформации дан в Таблице JSP.5-1:
Элемент 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-комментарии (в форме
<%-- комментарий --%
>) не передаются в
XML-просмотр JSP-страницы.
page
Директива page
в форме:
<%@ page {
атрибут="значение" }* %>
транслируется в элемент в форме:
<jsp:directive.page { атрибут="значение" }* />
taglib
Директива taglib
в форме:
<%@ taglib uri="uriValue\значениеURI"
prefix="префикс" %>
транслируется в атрибут
xmlns:prefix
элемента root
JSP-документа со значением. которое зависит от uriValue.
Если uriValue является относительным путём, то используемое значение будет
"urn:jsptld:uriValue"; иначе uriValue используется напрямую.
include
Директива include
в форме:
<%@ include file="value" %>
развёртывается в JSP-фрагмент, обозначенный value. Это сделано для того,
чтобы дать возможность проверять страницу.
Объявления транслируются в элемент
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>
Альтернативно мы можем использовать < и записать:
<jsp:declaration> public String f(int i) { if (i<3) return("..."); }
</jsp:declaration>
Скриптлеты транслируются в элементы
jsp:scriptlet
. В XML-документе, соответствующем JSP-страницам, директивы
представлены с использованием следующего синтаксиса:
<jsp:scriptlet> здесь - фрагмент кода </jsp:scriptlet>
В XML-документе, соответствующем JSP-страницам, директивы представлены с
использованием элемента jsp:expression
:
<jsp:expression> здесь - выражение </jsp:expression>
Синтаксис элементов стандартных и специальных акций базируется на XML. Необходимы трансформации в связи с соглашениями по кавычкам и с синтаксисом выражений атрибутов времени запроса.
Выражения атрибутов времени запроса/Request-time attribute expressions имеют форму
"<%= expression %>"
.
Хотя этот синтаксис следует синтаксису, используемому в JSP-странице, он не
является допустимым в XML.
Отображение XML для таких выражений - это значение в форме
"%= выражение'%"
, где соглашение по кавычкам спецификации JSP конвертировано в соглашение по кавычкам XML.
Весь текст, который не интерпретируется JSP-транслятором, конвертируется в тело/body элемента
jsp:text
. Как следствие, никакие XML-элементы в форме, описанной в
Разделе JSP.5.2.11,
не будут появляться в XML-просмотре JSP-странице, написанной с синтаксисом JSP.
jsp:id
JSP-контейнер может, по выбору, поддерживать атрибут
jsp:id
. Этот атрибут может присутствовать только в XML-просмотре JSP-страницы и
может использоваться для повышения качества сообщений об ошибках времени трансляции.
Он вводится по выбору, и соответствующий JSP-контейнер может выбрать,
поддерживать его или нет.
В JSP-контейнере, поддерживающем атрибут
jsp:id
, XML-просмотр любой JSP-страницы будет содержать дополнительный атрибут
jsp:id
во всех XML-элементах. Этому атрибуту даётся значение, уникальное среди
всех элементов XML-просмотра. См. детали в Главе 10.
XML-просмотр JSP-страницы это документ, связанный с пространством имён, и он не
может быть проверен относительно ОТД/DTD (Определение Типа Данных), за
исключением лишь наиболее простых случаев.
Чтобы уменьшить конфликты и возможные нежелательные последствия, XML-просмотр JSP-страницы
не будет включать DOCTYPE. Однако пока ОТД могут содержать некоторое значение в
качестве документации,
Приложение JSP.C содержит описания и DTD, и XSchema JSP-документов.
Есть несколько механизмов с участием пространства имён, которые могут
использоваться для проверки XML-просмотра JSP-страниц. Самым популярным
механизмом является язык XML Schema консорциума W3C, но подойдут также и другие,
включая некоторые простейшие, которые, например, могут использовать только
некоторые элементы,
или, напротив, которые не используют их. Проверщик TagLibraryValidator
для
библиотеки тэгов разрешает инкапсуляцию этих сведений в библиотеке тэгов.
работает в XML-просмотре JSP-страницы. Если страница создана
с синтаксисом JSP, этот просмотр не предоставляет никаких деталей о шаблонных
данных
(всё группируется внутри элементов
TagLibraryValidatorjsp:text
), но отдельные детали могут быть
описаны при использовании JSP-документов. Аналогично, когда XSLT-трансформация
применяется к JSP-документу,
XML-фрагменты будут нормально видимы, в то время как содержимое элементов
jsp:text
- нет.
В этом разделе представлены два примера JSP-документов. В первом дана JSP-страница
с синтаксисом JSP и её отображение в синтаксис XML. Во втором - JSP-страница с
синтаксисом XML, включающая XML-фрагменты.
Пример отображения между синтаксисом JSP и XML.
<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>
<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-документа, содержащего некоторые шаблонные 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>