Спецификация Java Server Pages 1.2

         

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
23 </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-Просмотра

Элемент 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. Например, второй пример из :

<%! 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-элементы в форме, описанной в , не будут появляться в 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,
<ServletResponseSubtype> response)
 throws ServletException, IOException {

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