Спецификация Java Server Pages 1.2
A.1 Простейшая JSP-Страница
Мы начинаем с простейшей JSP-страницы HelloWorld.jsp.<%@ page info="Пример предварительно скомпилированной JSP" %>
Hello World
A.2 JSP-Страница, Упакованная как Источник/source в WAR-Файл
.Web.xml тривиален:
SYSTEM "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
A.3 Сервлет/Servlet для Откомпилированной JSP-Страницы
В качестве альтернативы мы покажем, как можно откомпилировать JSP-страницу в Servlet-класс для запуска на прогон в JSP-контейнере.JSP-страница компилируется в Сервлет с некоторым зависящим от реализации именем _jsp_HelloWorld_XXX_Impl. Servlet-код, зависящий только от API JSP 1.2 и Servlet 2.3, таков:
imports javax.servlet.*;
imports javax.servlet.http.*;
imports javax.servlet.jsp.*;
class _jsp_HelloWorld_XXX_Impl
extends_PlatformDependent_Jsp_Super_Impl {
public void _jspInit() {
// ...
}
public void jspDestroy() {
// ...
}
static JspFactory_factory= JspFactory.getDefaultFactory();
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws IOException;
{
Object page= this;
HttpSessionsession= request.getSession();
ServletConfigconfig= getServletConfig();
ServletContextapplication = config.getServletContext();
PageContextpageContext
= _factory.getPageContext(this,
request,
response,
(String)NULL,
true,
JspWriter.DEFAULT_BUFFER,
true
);
JspWriterout= pageContext.getOut();
// контекст страницы создаёт начальный JspWriter "out"
try {
out.println("");
out.println("Hello World");
out.println("
");
} catch (Exception e) {
pageContext.handlePageException(e);
} finally {
_factory.releasePageContext(pageContext);
}
}
}
A.4 Дескриптор Web-Приложения
Servlet начинает выглядеть как JSP-страница в следующем web.xml:SYSTEM "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
API Развёртывания Тэгов
В этой главе описываются обработчики тэгов и другие классы развёртывания тэгов, а также методы доступа к файлам Tag Library Descriptor/Дескриптора Библиотеки Тэгов. Это дополняет предыдущую главу описанием формата файлов Tag Library Descriptor и их использование в директивах taglib.Эта глава включает содержимое, сгенерированное автоматически из javadoc, внедрённых в реальные Java-классы и интерфейсы. Это позволяет создавать единый авторизованный документ-спецификацию.
Специальные акции могут использоваться авторами и утилитами авторизации JSP для упрощения процесса написания JSP-страниц. Специальные акции могут быть пустыми или непустыми акциями.
Пустой тэг не имеет тела. Есть два эквивалентных синтаксиса, один - с отдельными начальным и конечным тэгами, другой - в котором начальный и конечный тэги скомбинированы в один тэг.
Следующие два пример идентичны:
Непустой тэг имеет начальный тэг, тело и конечный тэг.
Пример-прототип имеет форму:
BODY
Спецификация JavaServer Pages(тм) (JSP) 1.2 предоставляет переносимый механизм для описания библиотек тэгов, включающий:
Tag Library Descriptor (TLD)/Дескриптор Библиотеки Тэгов (ДБТ)
Несколько классов обработчика тэга, определяющих поведение времени запроса
Несколько классов, определяющих поведение времени трансляции
Дополнительные ресурсы, используемые этими классами
Данная глава разбита на три раздела:
Первый раздел представляет базовые классы обработчика тэга.
Во втором разделе описаны более сложные обработчики тэга, которым необходим доступ к обсчёту их тела.
Последний раздел посвящён вопросам этапа/времени трансляции.
B.1 ОТД для Документов JSP
Далее идут ОТД для JSP-документов. Поскольку JSP-документ "знает" о пространстве имён, это ОТД включено здесь просто для информационных целей.|jsp:forward|jsp:plugin”>
xmlns:jsp CDATA “http://java.sun.com/JSP/Page”
version CDATA #REQUIRED
>
language CDATA “java”
extends %ClassName; #IMPLIED
contentType %Content; “text/html; ISO-8859-1”
import CDATA #IMPLIED
session %Bool; “true”
buffer CDATA “8kb”
autoFlush %Bool; “true”
isThreadSafe %Bool; “true”
info CDATA #IMPLIED
errorPage %URL; #IMPLIED
isErrorPage %Bool; “false”
>
file %URI; #REQUIRED
>
id ID #REQUIRED
class %ClassName; #IMPLIED
type %TypeName; #IMPLIED
beanName %BeanName; #IMPLIED
scope (page
|session
|request
|application) “page”
>
name %BeanID; #REQUIRED
property CDATA #REQUIRED
value CDATA #IMPLIED
param CDATA #IMPLIED
>
name %BeanID; #REQUIRED
property CDATA #REQUIRED
>
flush %Bool; “false”
page %URL; #REQUIRED
>
page %URL; #REQUIRED
>
type (bean|applet) #REQUIRED
code %URI; #IMPLIED
codebase %URI; #IMPLIED
align %ImgAlign; #IMPLIED
archive %UriList; #IMPLIED
height %Length; #IMPLIED
hspace %Pixels; #IMPLIED
jreversion CDATA “1.2”
name NMTOKEN #IMPLIED
vspace %Pixels; #IMPLIED
width %Length; #IMPLIED
nspluginurl %URI; #IMPLIED
iepluginurl %URI; #IMPLIED
>
name CDATA #REQUIRED
value CDATA #REQUIRED
>
B.2 XSchema-Описание для Документов JSP
Далее идёт описание, использующее XML Schema:"&AsciiName;/&AsciiName;(;&WS;(charset=)?&AsciiName;)?">
]>
xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
xmlns:jsp = "http://java.sun.com/JSP/Page"
targetNamespace = "http://java.sun.com/JSP/Page"
elementFormDefault = "qualified"
attributeFormDefault = "unqualified">
XML Schema для JSP 1.2.
Эта схема базируется на последних (от 5 мая 2001) Рекомендациях W3C по XML Schema.
JSP-транслятор должен отбрасывать файл XML-формата, который не соответствует строго этой схеме или не соблюдает описанных здесь ограничений. Транслятор не обязан использовать эту схему для проверки либо использовать проверяющий разборщик.
Body определяет элементы "верхнего уровня/top-level" в root и beanInfo.
Возможно есть другие элементы, которые должны его использовать.
Значение выражения времени запроса
Bool мог бы быть булевым, если бы принимал 1 и 0.
Identifier это неквалифицированный Java-идентификатор.
TypeName это один или более Java-идентификаторов, разделённых точками без пробелов.
ImportList это один или более typeNames, разделённых запятыми.
Допускаются пробелы до и после запятой.
SetProp это Identifier или *.
RelativeURL это uriReference без символов двоеточия до первой /, ? или #, если имеются (RFC2396).
Length это nn или nn%.
Размер Буфера с точным значением.
Размер Буфера/Buffer Size со значением "none".
Размер Буфера имеет значение xkb или none.
Contetn Type/Тип Содержимого для данной страницы.
Кодировка Страницы/ Page Encoding для данной страницы. По умолчанию - та же, что и в ContentType.
верные значения scope
верные значения типа plugin'а
Размер буфера - xkb.
Корневой элемент всех JSP-документов называется root.
Авторы могут, если хотят, включать информацию о месте размещения схемы.
Если специфицирована, информация может появляться как атрибут элемента root так:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/JSP/Page xsd-file-location"
Документы не должны специфицировать системный идентификатор DTD/ОТД
- Определении Типа Данных - в объявлении DOCTYPE.
directive.page это "директива page".
default = "text/html; ISO-8859-1" type = "ContentType"/>
use = "optional" type = "PageEncoding"/>
directive.include это "директива include".
Этот элемент не появляется в XML-просмотре JSP-страниц.
Представление скриптлета.
Представление объявления.
Представление выражения.
Точно переданный шаблонный текст.
useBean инстанциирует или имеет доступ к bean в специфицированной области видимости.
Ограничение: Допустимыми комбинациями атрибутов являются:
class [type] | type [( class | beanName)]
setProperty изменяет значение свойства объекта.
Ограничение: Именованный объект обязан быть
"представлен" JSP-процессору через использование либо
акции jsp:useBean, либо специальной акции с ассоциированным
входом VariableInfo для этого имени.
Точные верные комбинации не выражаются в XML Schema.
Это:
name="Identifier" property="*"
name="Identifier" property="Identfiier" param="string"
name="Identifier" property="Identifier" value="string"
getProperty получает значение свойства объекта.
Ограничение: Именованный объект обязан быть
"представлен" JSP-процессору через использование либо
акции jsp:useBean, либо специальной акции с ассоциированным
входом VariableInfo для этого имени.
minOccurs = "0" maxOccurs = "1" type = "Body"/>
C.1 ОТД для Файлов TagLibrary-Дескриптора
Это ОТД, описывающее файл Tag Library Descriptor/Дескриптора Библиотеки Тэгов в формате JSP 1.2.id ID #IMPLIED
xmlns CDATA #FIXED “http://java.sun.com/JSP/TagLibraryDescriptor”>
D.1 ОТД для Файлов TagLibrary-Дескриптора
Следующее ОТД описывает файл Tag Library Descriptor в формате JSP 1.1.xmlns CDATA #FIXED
“http://java.sun.com/dtd/web-jsptaglibrary_1_1.dtd”
>
E.1.5 Разъяснение JSP-Документов
Несколько разъяснений к Главе 5.E.1.8 Другие Небольшие Разъяснения
E.2.2 Изменён Способ Кодировки Информации о Версии в TLD
Этот механизм, используемый для предоставления в TLD информации о версии, был изменён.В PFD версия кодировалась в пространстве имён. В PFD2 не предполагается изменять пространство имён, если только это не изменения несовместимости, и версия кодируется в элементе
Новый URI для пространства имён: "".
Были изменены Глава JSP.7 и Приложение JSP.C.
E.2.6 Коррекция Синтаксиса, Относящегося к XML
E.2.7 Другие Изменения
Мы разъяснили также несколько других несоответствий и ошибок.E.4.2 Дополнения
E.4.3 Разъяснения
E.4.4 Изменения
(для соответствия существующему TagData).
и
E.5.1 Организационные Изменения
E.5.2 Новый Документ
Мы создали новый ненормативный документ “Using JSP Technology/Использование Технологии JSP”. Этот документ ещё обновляется до JSP 1.2 и Servlet 2.3. Мы переместили в этот документ следующее:E.5.3 Дополнения к API
E.6.1 Дополнения
JSP.1.1.1 Общие Понятия
Технология JavaServer Pages придаёт смысл текстуальной спецификации создания динамическогоresponse\ответа на request\запрос. Эта технология основывается на следующих понятиях:
Template Data\Шаблонные Данные
Некоторая часть динамического содержимого является фиксированным, или
шаблонным, содержимым. Фрагменты текста или XML являются типичными шаблонными данными. JSP-технология поддерживает естественное манипулирование шаблонными данными.
JSP-технология предоставляет простой, но мощный способ добавлять динамические данные к шаблонным данным.
JSP-технология предоставляет два соотнесённых механизма для инкапсуляции функциональности: архитектура компонентов JavaBeans и библиотеки тэгов.
Хорошая поддержка утилитами ведёт к значительному повышению производительности. Соответственно, JSP-технология имеет средства для создания качественных утилит авторизации. Тщательная проработка этих концепций привела к созданию гибкой и мощной серверной технологии.
JSP.1.1.2 Преимущества Технологии JavaServer Pages
ТехнологияJavaServer Pages даёт следующие преимущества:
JSP-технология является платформонезависимой на динамических web-страницах, web-серверах и в лежащих в её основе серверных компонентах. JSP-страницы могут создаваться на любой платформе, работать на любом web-сервере или сервере приложений, работающим с web, и читаться в любом web-браузере. Серверные компоненты могут быть созданы на любой платформе и работать на любом сервере.
Независимость от платформы позволяет пользователям JSP выбирать best-of-breed\самые-породистые утилиты. Кроме того, технология JavaServer Pages была разработана для создания условий для разработки высококачественных переносимых утилит.
JSP поддерживает разделение ролей автора и разработчика:
Разработчики пишут компоненты, взаимодействующие с серверными/server-side объектами.
Авторы помещают статические данные и динамическое содержимое в одном месте с целью создания представления, подходящего для данной аудитории.
Каждая группа может делать свою работу, не вникая в работу других. Каждая роль имеет различные возможности, но, хотя эти возможности может реализовывать один человек, лучше этого не допускать. Разделение ролей даёт возможность естественного разделения труда.
Подразделение разработчиков может привлекаться для разработки многократно используемых компонентов, используемых авторами.
Многократно используемые компоненты и библиотеки тэгов
Технология JavaServer Pages включает использование компонентов, таких как JavaBeans™, Enterprise JavaBeans™ и библиотеки тэгов. Эти компоненты могут использоваться в интерактивных утилитах для разработки компонентов и создания страниц, давая в итоге ощутимую экономию времени. Кроме того, они несут в себе мощь межплатформенной гибкости и силы языка Java или других языков скриптинга.
Технология JavaServer Pages даёт возможность разделить статическое содержимое шаблона и динамическое содержимое, вставляемое в этот статический шаблон. Это значительно упрощает создание содержимого. Это разделение поддерживается "бобами"/beans - компонентами, разработанными специально для взаимодействия с серверными объектами, и механизмом расширения тэгов.
Технология JavaServer Pages поддерживает элементы скриптинга, а также акции. Акции инкапсулируют функциональность в удобной форме, которая может управляться утилитами. Скрипты предоставляют механизм объединения их функциональности на уровне страницы.
Слой доступа к Web для архитектуры N-поточного коммерческого приложения(-й)
Технология JavaServer Pages является частью Java 2 Platform
Enterprise Edition (J2EE). Платформа J2EE привносит технологию Java в коммерческую среду. Вы можете теперь разрабатывать мощные серверные приложения среднего слоя/middle-tier, включающие web-сайт, использующий технологию JavaServer Pages в качестве базы для работы компонентовEnterprise JavaBeans в среде J2EE.
JSP.1.2.1 Что такое страница JSP?
JSP-страница это текстовый документ, описывающий процесс обработки запроса для создания ответа. Шаблонные данные смешиваются с динамическими акциями и воздвигаются на платформу Java 2 Platform.JSP-технология поддерживает различные парадигмы авторизации динамического содержимого.
Ключевыми особенностями JavaServer Pages являются:
JSP.1.2.2 Web-Приложения
Концепция web-приложения унаследована от спецификации Servlet.Web-приложение может состоять из следующих частей:
Спецификация JavaServer Pages унаследовала от спецификации Servlet понятия web-приложений, ServletContexts/КонтекстаСервлета, сессии, запросов и ответов. См. детали в спецификации Java Servlet 2.3.
JSP.1.2.4 Этапы Трансляции и Выполнения
JSP-страницы являются текстуальными компонентами. Они проходят через две фазы: фазу трансляции и фазу запроса. Трансляция выполняется для страницы один раз. Фаза запроса выполняется один раз на один запрос.JSP-страница транслируется для создания класса сервлета, класса реализации JSP-страницы,
который инстанциируется во время запроса. Инстанциированный объект JSP-страницы
обрабатывает запросы и создаёт ответы.
JSP-страницы могут транслироваться до их использования, предоставляя web-приложение с классом сервлета, которое может служить текстуальным представлением JSP-страницы.
Трансляция может также выполняться JSP-контейнером на этапе публикации или по запросу, когда запросы достигают неоттранслированной JSP-страницы.
JSP.10.1.1 Интерфейс Tag
Синтаксисpublic interface Tag
Все Известные Субинтерфейсы: BodyTag, IterationTag
Описание
Это интерфейс простого обработчика тэга, который не хочет манипулировать своим содержимым. Интерфейс Tag определяет базовый протокол между обработчиком Tag и классом реализации JSP-страницы. Он определяет жизненный цикл и методы, вызываемые начальным и конечным тэгами.
Свойства
Интерфейс Tag специфицирует setter и getter-методы для основных свойств pageContext и parent. Объект реализации JSP-страницы вызывает setPageContext и setParent в этом порядке до вызова doStartTag() или doEndTag().
Методы
Есть две основные акции: doStartTag и doEndTag. После того как все соответствующие свойства инициализированы, методы doStartTag и doEndTag могут быть вызваны обработчиком тэга. Между этими вызовами принимается, что обработчик тэга имеет состояние, которое обязано сохраняться. После вызова doEndTag обработчик тэга доступен для последующих вызовов (и предполагается, что сохраняет свои свойства).
Жизненный цикл
Детали жизненного цикла описываются ниже диаграммой перехода, со следующими комментариями:
[1] Этот переход предназначен для выпуска долгоживущих данных. Не даётся никаких гарантий долговечности свойств.
[2] Этот перенос происходит, если, и только если, тэг заканчивается нормально без вызова исключения.
[3] Заметьте, что, поскольку нет никаких гарантий статуса свойств, тэг, имеющий установленными какие-либо свойства по выбору/optional, может быть использован повторно, только если эти свойства устанавливаются в новое (известное) значение. Это значит, что обработчики тэгов могут использоваться только с тем же “AttSet” (набором установленных атрибутов).
Просмотрите интерфейс TryCatchFinally на предмет дополнительных деталей относительно обработки исключений и обслуживания ресурсов.
После того как все вызовы обработчика тэга выполнены, в нём вызывается метод release.
После вызова метода release, принимается, что все свойства, включая parent
и pageContext, устанавливаются в неспецифицированное значение/unspecified. Компилятор страницы гарантирует, что release() будет вызван в обработчике Tag, до того как обработчик будет освобождён для GC.
Пустые и Непустые Акции
Если файл TagLibraryDescriptor указывает, что акция обязана всегда быть пустой акцией, через
Если возвращён SKIP_BODY, тело, если имеется, не обсчитывается.
Если возвращён EVAL_BODY_INCLUDE, тело обсчитывается и "передаётся" текущему out/выводу.
JSP.10.1.1.1 Поля
public static final int EVAL_BODY_INCLUDE
Вычисляет тело в существующем потоке out. Верное return-значение для doStartTag.
public static final int EVAL_PAGE
Продолжить вычисление страницы. Верное return-значение для doEndTag().
public static final int SKIP_BODY
Пропустить вычисление тела. Верное return-значение для doStartTag и doAfterBody.
public static final int SKIP_PAGE
Пропустить оставшуюся часть страницы. Верное return-значение для doEndTag.
JSP.10.1.1.2 Методы
public int doEndTag()
Обрабатывает конечный тэг данного экземпляра. Этот метод вызывается объектом реализации JSP-страницы для всех обработчиков Tag. Этот метод будет вызываться после возвращения из doStartTag. Тело акции может или может не вычисляться, в зависимости от return-значения doStartTag.
Если этот метод возвращает EVAL_PAGE, остаток страницы продолжит вычисляться.
Если этот метод возвращает SKIP_PAGE, остаток страницы не вычисляется, и запрос выполняется. Если этот запрос был направлен или включён из другой страницы (или Servlet), выполняется вычисление только текущей страницы. JSP-контейнер будет ресинхронизировать любые значения переменных, которые обозначены таковыми в TagExtraInfo, после вызова doEndTag().
Вызывает:JspException, JspException
public int doStartTag()
Обрабатывает начальный тэг данного экземпляра. Этот метод вызывается объектом реализации JSP-страницы.
Метод doStartTag принимает, что свойства pageContext и parent установлены. Он также принимает, что любые свойства, экспонированные как атрибуты, также установлены. В момент вызова этого метода тело ещё не вычислено.
Этот метод возвращает Tag.EVAL_BODY_INCLUDE или Body-Tag.EVAL_BODY_BUFFERED для обозначения того, что тело акции должно быть повторно вычислено, или SKIP_BODY - для обозначения противоположного.
Если Tag возвращает EVAL_BODY_INCLUDE, результат вычисления тела (если имеется) включается в текущий “out” JspWriter, когда он появляется. а затем вызывается doEndTag().
BodyTag.EVAL_BODY_BUFFERED является единственно верным значением, если обработчик тэга реализует BodyTag.
JSP-контейнер будет ресинхронизировать любые значения переменных, которые обозначены как таковые в TagExtraInfo, после вызова doStartTag().
Вызывает: JspException, JspException
См. также: BodyTag
public Tag getParent()
Получает родителя (ближайшего внешнего/содержащего обработчика тэга) для данного обработчика тэга.
Метод getParent() может использоваться для навигации по структуре вложенного обработчика тэга во время прогона для взаимодействия специальных акций; например, метод find-AncestorWithClass() в TagSupport предоставляет подходящий способ выполнения этого.
В текущей версии спецификации имеется только один формальный способ указания на рассматриваемый тип обработчика тэга: его класс реализации, описанный в субэлементе tag-class элемента tag. Он разворачивается неформальным способом, давая разрешение автору библиотеки тэгов указывать рассматриваемый тип в описании субэлемента. Этот тип должен быть подтипом класса реализации обработчика тэга или void. Это дополнительное ограничение может быть обработано специализированным контейнером, который знает об этой специфической библиотеке тэгов, как в случае со стандартной библиотекой тэгов JSP.
public void release()
Вызывается для освобождения состояния/release state. Компилятор страницы гарантирует, что объект реализации JSP-страницы будет вызывать этот метод для всех обработчиков тэгов, но между ними может быть несколько вызовов doStartTag и doEndTag.
public void setPageContext(PageContext pc)
Устанавливает текущий контекст страницы. Этот метод вызывается объектом реализации JSP-страницы до вызова doStartTag().
Это значение *не* переустанавливается методом doEndTag() и обязано быть переустановлено явно реализацией страницы, если оно изменяется между вызовами doStartTag().
pc - Контекст страницы для данного обработчика тэга.
public void setParent(Tag t)
Устанавливает родителя (ближайшего внешнего обработчика тэга) для данного обработчика тэга. Вызывается объектом реализации JSP-страницы до вызова doStartTag().
Это значение *не* переустанавливается методом doEndTag() и обязано быть переустановлено явно реализацией страницы.
Параметры:
t - тег-родитель или null.
JSP.10.1.2 IterationTag
Синтаксисpublic interface IterationTag extends Tag
Все Известные Субинтерфейсы: BodyTag
Все Суперинтерфейсы: Tag
Все Известные Реализующие Классы: TagSupport
Описание
Интерфейс IterationTag расширяет интерфейс Tag через определение одного дополнительного метода, управляющего повторными вычислениями его тела.
Обработчик тэга, реализующий IterationTag, рассматривается как обработчик, реализующий Tag через методы doStartTag() и doEndTag(). IterationTag предоставляет новый метод: doAfterBody().
Метод doAfterBody() вызывается после каждого цикла итерации - вычисления тела для управления последующими вычислениями тела.
Если doAfterBody() возвращает IterationTag.EVAL_BODY_AGAIN, тогда тело снова будет вычисляться.
Если doAfterBody() возвращает Tag.SKIP_BODY, тогда тело будет пропущено и вместо него будет обсчитываться doEndTag().
Свойства
Новых свойств, в дополнение к уже имеющимся в Tag, нет.
Методы
Имеется один новый метод: doAfterBody().
Жизненный цикл
Жизненный цикл показан на диаграмме переноса. Исключения, вызываемые в процессе обсчёта doStartTag(), BODY и doAfterBody(), прерывают последовательность выполнения и помещаются на верх стэка, если только обработчик тэга не реализует интерфейс TryCatchFinally; см. детали об этом интерфейсе.

Пустые и Непустые Акции
Если TagLibraryDescriptor-файл указывает, что тело всегда обязано иметь пустую акцию (когда вхождение
Если возвращено SKIP_BODY, тело не обсчитывается и вызывается doEndTag().
Если возвращено EVAL_BODY_INCLUDE, тело обсчитывается и “передаётся” текущему out, затем вызывается doAfterBody() и, после 0 или более итераций, вызывается doEndTag().
JSP.10.1.2.3 Поля
public static final int EVAL_BODY_AGAIN
Запрашивает повторение обсчёта некоторого тела/body. Возвращается методом doAfterBody. Для совместимости с JSP 1.1 значение должно тщательно подбираться, чтобы быть тем же самым, что и в, теперь не рекомендуемом, BodyTag.EVAL_BODY_TAG.
JSP.10.1.2.4 Методы
public int doAfterBody()
Осуществляет (пере) обсчёт тела. Этот метод вызывается объектом реализации JSP-страницы после каждого обсчёта тела в объекте BodyEvaluation. Этот метод не вызывается, если нет обсчёта тела/body.
Если doAfterBody возвращает EVAL_BODY_AGAIN, происходит новый обсчёт тела (с последующим вызовом doAfterBody). Если doAfterBody возвращает SKIP_BODY, обсчёт тела больше не производится, значение out восстанавливается через использование метода popBody в pageContext, а затем вызывается doEndTag.
Повторные вызовы метода могут приводить к различным акциям, поскольку могли быть произведены какие-то изменения разделяемого статуса, или из-за внешнего вычисления. JSP-контейнер будет ресинхронизировать любые значения переменных, которые обозначены в TagExtraInfo, после вызова doAfterBody().
Возвращает: нужно ли проводить дополнительные обсчёты тела/body.
Вызывает: JspException
JSP.10.1.3 TryCatchFinally
Синтаксисpublic interface TryCatchFinally
Описание
Интерфейс, в дополнение к Tag, IterationTag или BodyTag, для обработчика тэга, которому нужны дополнительные возможности для обслуживания ресурсов. Этот интерфейс предоставляет два новых метода: doCatch(Throwable) и doFinally().
Прототип вызова таков:
h = get a Tag(); // получает обработчика тэга, возможно из пула
h.setPageContext(pc); // инициализируется
h.setParent(null);
h.setFoo(“foo”);
// протокол вызова тэга; см. Tag.java
try {
doStartTag()...
....
doEndTag()...
}catch (Throwable t){
// реагирует на условие исключения
h.doCatch(t);
} finally {
// восстанавливает инварианты данных и освобождает вызванные ресурсы
h.doFinally();
}
... другие вызовы, возможно, с новыми setter'ами
...
h.release(); // освобождает долгосрочные ресурсы
JSP.10.1.3.5 Методы
public void doCatch(java.lang.Throwable t)
Вызывается, если возникает Throwable при обсчёте BODY внутри тэга, или любым из следующих методов: Tag.doStartTag(), Tag.doEndTag(), Iteration-Tag.doAfterBody() и BodyTag.doInitBody().
Этот метод вызывается, если Throwable возникает в одном из setter-методов.
Этот метод может вызывать исключение (то же самое или новое), которое будет затем помещено во вложенную цепь. Если исключение возникает, будет вызван doFinally().
Этот метод предназначен для использования в ответ на исключительное условие.
Параметры:
t - Навигация вызываемого исключения по этому тэгу.
Вызывает: Throwable
public void doFinally()
Вызывается во всех случаях после doEndTag() для всех классов, реализующих Tag, IterationTag или BodyTag. Этот метод вызывается, даже если в BODY тэга возникло исключение, или в любом из следующих методов:
Tag.doStartTag(), Tag.doEndTag(), IterationTag.doAfterBody() и Body-Tag.doInitBody().
Этот метод не вызывается, если Throwable возникает в одном из setter-методов.
Этот метод не должен вызывать Exception.
Этот метод предназначен для обслуживания целостности данных при вызове и акций обслуживания ресурсов.
JSP.10.1.4 TagSupport
Синтаксисpublic class TagSupport implements IterationTag, java.io.Serializable
Прямые Известные Подклассы: BodyTagSupport
Все Реализованные Интерфейсы: IterationTag, java.io.Serializable, Tag
Описание
Базовый класс для определения новых обработчиков тэгов, реализующих Tag.
Класс TagSupport является служебным классом, предназначенным для использования в качестве базового класса для новых обработчиков тэгов. Класс TagSupport реализует интерфейсы Tag и IterationTag и добавляет дополнительные удобные методы, включая getter-методы для свойств в Tag. TagSupport имеет один static-метод, который включён для облегчения координации между кооперирующимися тэгами.
Многие обработчики тэгов будут расширять TagSupport и переопределять только некоторые методы.
JSP.10.1.4.6 Поля
protected java.lang.String id
protected PageContext pageContext
JSP.10.1.4.7 Конструкторы
public TagSupport()
Конструктор по умолчанию, все классы должны определять только public-конструктор с той же подписью и вызывать конструктор суперкласса. Этот конструктор вызывается кодом, генерируемым JSP-транслятором.
JSP.10.1.4.8 Методы
public int doAfterBody()
Процессинг по умолчанию для тела/body.
Возвращает: SKIP_BODY
Вызывает: JspException
См. также: public int doAfterBody()
public int doEndTag()
Процессинг по умолчанию конечного тэга, возвращающий EVAL_PAGE.
Вызывает: JspException
См. также: public int doEndTag()
public int doStartTag()
Процессинг по умолчанию начального тэга, возвращающий SKIP_BODY.
Вызывает:JspException
См. также: public int doStartTag()
public static final Tag findAncestorWithClass(Tag from, java.lang.Class klass)
Находит экземпляр типа данного класса, который ближе всего к данному экземпляру. Этот метод использует метод getParent из интерфейса Tag. Этот метод используется для координации между кооперирующимися тэгами.
Текущая версия спецификации предоставляет только один формальный способ указания на рассматриваемый тип обработчика тэга: его класс реализации обработчика тэга, описанный в субэлементе tag-class элемента tag. Здесь выполняется неформальное расширение, позволяющее автору библиотеки тэгов указывать в субэлементе description рассматриваемый тип. Тип должен быть подтипом класса реализации обработчика тэга или void. Это дополнительное ограничение может быть выполнено специализированным контейнером, который знает об этой специфической библиотеке тэгов, как в случае со стандартной библиотекой тэгов JSP.
Если автор библиотеки тэгов предоставляет информацию о рассматриваемом типе обработчика тэга, клиентский программный код должен быть приспособлен к этому ограничению. Точнее, Class, переданный в findAncestorWithClass, должен иметь подтип рассматриваемого типа.
Параметры:
from - Экземпляр, с которого начинать просмотр.
klass - Совпадающий подкласс Tag'а или интерфейс.
public java.lang.String getId() - Значение атрибута id этого тэга; или null.
public Tag getParent() - Ближайший экземпляр Tag'а, заключающий в себе данный экземпляр тэга.
См. также: public Tag getParent()
public java.lang.Object getValue(java.lang.String k)
Получает значение, ассоциированное с ключом/key.
Параметры:
k - Строка-ключ.
public java.util.Enumeration getValues()
Перечисляет значения, хранимые в этом обработчике тэга.
public void release()
Освобождает статус.
См. также: public void release()
public void removeValue(java.lang.String k)
Удаляет значение, ассоциированное с ключом.
Параметры:
k - строка-ключ.
public void setId(java.lang.String id)
Устанавливает атрибут id для данного тэга.
Параметры:
id - String для id.
public void setPageContext(PageContext pageContext)
Устанавливает контекст страницы.
Параметры:
pageContenxt- PageContext.
См. также: public void setPageContext(PageContext pc)
public void setParent(Tag t)
Устанавливает вкладывающий тэг для данного тэга.
Параметры:
t - родительский Tag.
См. также: public void setParent(Tag t)
public void setValue(java.lang.String k, java.lang.Object o)
Ассоциирует значение со String-ключом.
Параметры:
k - String-ключ.
o - Ассоциируемое значение.
JSP.10.1 Простые Обработчики Тэгов
Этот раздел вводит понятие обработчика тэга и описывает простейшие типы обработчика тэга.Обработчик Тэга/Tag Handler
Обработчик тэга это объект времени выполнения, обслуживаемый контейнером, обсчитывающий специальные акции в процессе выполнения JSP-страницы. Обработчик тэга поддерживает протокол, что позволяет JSP-контейнеру предоставлять возможность тесной интеграции серверных акций в JSP-странице.
Обработчик тэга создаётся первоначально с использованием нулевого аргумента конструктора в соответствующем классе; метод java.beans.Beans.instantiate() не используется.
Обработчик тэга имеет несколько свойств, которые экспонируются странице как атрибуты акции; эти свойства обслуживаются JSP-контейнером (через генерируемый код).
setter-метод используется для установки свойств, обнаруженных с помощью машины интроспекции JavaBeans.
Протокол, поддерживаемый обработчиком тэга, даёт возможность передавать параметры, обсчитывать и пересчитывать тело акции и получать доступ к объектам и другим обработчикам тэгов в JSP-странице.
Экземпляр обработчика тэга отвечает за обработку тэга на этапе запроса. В обязанности JSP-контейнера входит запуск этого процесса.
Дополнительная информация времени трансляции, ассоциированная с акцией, указывает имена каких-либо переменных скриптинга, которые она (акция) может вводить, их типы и области видимости.
В определённые моменты JSP-контейнер будет автоматически синхронизировать информацию Page-Context с переменными на языке скриптинга, чтобы они могли стать доступными непосредственно через элементы скриптинга.
Свойства
Обработчик тэга имеет несколько свойств.
Все обработчики тэгов имеют свойство pageContext для JSP-страницы, на которой находится тэг, и свойство parent для обработчика тэга ближайшей внешней/содержащей акции. Отдельные классы обработчика тэга могут иметь дополнительные свойства.
Все атрибуты специальной акции обязаны быть свойствами компонента JavaBeans, хотя некоторые свойства не могут экспонироваться в качестве атрибутов. Атрибуты, видимые JSP-транслятору, это в точности те атрибуты, которые перечислены в Дескрипторе Обработчика Тэга/(TLD).
Все свойства экземпляра обработчика тэга, экспонированные как атрибуты, будут инициализироваться контейнером с помощью соответствующих setter-методов, прежде чем этот экземпляр можно будет использовать для выполнения методов акции. JSP-контейнер отвечает за вызов соответствующих методов setter-методов для инициализации этих свойств. Пользовательский код, находящийся в скриптлетах, код JavaBeans или код внутри специальных тэгов отвечают за вызов этих методов, так как иначе эта информация и информация контейнера будут мешать друг другу.
setter-методы, которые должны использоваться при установке значения атрибуту специальной акции, определяются через использование интроспектора JavaBeans в классе обработчика тэга, а затем используется setter-метод, ассоциированный со свойством, имеющий то же самое имя, что и атрибут в запросе. Подразумевается (в спецификации JavaBeans - недостаточно чётко), что для каждого свойства имеется только один setter.
Неспецифицированные атрибуты/свойства не должны использоваться (через setter-метод).
После того как свойство установлено, оно считается постоянным, так что, если JSP-контейнер утверждает, что свойство уже установлено в данном экземпляре обработчика тэга, оно не должно устанавливаться ещё раз (дополнительно).
Пользовательский код имеет доступ к информации свойства и может модифицировать внутреннее состояние обработчика тэга, начиная с первого метода акции (doStartTag) до последнего метода данной акции (doEndTag или doFinally - для обработчиков тэгов, реализующих TryCatchFinally).
Обработчик Тэга как Объект, Обслуживаемый Контейнером
Поскольку обработчик тэга является объектом, обслуживаемым контейнером, контейнер должен обслуживать его ссылки; точнее, пользовательский код не должен сохранять ссылки на обработчик тэга, за исключением ссылок между стартом первого метода акции (doStartTag()) и концом последнего метода акции (doEndTag() или doFinally() - для тэгов, реализующих TryCatchFinally).
Эти ограничения на ссылки на объекты обработчика тэга и на модификацию свойств атрибутов дают JSP-контейнеру относительную свободу для эффективного обслуживания объектов обработчика тэга для достижения различных целей. Например, контейнер может реализовывать различные стратегии пулинга/pooling (создания пула) для минимизации затрат на создание, или может осуществлять установку свойств для уменьшения затрат, когда обработчик тэга находится внутри другого повторяющегося/iterative тэга.
Соглашения
Обработчик тэга реализует акцию; JSP- контейнер обязан выдерживать конверсии типов, описанные в , при присвоении значений атрибутам акции.
Пустые и Непустые Акции
Пустая акция не имеет тела; она может использовать один или два синтаксиса:
В TLD имеется механизм указания на возможность использования тэга только для написания пустых акций; если это используется, непустые акции, использующие такой тэг, будут давать ошибку трансляции.
Непустая акция имеет тело.
Интерфейс Tag
Обработчик тэга, который "не хочет" обрабатывать своё тело, может просто реализовывать интерфейс Tag. Обработчик тэга может "не хотеть" обрабатывать своё тело, если это пустой тэг, или из-за того, что тело просто “передаётся (дальше)/passed through”.
Интерфейс Tag имеет методы предоставления информации о контексте страницы экземпляру Обработчика Тэга, методы обслуживания жизненного цикла обработчиков тэгов и два основных метода для выполнения акции: doStartTag()и doEndTag().
Метод doStartTag() вызывается при обнаружении начального тэга, и его return-значение указывает, должно ли тело/body (если имеется) быть пропущено, или вычислено и передано текущему потоку response.
Метод doEndTag() вызывается при обнаружении конечного тэга; его return-значение указывает, должно ли продолжаться обсчитывание оставшейся части страницы, или нет.
Если в процессе обсчёта тела тэга обнаружено исключение, метод doEndTag не будет выполняться. См. в тэге TryCatchFinally методы, которые гарантированно выполняются.
Интерфейс IterationTag
Интерфейс IterationTag используется для повторяющихся вычислений тела специальной акции.
Этот интерфейс имеет единственный метод - doAfterBody(), который вызывается после каждого вычисления тела для определения необходимости дальнейших вычислений.
Повторение вычисления запрашивается значением 2, которое в JSP 1.1 определено как BodyTag.EVAL_BODY_TAG. Это константное значение сохранено в JSP 1.2 (для полной обратной совместимости), но, для улучшения ясности кода, имеется и новое имя: IterationTag.EVAL_BODY_AGAIN.
Для остановки итерации возвращаемое значение должно быть 0, то есть Tag.SKIP_BODY.
Базовый Класс TagSupport
Класс TagSupport является базовым классом, используемым при реализации интерфейсов Tag или IterationTag.
JSP.10.2.1 bodyContent
Синтаксисpublic abstract class bodyContent extends JspWriter
Описание
Инкапсулирует вычисление/обсчёт тела акции так, что доступен обработчику тэга. bodyContent является подклассом JspWriter'а.
Обратите внимание, что содержимое bodyContent'а является результатом вычисления, поэтому оно не будет содержать акций и т.п., кроме результата своих вызовов.
bodyContent имеет методы конвертации своего содержимого в String, для чтения его содержимого, и для очистки/clear своего содержимого.
Размер буфера объекта bodyContent не ограничен. Объект bodyContent не может быть в режиме autoFlush.
Невозможно вызвать flush в объекте bodyContent, так как отсутствует фоновый/backing поток.
Экземпляры bodyContent'а создаются через вызов методов pushBody и popBody класса PageContext.
bodyContent заключён внутри другого JspWriter'а (возможно, другого объекта bodyContent), следуя структуре их ассоциированных акций.
bodyContent становится доступным BodyTag'у через вызов setBodyContent().
Обработчик тэга может использовать этот объект до момента вызова doEndTag().
JSP.10.2.1.9 Конструкторы
protected bodyContent(JspWriter e)
Protected-конструктор. Несвязанный буфер, без autoflushing/автооочистки.
JSP.10.2.1.10 Методы
public void clearBody()
Очищает body без вызова исключений.
public void flush()
Переопределённый таким образом flush() не допускается. Нельзя зачищать bodyContent, поскольку позади него отсутствует фоновый/backing поток.
Переопределяет: public abstract void flush() в классе JspWriter
Вызывает: IOException
public JspWriter getEnclosingWriter()
Получает содержащий JspWriter.
Возвращает: содержащий JspWriter, переданный на этапе конструирования.
public abstract java.io.Reader getReader()
Возвращает: значение данного bodyContent как Reader.
public abstract java.lang.String getString()
Возвращает: значение данного bodyContent как String.
public abstract void writeOut(java.io.Writer out)
Записывает содержимое данного bodyContent в Writer. Подклассы могут оптимизировать общие патэрны вызова.
Параметры:
out - writer, в который помещается содержимое вычисления этого body.
Вызывает: IOException
JSP.10.2.2 BodyTag
Синтаксисpublic interface BodyTag extends IterationTag
Все Суперинтерфейсы: IterationTag, Tag
Все Известные Реализующие Классы: BodyTagSupport
Описание
Интерфейс BodyTag расширяет IterationTag путём определения дополнительных методов, позволяющих обработчику тэга манипулировать содержимым, обсчитывая его тела.
Обработчик тэга отвечает за обработку содержимого body. Например, обработчик тэга может взять содержимое тела, конвертировать его в String путём использования метода bodyContent.getString и его последующего использования. Либо обработчик тэга может взять тело содержимого и записать его в содержащий JspWriter, используя метод bodyContent.writeOut.
Обработчик тэга, реализующий BodyTag, рассматривается как обработчик, реализующий IterationTag, за исключением того, что метод doStartTag может возвратить SKIP_BODY, EVAL_BODY_INCLUDE или EVAL_BODY_BUFFERED.
Если возвращено EVAL_BODY_INCLUDE, вычисление проводится как в IterationTag.
Если возвращено EVAL_BODY_BUFFERED, будет создан объект bodyContent (в коде, генерируемом JSP-компилятором) для захвата вычисления тела.
Код, генерируемый JSP-компилятором, получает объект bodyContent через вызов метода pushBody из текущего pageContext, который дополнительно даёт эффект сохранения предыдущего значения out. Компилятор страницы возвращает этот объект через вызов метода popBody класса PageContext; этот вызов также восстанавливает значение out.
Этот интерфейс предоставляет одно новое свойство с setter-методом и новый метод акции.
Свойства
Имеется новое свойство: bodyContent, для получения объекта bodyContent, где объект реализации JSP-страницы будет размещать вычисление/обсчёт (и повторный обсчёт, если нужно) тела.
setter-метод (setBodyContent) будет вызван только в том случае, если doStartTag() возвратит EVAL_BODY_BUFFERED.
Методы
В дополнение к setter-методу свойства bodyContent есть новый метод акции: doInitBody(), который вызывается сразу после setBodyContent() и до обсчёта тела. Этот метод вызывается только в том случае, если doStartTag() возвращает EVAL_BODY_BUFFERED.
Жизненный цикл
Детали жизненного цикла даны ниже на диаграмме переноса. Исключения, вызываемые в процессе вычислений doStartTag(), setBodyContent(), doInit-Body(), BODY, doAfterBody(), прерывают выполнение и помещаются на верх стэка, если только обработчик тэга не реализует интерфейс TryCatchFinally; см. детали об этом интерфейсе.

Пустые и Непустые Акции
Если TagLibraryDescriptor-файл указывает, что акция всегда обязана иметь пустую акцию (когда вхождение
Если возвращено SKIP_BODY, тело не обсчитывается и вызывается doEndTag().
Если возвращено EVAL_BODY_INCLUDE, setBodyContent() не вызывается, doInitBody() не вызывается, тело обсчитывается и “передаётся” текущему out, затем вызывается doAfterBody() и, после 0 или более итераций, вызывается doEndTag().
Если возвращено EVAL_BODY_BUFFERED, setBodyContent() вызывается, doInit-Body()
вызывается, тело обсчитывается, вызывается doAfterBody() и, после 0 или более итераций, вызывается doEndTag().
JSP.10.2.2.11 Поля
public static final int EVAL_BODY_BUFFERED
Запрашивается создание нового буфера, bodyContent, в котором происходит обсчёт тела данного тэга.
Возвращается из doStartTag, если класс реализует BodyTag.
Неверным является значение doStartTag, если класс не реализует BodyTag.
public static final int EVAL_BODY_TAG
Не рекомендуется. Так как Java JSP API 1.2 использует BodyTag.EVAL_BODY_BUFFERED или IterationTag.EVAL_BODY_AGAIN.
Не рекомендуемая для использования константа, которая имеет то же значение, что и EVAL_BODY_BUFFERED и EVAL_BODY_AGAIN. Помечена как не рекомендуемая с целью продвижения этих двух различных терминов, которые являются более описательными.
JSP.10.2.2.12 Методы
public void doInitBody()
Подготавливает обсчёт/вычисление тела/body. Этот метод вызывается объектом реализации JSP-страницы после setBodyContent и до первого вычисления тела. Этот метод не вызывается для пустых тэгов или непустых тэгов, чей метод doStartTag() возвращает SKIP_BODY или EVAL_BODY_INCLUDE.
JSP- контейнер будет ресинхронизировать любые значения переменных, которые обозначены как таковые в TagExtraInfo, после вызова doInitBody().
Вызывает:JspException
public void setBodyContent(bodyContent b)
Устанавливает свойство bodyContent. Этот метод вызывается объектом реализации JSP-страницы максимум один раз на один вызов акции. Этот метод будет вызван до doInitBody. Этот метод не будет вызван для пустых тэгов и для непустых тэгов, чей метод doStartTag() возвращает SKIP_BODY или EVAL_BODY_INCLUDE.
Если setBodyContent вызывается, значение неявного объекта out уже было изменено в объекте pageContext. Передаваемый объект bodyContent не будет содержать данных, но может использоваться повторно (и очищаться) после некоторого предыдущего вызова.
Объект bodyContent доступен с соответствующим содержимым, пока не вызван метод doEndTag, после чего он может быть использован повторно.
Параметры:
b - bodyContent
JSP.10.2.3 BodyTagSupport
Синтаксисpublic class BodyTagSupport extends TagSupport implements BodyTag
Все Реализованные Интерфейсы: BodyTag, IterationTag, java.io.Serializable, Tag
Описание
Базовый класс для определения обработчиков тэгов, реализующих BodyTag.
Класс BodyTagSupport реализует интерфейс BodyTag и добавляет несколько удобных методов, включая getter-методы для свойства bodyContent и методы для получения предыдущего out JspWriter.
Многие обработчики тэгов будут расширять BodyTagSupport и переопределять только несколько методов.
JSP.10.2.3.13 Поля
protected bodyContent bodyContent
JSP.10.2.3.14 Конструкторы
public BodyTagSupport()
Конструктор по умолчанию, все подклассы должны определить public-конструктор с той же подписью и вызвать конструктор суперкласса. Этот конструктор вызывается кодом, генерируемым JSP-транслятором.
JSP.10.2.3.15 Методы
public int doAfterBody()
После вычисления/обсчёта тела: не выполнять повторного обсчёта и продолжать разбор страницы. С данными bodyContent по умолчанию ничего не делается (если они имеются).
Переопределяет: public int doAfterBody() в классе TagSupport
Возвращает: SKIP_BODY
Вызывает: JspException
public int doEndTag()
Процессинг по умолчанию конечного тэга, возвращающий EVAL_PAGE.
Переопределяет: public int doEndTag() в классе TagSupport
Возвращает: EVAL_PAGE
Вызывает: JspException
public void doInitBody()
Подготавливает обсчёт/вычисление тела/body сразу перед первым вычислением тела: нет акции.
Вызывает: JspException
public int doStartTag()
Процессинг по умолчанию начального тэга, возвращающий
Переопределяет: public int doStartTag() в классе TagSupport.
Возвращает: EVAL_BODY_BUFFERED;
Вызывает:JspException
public bodyContent getBodyContent()
Получает текущий bodyContent.
Возвращает: содержимое тела.
public JspWriter getPreviousOut()
Получает окружающий out JspWriter.
Возвращает: содержащий JspWriter, из bodyContent.
public void release()
Освобождает статус.
Переопределяет: public void release() в классе TagSupport.
public void setBodyContent(bodyContent b)
Подготавливает для обсчёта тела: прячет bodyContent.
Параметры: b - bodyContent
JSP.10.2 Обработчики Тэгов, которые хотят получить Доступ к Содержимому своего Body/Тела
Вычисление тела передаётся в объект bodyContent, который затем становится доступным обработчикам тэгов, реализующим интерфейс BodyTag. Класс BodyTag-Support даёт базовый класс, упрощающий написание этих обработчиков. Если обработчик Tag хочет иметь доступ к содержимому его тела, то он обязан реализовывать интерфейс BodyTag. Этот интерфейс расширяет IterationTag, предоставляя два дополнительных метода setBodyContent(bodyContent) и doInitBody() и ссылаясь на объект типа bodyContent.bodyContent это подкласс JspWriter'а, имеющий несколько дополнительных методов для конвертации его содержимого в String, вставки этого содержимого в другой JspWriter, получения Reader в его содержимое и очистки содержимого. Его семантика гарантирует, что размер буфера никогда не будет превышен.
Реализация JSP-страницы создаст bodyContent, если метод doStartTag() возвращает EVAL_BODY_BUFFERED. Этот объект будет передан методу doInitBody(); затем тело тэга будет обсчитано, и в ходе этого вычисления out будет привязан к bodyContent, только что переданному обработчику BodyTag.
Затем doAfterBody() будет обсчитан. Если этот метод вернёт SKIP_BODY, больше никаких вычислений тела выполнено не будет; если метод вернёт EVAL_BODY_AGAIN, тогда тело будет обсчитано, а doAfterBody() будет вызван вновь.
Содержимое экземпляра bodyContent остаётся доступным, пока не будет вызван его ассоциированный метод doEndBody().
Обычно bodyContent используется для извлечения его содержимого в String и последующего использования этой String в качестве значения для некоторой операции. Другой обычный способ использования - взять его содержимое и поместить его в поток вывода/out Stream, который был верным/действующим/valid в момент обнаружения тэга (который доступен из объекта PageContext, переданного обработчику в setPageContext).
JSP.10.3 Пример Работы с Аннотированным Обработчиком Тэга
Ниже дан довольно полный пример того, как JSP-контейнер может выбрать выполнение некоторого обслуживания обработчика тэга.Есть и другие стратегии, которым можно следовать.
В данном примере мы принимаем, что x:iterate это тег итерации, а x:doit и x:foobar - простые тэги. Мы также принимаем, что x:iterate и x:foobar реализуют интерфейс TryCatchFinally, а x:doit - не реализует его.
Код, показанный ниже, принимает, что имеется обслуживаемый пул обработчиков тэгов (детали не описаны, хотя обслуживание пула проще, если нет атрибутов по выбору), и пытается использовать обработчики тэгов повторно, если это возможно. Этот код “крадёт” установки этих свойств для уменьшения затрат, где это возможно, например, при итерации.
boolean b1, b2;
IterationTag i; // для x:iterate
Tag d; // для x:doit
Tag d; // для x:foobar
page: // лэйбл для конца страницы...
// инициализируется тэг итерации
i = get tag from pool or new();
i.setPageContext(pc);
i.setParent(null);
i.setSrc(“foo”);
// x:iterate implements TryCatchFinally
try {
if ((b1 = i.doStartTag()) == EVAL_BODY_INCLUDE) {
// инициализируется тэг doit
// код выводится из цикла для показа
d = get tag from pool or new();
d.setPageContext(pc);
d.setParent(i);
d.setAtt1(“one”);
loop:
while (1) do {
// Игнорирую символы новой строки...
// два вызова, сплавленные вместе
// первый вызов x:doit
d.setAtt2(1+1);
if ((b2 = d.doStartTag()) == EVAL_BODY_INCLUDE) {
// ничего
} else if (b2 != SKIP_BODY) {
// Q? ошибка протокола ...
}
if ((b2 = d.doEndTag()) == SKIP_PAGE) {
break page; // выполняется им.
} else if (b2 != EVAL_PAGE) {
// Q? ошибка протокола
}
// вызов x:foobar
f = get tag from pool or new();
f.setPageContext(pc);
f.setParent(i);
// x:foobar implements TryCatchFinally
try {
if ((b2 = f.doStartTag()) == EVAL_BODY_INCLUDE) {
// ничего
} else if (b2 != SKIP_BODY) {
// Q? ошибка протокола
}
if ((b2 = f.doEndTag()) == SKIP_PAGE) {
break page; // выполняется им.
} else if (b2 != EVAL_PAGE) {
// Q? ошибка протокола
}
} catch (Throwable t) {
f.doCatch(t); // отловлено, может быть повторно отловлено!
} finally {
f.doFinally();
}
// помещает f обратно в пул
// второй вызов x:doit
d.setAtt2(2+2);
if ((b2 = d.doStartTag()) == EVAL_BODY_INCLUDE) {
// ничего
} else if (b2 != SKIP_BODY) {
// Q? ошибка протокола
}
if ((b2 = d.doEndTag()) == SKIP_PAGE) {
break page; // выполняется им.
} else if (b2 != EVAL_PAGE) {
// Q? ошибка протокола
}
if ((b2 = i.doAfterBody()) == EVAL_BODY_AGAIN) {
break loop;
} else if (b2 != SKIP_BODY) {
// Q? ошибка протокола
}
// цикл
}
} else if (b1 != SKIP_BODY) {
// Q? ошибка протокола
}
// конец IteratorTag ...
if ((b1 = i.doEndTag()) == SKIP_PAGE) {
break page; // выполняется им.
} else if (b1 != EVAL_PAGE) {
// Q? ошибка протокола
}
// третий вызов
// этот обработчик тэга может быть повторно использован из предыдущего.
d = get tag from pool or new();
d.setPageContext(pc);
d.setParent(null);
d.setAtt1(“one”);
d.setAtt2(3+3);
if ((b1 = d.doStartTag()) == EVAL_BODY_INCLUDE) {
// ничего
} else if (b1 != SKIP_BODY) {
// Q? ошибка протокола
}
if ((b1 = d.doEndTag()) == SKIP_PAGE) {
break page; // выполняется им.
} else if (b1 != EVAL_PAGE) {
// Q? ошибка протокола
}
}catch (Throwable t){
i.doCatch(t); // отловлено, может быть повторно отловлено!
} finally {
i.doFinally();
}
JSP.10.4 Кооперирующиеся Акции
Акции могут кооперироваться с другими акциями и с кодом скриптинга разными способами.PageContext
Часто две акции в JSP-странице нужно скооперировать: когда, возможно, одна акция создаёт серверный объект, доступ к которому осуществляет вторая акция. Один из механизмов реализации этого - дать объекту имя внутри JSP-страницы; первая акция создаст объект и ассоциирует имя с ним, а вторая акция будет использовать это имя для запроса объекта.
Например, в следующем JSP-фрагменте акция foo может создать серверный объект и дать ему имя “myObject”. Затем акция bar может получить доступ к этому серверному объекту и выполнить какое-нибудь действие.
В JSP-реализации отображение “имя”->значение хранится в неявном объекте pageContext. Этот объект передаётся по кругу через экземпляры обработчика Tag так, что он (объект) может использоваться для передачи информации: всё, что необходимо, это знать имя, под которым информация хранится в pageContext.
Стэк Времени Прогона/Runtime Stack
Альтернативой явной передаче информации через именованный объект является неявная координация на базе синтаксической видимости. Например, в следующем JSP-фрагменте акция foo могла бы создать серверный объект; затем вложенная акция bar могла бы получить доступ к этому серверному объекту. Этот объект не именован внутри pageContext: он может быть найден, поскольку конкретный элемент foo является ближайшим содержащим экземпляром известного типа элемента.
Эта функциональность поддерживается через
BodyTagSupport.findAncestorWithClass(Tag, Class), который использует ссылку на родительский тэг, сохраняемую каждым экземпляром Tag, что эффективно представляет стэк выполнения времени/этапа прогона.
JSP.10.5.1 TagLibraryInfo
Синтаксисpublic abstract class TagLibraryInfo
Описание
Это информация времени трансляции, ассоциированная с директивой taglib и её TLD-файлом. Большая часть информации получается непосредственно из TLD, за исключением значений префикса и uri, используемых в директиве taglib.
JSP.10.5.1.16 Поля
protected java.lang.String info
protected java.lang.String jspversion
protected java.lang.String prefix
protected java.lang.String shortname
protected TagInfo[] tags
protected java.lang.String tlibversion
protected java.lang.String uri
protected java.lang.String urn
JSP.10.5.1.17 Конструкторы
protected TagLibraryInfo(java.lang.String prefix, java.lang.String uri)
Конструктор. Будут вызываться конструкторы для TagInfo и TagAttributeInfo после разбора TLD-файла.
Параметры:
prefix - префикс, используемый директивой taglib
uri - URI, используемый директивой taglib
JSP.10.5.1.18 Методы
public java.lang.String getInfoString()
Информация (документация) для данного TLD.
public java.lang.String getPrefixString()
Префикс, назначенный этой taglib из директивы <%taglib.
public java.lang.String getReliableURN()
“Надёжное” URN, указанное в TLD. Может использоваться утилитами авторизации в качестве глобального идентификатора (атрибут uri) при создании директивы taglib для данной библиотеки.
public java.lang.String getRequiredVersion()
Строка, описывающая требуемую версию JSP-контейнера.
public java.lang.String getShortName()
Предпочтительное краткое имя (префикс), как указано в TLD. Может использоваться утилитами авторизации в качестве предпочтительного префикса при создании директивы include для данной библиотеки.
public TagInfo getTag(java.lang.String shortname)
Получает TagInfo для данного имени тэга, просматривая все тэги в данной библиотеке тэгов.
Параметры:
shortname - Краткое имя (не префикс) тэга.
public TagInfo[] getTags()
Массив, описывающий тэги, определённые в данной библиотеке.
public java.lang.String getURI()
Значение атрибута uri из директивы <%@ taglib для данной библиотеки.
JSP.10.5.10 TagVariableInfo
Синтаксисpublic class TagVariableInfo
Описание
Информация переменной для тэга в Библиотеке Тэгов. Этот класс инстанциируется из TLD-файла и доступен только во время трансляции. Этот объект должен быть неизменяемым.
Данная информация доступна только в формате JSP 1.2.
JSP.10.5.10.39 Конструкторы
public TagVariableInfo(java.lang.String nameGiven, java.lang.String nameFromAttribute, java.lang.String className, boolean declare, int scope)
Конструктор для TagVariableInfo.
Параметры:
nameGiven - значение
nameFromAttribute - значение
className - значение
declare - значение
scope - значение
JSP.10.5.10.40 Методы
public java.lang.String getClassName()
Тело элемента
Возвращает: имя класса переменной.
public booleangetDeclare()
Тело элемента
Возвращает: объявляется переменная, или нет.
public java.lang.String getNameFromAttribute()
Тело элемента
Возвращает: атрибут, чьё значение определяет имя переменной.
public java.lang.String getNameGiven()
Тело элемента
Возвращает: имя переменной как константу.
public int getScope()
Тело элемента
Возвращает: область видимости для переменной.
JSP.10.5.2 TagInfo
Синтаксисpublic class TagInfo
Описание
Информация Tag для тэга в Библиотеке Тэгов; этот класс инстанциируется из файла TLD/Дескриптора Библиотеки Тэгов и доступна только во время трансляции.
JSP.10.5.2.19 Поля
public static final java.lang.String BODY_CONTENT_EMPTY
static-константа для getBodyContent(), если он пустой.
public static final java.lang.String BODY_CONTENT_JSP
static-константа для getBodyContent(), если это JSP.
public static final java.lang.String BODY_CONTENT_TAG_DEPENDENT
static-константа для getBodyContent(), если это зависит от Tag.
JSP.10.5.2.20 Конструкторы
public TagInfo(java.lang.String tagName, java.lang.String tagClassName, java.lang.String bodycontent, java.lang.String infoString, TagLibraryInfo taglib, TagExtraInfo tagExtraInfo, TagAttributeInfo[] attributeInfo)
Конструктор для TagInfo из данных в формате JSP 1.1 для TLD. Этот класс инстанциируется только из кода TagLibrary по запросу из некоторого кода JSP, разбирающего TLD (Tag Library Descriptor). Заметьте, что, поскольку TagLibibraryInfo отражает информацию TLD и директивы taglib, экземпляр TagInfo зависит от директивы taglib. Возможно это ошибка дизайна, которая может быть зафиксирована в будущем.
Параметры:
tagName - имя того тэга.
tagClassName - имя класса обработчика тэга.
bodycontent - информация о теле содержимого этих тэгов.
infoString - строковая информация (optional) для данного тэга.
taglib - экземпляр библиотеки тэгов, содержащей их.
tagExtraInfo - экземпляр, предоставляющий дополнительную информацию о тэге. Может быть null.
attributeInfo - массив данных AttributeInfo из дескриптора. Может быть null.
public TagInfo(java.lang.String tagName, java.lang.String tagClassName, java.lang.String bodycontent, java.lang.String infoString, TagLibraryInfo taglib, TagExtraInfo tagExtraInfo, TagAttributeInfo[] attributeInfo, java.lang.String displayName, java.lang.String smallIcon, java.lang.String largeIcon, TagVariableInfo[] tvi)
Конструктор для TagInfo из данных в формате JSP 1.2 для TLD. Этот класс инстанциируется только из кода TagLibrary по запросу из некоторого кода JSP, разбирающего TLD. Заметьте, что, поскольку TagLibibraryInfo отражает информацию TLD и директивы taglib, экземпляр TagInfo зависит от директивы taglib. Возможно это ошибка дизайна, которая может быть зафиксирована в будущем.
Параметры:
tagName - имя того тэга.
tagClassName - имя класса обработчика тэга.
bodycontent - информация о теле содержимого этих тэгов.
infoString - строковая информация (optional) для данного тэга.
taglib - экземпляр библиотеки тэгов, содержащей их.
tagExtraInfo - экземпляр, предоставляющий дополнительную информацию о тэге. Может быть null.
attributeInfo - массив данных AttributeInfo из дескриптора. Может быть null.
displayName - краткое имя для отображения утилитами.
smallIcon - путь к маленькой иконке, отображаемой утилитами.
largeIcon - путь к большой иконке, отображаемой утилитами.
tagVariableInfo - массив TagVariableInfo (или null).
JSP.10.5.2.21 Методы
public TagAttributeInfo[] getAttributes()
Информация атрибута (в TLD) в этом тэге. Возвращается массив, описывающий атрибуты данного тэга, как указано в TLD. Возврат null означает отсутствие атрибутов.
Возвращает: массив TagAttributeInfo для данного тэга.
public java.lang.String getBodyContent()
Информация bodycontent для данного тэга.
Возвращает: строку содержимого тела.
public java.lang.String getDisplayName()
Получает displayName.
Возвращает: Краткое имя для вывода утилитами.
public java.lang.String getInfoString()
Информационная строка для тэга.
Возвращает: информационную строку.
public java.lang.String getLargeIcon()
Получает путь к большой иконке.
Возвращает: путь к большой иконке, отображаемой утилитами.
public java.lang.String getSmallIcon()
Получает путь к маленькой иконке.
Возвращает: путь к маленькой иконке, отображаемой утилитами.
public java.lang.String getTagClassName()
Имя класса, предоставляющего обработчик для данного тэга.
Возвращает: имя класса обработчика тэга.
public TagExtraInfo getTagExtraInfo()
Экземпляр (если имеется) для дополнительной информации тэга.
Возвращает: экземпляр TagExtraInfo, если имеется.
public TagLibraryInfo getTagLibrary()
Экземпляр TagLibraryInfo, к которому мы принадлежим.
Возвращает: экземпляр библиотеки тэгов, к которому мы принадлежим.
public java.lang.String getTagName()
Имя тэга.
Возвращает: (краткое) имя тэга.
public TagVariableInfo[] getTagVariableInfos()
Получает объекты TagVariableInfo, ассоциированные с этим TagInfo.
Возвращает: объект TagVariableInfo, ассоциированный с этим объектом.
public VariableInfo[] getVariableInfo(TagData data)
Информация об объектах скриптинга, созданных этим тэгом на этапе прогона/runtime. Это удобный метод в ассоциированном классе TagExtraInfo. По умолчанию null, если тэг не имеет атрибута “id”, иначе - {“id”, Object}
Параметры:
data - TagData, описывающие данную акцию.
Возвращает: массив элементов VariableInfo.
public booleanisValid(TagData data)
Проверка атрибутов на этапе трансляции. Это удобный метод в ассоциированном классе TagExtraInfo.
Параметры:
data - экземпляр TagData времени трансляции.
Возвращает: верны ли данные.
public void setTagExtraInfo(TagExtraInfo tei)
Набор экземпляров для дополнительной информации тэга.
Параметры:
tei - экземпляр TagExtraInfo.
public void setTagLibrary(TagLibraryInfo tl)
Устанавливает свойство TagLibraryInfo. Заметьте, что элемент TagLibraryInfo зависит не просто от информации TLD, но также и от специфики используемого экземпляра taglib. Это означает, что некоторая работа должна быть проделана для конструирования и инициализации объектов TagLib. Если использовать аккуратно, этот setter поможет исключить необходимость создания новых элементов TagInfo для каждой директивы taglib.
Параметры:
tl - назначаемый TagLibraryInfo.
public java.lang.String toString()
Строго для целей отладки ...
Переопределяет: java.lang.Object.toString() в классе java.lang.Object
JSP.10.5.3 TagAttributeInfo
Синтаксисpublic class TagAttributeInfo
Описание
Информация об атрибуте тэга, доступная во время трансляции. Этот класс инстанциируется из файла TLD. Сюда включается только информация, необходимая для генерации кода. Друга информация типа SCHEMA для проверки выводится в других местах.
JSP.10.5.3.22 Поля
public static final java.lang.String ID
“id” окружается, чтобы стать ID. Реально это не даёт преимущества, поскольку
IDREF не обрабатываются раздельно.
JSP.10.5.3.23 Конструкторы
public TagAttributeInfo(java.lang.String name, boolean required, java.lang.String type, boolean reqTime)
Конструктор для TagAttributeInfo. Этот класс инстанциируется только из кода TagLibrary по запросу из некоторого JSP-кода, разбирающего TLD.
Параметры:
name - имя атрибута.
required - необходим ли атрибут в экземплярах тэга.
type - имя типа атрибута.
reqTime - содержит ли данный атрибут Attribute времени запроса.
JSP.10.5.3.24 Методы
public booleancanBeRequestTime()
Может ли данный атрибут содержать значение времени запроса.
Возвращает: может ли данный атрибут содержать значение времени запроса.
public static TagAttributeInfo getIdAttribute(TagAttributeInfo[] a)
Удобный static-метод, проходящий по массиву объектов TagAttributeInfo и ищущий “id”.
Параметры:
a - массив TagAttributeInfo.
Возвращает: ссылку на TagAttributeInfo с именем “id”.
public java.lang.String getName()
Имя этого атрибута.
Возвращает: имя атрибута.
public java.lang.String getTypeName()
Тип (как String) этого атрибута.
Возвращает: тип атрибута.
public booleanisRequired()
Необходим ли данный атрибут.
Возвращает: необходим ли данный атрибут.
public java.lang.String toString()
Переопределяет: java.lang.Object.toString() в классе java.lang.Object
JSP.10.5.4 PageData
Синтаксисpublic abstract class PageData
Описание
Информация времени трансляции о JSP-странице. Информация соответствует XML-просмотру JSP-страницы.
Объекты этого типа генерируются JSP-транслятором, например, при передаче экземпляру TagLibraryValidator.
JSP.10.5.4.25 Конструкторы
public PageData()
JSP.10.5.4.26 Методы
public abstract java.io.InputStream getInputStream()
Возвращает поток ввода в XML-просмотре JSP-страницы. Вызывает XML-просмотр JSP-страницы, который содержит развёрнутые директивы include.
Возвращает: поток ввода документа.
JSP.10.5.5 TagLibraryValidator
Синтаксисpublic abstract class TagLibraryValidator
Описание
Класс проверщика этапа трансляции для JSP-страницы. Проверщик оперирует документом XML, ассоциированным с JSP-страницей. TLD-файл ассоциирует класс TagLibraryValidator и некоторые init-аргументы с библиотекой тэгов.
JSP-контейнер отвечает за размещение соответствующих объектов соответствующего подкласса через:
новый экземпляр fresh или через использование имеющегося экземпляра;
вызов метода setInitParams(Map) в экземпляре после инициализации, метод validate(String, String, PageData) будет вызван там, где первые два аргумента - это prefix и uri, используемые в директиве taglib.
Экземпляр TagLibraryValidator может создавать вспомогательные объекты внутри для выполнения проверки (например, проверщик XSchema) и может использовать их для всех страниц в ходе данной трансляции.
JSP-контейнер не сериализует гарантированно вызовы метода validate(), и TagLibraryValidator'ы должны выполнять синхронизацию, которая может потребоваться.
JSP-контейнер может по выбору поддерживать атрибут jsp:id для предоставления качественной проверки ошибок. Если такая поддержка имеется, контейнер будет отслеживать JSP-страницы, передаваемые контейнеру, и будет назначать каждому элементу уникальный “id”, который передаётся как значение атрибута jsp:id. Каждый элемент XML, доступный в XML-просмотре, будет расширен этим атрибутом.
TagLibraryValidator может затем использовать этот атрибут в одном или более объектах ValidationMessage. Контейнер тогда, в свою очередь, может использовать эти значения для предоставления более точной информации о местонахождении ошибки.
JSP.10.5.5.27 Конструкторы
public TagLibraryValidator()
JSP.10.5.5.28 Методы
public java.util.Map getInitParameters()
Получает данные init-параметров как неизменяемую Map/Карту. Имена параметров это ключи, а значения параметров - это значения.
Возвращает: параметры init как неизменяемую карту.
public void release()
Высвобождает любые данные, хранимые этим экземпляром, с целью проверки.
public void setInitParameters(java.util.Map map)
Устанавливает данные init в TLD для этого проверщика. Имена параметров это ключи, а значения параметров - это значения.
Параметры:
initMap - карта, описывающая параметры init.
public ValidationMessage[] validate(java.lang.String prefix, java.lang.String uri, PageData page)
Проверяет JSP-страницу. Будет вызван однократно на каждую директиву в JSP-странице. Этот метод возвратит null, если страница верна/valid; иначе метод должен возвратить массив объектов ValidationMessage. Массив нулевой длины также интерпретируется как отсутствие ошибок.
Параметры:
prefix - значение аргумента prefix в директиве.
uri - значение аргумента uri в директиве.
thePage - JspData-объект страницы.
Возвращает: null-объект, или массив нулевой длины при отсутствии ошибок, или массив объектов ValidationMessages.
JSP.10.5.6 ValidationMessage
Синтаксисpublic class ValidationMessage
Описание
Сообщение о проверке из TagLibraryValidator. JSP-может (по выбору) поддерживать атрибут jsp:id для предоставления качественной проверки ошибок. Если такая поддержка имеется, контейнер будет отслеживать JSP-страницы, передаваемые контейнеру, и будет назначать каждому элементу уникальный “id”, который передаётся как значение атрибута jsp:id. Каждый элемент XML, доступный в XML-просмотре, будет расширен этим атрибутом. TagLibraryValidator может затем использовать этот атрибут в одном или более объектах ValidationMessage. Контейнер тогда, в свою очередь, может использовать эти значения для предоставления более точной информации о местонахождении ошибки.
JSP.10.5.6.29 Конструкторы
public ValidationMessage(java.lang.String id, java.lang.String message)
Создаёт ValidationMessage. String сообщения должна быть не-null. Значение id может быть null, если сообщение не специфично для XML-элемента или если не были переданы никакие атрибуты jsp:id. Если не-null, значение id обязано быть значением атрибута jsp:id для PageData, передаваемым в метод validate().
Параметры:
id - либо null, либо значение атрибута jsp:id.
message - локализованное сообщение о проверке.
JSP.10.5.6.30 Методы
public java.lang.String getId()
Получает jsp:id.
null означает, что нет доступной информации.
Возвращает: jsp:id-информацию.
public java.lang.String getMessage()
Получает локализованное сообщение о проверке.
Возвращает: сообщение о проверке.
JSP.10.5.7 TagExtraInfo
Синтаксисpublic abstract class TagExtraInfo
Описание
Класс по выбору, предоставляемый автором библиотеки тэгов для описания дополнительной информации времени трансляции, не указанной в TLD. Класс TagExtraInfo упоминается в файле TLD.
Этот класс может использоваться:
для указания на то, что тэг определяет переменные скриптинга;
для выполнения проверки атрибутов тэга на этапе трансляции .
JSP-транслятор отвечает за то, чтобы начальное значение, возвращаемое в вызове getTagInfo(), соответствовало объекту TagInfo транслируемого тэга. Если выполняется явный вызов setTagInfo(), тогда передаваемый объект будет возвращён в последующих вызовах getTagInfo().
Единственный способ повлиять на значение, возвращаемое методом getTagInfo(), - через вызов setTag-Info() и, следовательно, TagExtraInfo.setTagInfo() вызывается JSP-транслятором с объектом TagInfo, который соответствует транслируемому тэгу. Это должно происходить до любого вызова isValid() и до любого вызова getVariableInfo().
JSP.10.5.7.31 Конструкторы
public TagExtraInfo()
JSP.10.5.7.32 Методы
public final TagInfo getTagInfo()
Получает TagInfo для этого класса.
Возвращает: экземпляр taginfo, расширяемый данным экземпляром.
public VariableInfo[] getVariableInfo(TagData data)
Информация о переменных скриптинга, определённых тэгом, ассоциированным с данным экземпляром TagExtraInfo. Атрибуты времени запроса указаны как таковые в параметре TagData.
Параметры:
data - экземпляр TagData.
Возвращает: массив данных VariableInfo.
public boolean isValid(TagData data)
Проверка атрибутов на этапе трансляции. Атрибуты времени запроса указаны как таковые в параметре TagData.
Параметры:
data - экземпляр TagData.
Возвращает: верен ли этот экземпляр тэга.
public final void setTagInfo(TagInfo tagInfo)
Устанавливает TagInfo для данного класса.
Параметры:
tagInfo - TagInfo, расширяемая этим экземпляром.
JSP.10.5.8 TagData
Синтаксисpublic class TagData implements java.lang.Cloneable
Все Реализованные Интерфейсы: java.lang.Cloneable
Описание
Информация (только времени трансляции) атрибута/значения для экземпляра тэга. TagData используется только в качестве аргумента методов isValid и getVariableInfo
в TagExtraInfo, которые вызываются во время трансляции.
JSP.10.5.8.33 Поля
public static final java.lang.Object REQUEST_TIME_VALUE
Значение, отличное от атрибута, для указания, что его (атрибута) значение является выражением времени запроса (которое ещё не доступно, поскольку экземпляры TagData используются на этапе трансляции).
JSP.10.5.8.34 Конструкторы
public TagData(java.util.Hashtable attrs)
Конструктор для TagData. Если Вы уже имеете атрибуты в хэш-таблице, используйте этот конструктор.
Параметры:
attrs - хэш-таблица для получения из неё значений.
public TagData(java.lang.Object[][] atts)
Конструктор для TagData.
Типичный конструктор может быть таким:
static final Object[][] att = {{“connection”, “conn0”},
{“id”, “query0”}};
static final TagData td = new TagData(att);
Значения обязаны быть String, за исключением тех, которые содержат известные объекты REQUEST_TIME_VALUE.
Параметры: atts - статические атрибут и значения. Может быть null.
JSP.10.5.8.35 Методы
public java.lang.Object getAttribute(java.lang.String attName)
Значение атрибута. Содержит известный объект REQUEST_TIME_VALUE, если значение является значением этапа запроса. Возвращает null, если атрибут не установлен.
Возвращает: объект значения атрибута.
public java.util.Enumeration getAttributes()
Перечисляет атрибуты.
Возвращает: перечисление атрибутов в TagData.
public java.lang.String getAttributeString(java.lang.String attName)
Получает значение для данного атрибута.
Возвращает: строка значений атрибута.
public java.lang.String getId()
Значение атрибута id, если имеется.
Возвращает: значение атрибута id или null.
public void setAttribute(java.lang.String attName, java.lang.Object value)
Устанавливает значение атрибута.
Параметры:
attName - имя атрибута.
value - значение.
JSP.10.5.9 VariableInfo
Синтаксисpublic class VariableInfo
Описание
Информация о переменных скриптинга, которые создаются/модифицируются тэгом (на этапе прогона). Эта информация предоставляется классами TagExtraInfo и используется фазой трансляции JSP.
Переменные скриптинга, генерируемые специальной акцией, могут иметь значения области видимости page, request, session и application.
Имя класса (VariableInfo.getClassName) в возвращаемых объектах может использоваться для определения типов переменных скриптинга. В связи с этим специальная акция не может создавать переменную скриптинга примитивного/базового типа. Чтобы обойти это, используйте “boxed/боксовые” типы.
Имя класса может быть Полным Квалифицированным Именем Класса, или кратким именем класса.
Если предоставляется Полное Квалифицированное Имя Класса, оно должно ссылаться на класс, находящийся в CLASSPATH для Web-Приложения (см. спецификацию Servlet 2.3 - как правило это WEB-INF/lib и WEB-INF/classes). Невыполнение этого приводит к ошибке времени трансляции.
Если дано краткое имя класса в объектах VariableInfo, тогда имя класса обязано быть именем public-класса в контексте директив import страницы, на которой специальная акция появилась (будет проверяться, имеется ли словоблудие JLS для ссылки на него). Класс обязан также быть в CLASSPATH для Web-Приложения (см. спецификацию Servlet 2.3 - как правило это WEB-INF/lib и WEB-INF/classes). Невыполнение этого приводит к ошибке времени трансляции.
Использование Комментариев
Часто полное квалифицированное имя класса ссылается на класс, который известен библиотеке тэгов и, следовательно, находится в том же JAR-файле, что и обработчики тэгов. В большинстве других случаев оно ссылается на класс, который находится на платформе, на которой построен JSP-процессор (типа J2EE).
Употребление полных квалифицированных имён в такой манере делает их использование относительно устойчивым к ошибкам конфигурации.
Краткое имя обычно генерируется библиотекой тэгов на базе некоторых атрибутов, передаваемых от пользователя специальной акции (автора), и это, соответственно, менее надёжно: например, отсутствие директивы import в ссылающейся JSP-странице приведёт к неверному краткому имени класса и к ошибке трансляции.
Протокол Синхронизации
Результатом вызова getVariableInfo является массив объектов VariableInfo. Каждый такой объект описывает переменную скриптинга, предоставляя её имя, тип, указывая, является ли переменная новой или нет, и какова её область видимости. Область видимости лучше видна на рисунке:

Спецификация JSP 1.2 определяет интерпретацию трёх значений:
NESTED, если переменная скриптинга доступна между начальным и конечным тэгами акции, которая определяет её.
AT_BEGIN, если переменная скриптинга доступна из начального тэга акции, которая определяет её, до достижения предела видимости.
AT_END, если переменная скриптинга доступна после конечного тэга акции, которая определяет её, до достижения предела видимости.
Значение области видимости переменной предполагает, какие методы влияют на значение и, следовательно, где нужна синхронизация:
для NESTED, после doInitBody и doAfterBody для обработчика тэга, реализующего BodyTag, и после doStartTag - в противном случае.
для AT_BEGIN, после doInitBody, doAfterBody и doEndTag для обработчика тэга, реализующего BodyTag, и doStartTag и doEndTag - в противном случае.
для AT_END, после метода doEndTag.
Информация о Переменной в TLD
Информация переменной скриптинга может быть также непосредственно кодирована для большинства случаев в Tag Library Descriptor путём использования субэлемента
JSP.10.5.9.36 Поля
public static final int AT_BEGIN
Информация области видимости о том, что переменная скриптинга видна после начального тэга.
public static final int AT_END
Информация области видимости о том, что переменная скриптинга видна после конечного тэга.
public static final int NESTED
Информация области видимости о том, что переменная скриптинга видна только между начальным/конечным тэгами.
JSP.10.5.9.37 Конструкторы
public VariableInfo(java.lang.String varName, java.lang.String className, boolean declare, int scope)
Конструктор. Эти объекты могут быть созданы (на этапе трансляции) экземплярами TagExtraInfo.
Параметры:
id - имя переменной скриптинга.
className - имя переменной скриптинга (наверное, класса??).
declare - если true, это новая переменная (в некоторых языках это требует объявления).
scope - обозначение лексической области видимости переменной.
JSP.10.5.9.38 Методы
public java.lang.String getClassName()
public boolean getDeclare()
public int getScope()
public java.lang.String getVarName()
JSP.10.5 Классы Времени Трансляции
Следующие классы используются на этапе трансляции.
Tag-отображение, Tag-имя
Директива taglib вводит библиотеку тэгов и ассоциирует с ней префикс. TLD, ассоциированный с библиотекой, ассоциирует классы обработчика Tag (плюс другая информация) с именами тэгов. Эта информация используется для ассоциирования Tag-класса, префикса и имени с каждым элементом специальной акции, появляющимся на JSP-странице.
На этапе выполнения реализация JSP-страницы будет использовать доступный экземпляр Tag с соответствующими установками свойств, а затем следовать протоколу, описанному интерфейсами Tag, IterationTag, BodyTag и TryCatchFinally. Реализация гарантирует, что все экземпляры обработчика тэга инициализируются и высвобождаются, но реализация может принимать, что предыдущие установки сохраняются обработчиком тэга, чтобы уменьшить затраты на этапе прогона.
Переменные Скриптинга
JSP поддерживает переменные скриптинга, которые могут объявляться внутри одного скриптлета и использоваться в другом. JSP-акции также можно использовать для определения переменных скриптинга, чтобы использовать их затем в элементах скриптинга или в других акциях. Это особенно применимо в некоторых случаях; например, стандартная акция jsp:useBean может определять объект, который позднее используется через переменную скриптинга.
В некоторых случаях информация переменных скриптинга может быть описана непосредственно в TLD, используя элементы. Особый случай - типичная итерация атрибута "id“. В других случаях логика, определяющая определение экземпляром акции переменной скриптинга, может быть довольно сложной, и имя класса TagExtraInfo используется вместо данного в TLD. Метод getVariableInfo этого класса используется во время трансляции для получения информации о каждой переменной, которая будет создана во время запроса, когда данная акция выполняется. Метод передаётся в TagDat-экземпляр, содержащий значения атрибутов времени трансляции.
Проверка/Validation
TLD-файл содержит несколько частей информации, которая используется для проверки синтаксиса на этапе трансляции. Он содержит также два расширяемых механизма проверки: класс TagLibraryValidator может использоваться для проверки всей JSP-страницы, а класс TagExtraInfo может использоваться для проверки специфической акции. В некоторых случаях дополнительная проверка на этапе запроса будет выполняться динамически внутри методов в экземпляре Tag. Если обнаружена ошибка, может быть вызван экземпляр JspTagException. Если ошибка не выловлена, этот объект будет вызывать механизм errorpage JSP.
TagLibraryValidator является дополнением к спецификации JSP 1.2 и заканчивается очень открыто, будучи значительно более мощным, чем механизм TagExtraInfo. JSP-страница представляется через объект PageData, который абстрагирует XML-просмотр JSP-страницы. Экземпляр PageData будет предоставлять InputStream (только для чтения) в странице. Последующие спецификации могут добавить другие просмотры страницы (DOM, SAX, JDOM являются кандидатами). В настоящее время эти просмотры могут генерироваться из InputStream и, возможно, кэшироваться для повышения производительности (вызов просмотра страницы делается "только для чтения").
JSP-контейнер может по выбору поддерживать атрибут jsp:id для более качественной проверки ошибок. Если атрибут поддерживается, контейнер будет отслеживать JSP-страницы по мере передачи контейнеру и назначать каждому элементу уникальный идентификатор “id”, который передаётся как значение атрибута jsp:id. Каждый XML-элемент, доступный в XML-просмотре, будет расширен этим атрибутом. TagLibraryValidator может затем использовать этот атрибут в одном или более объектах ValidationMessage. Затем контейнер, в свою очередь, может использовать эти значения для предоставления более точной информации о местонахождении ошибки.
Детали Проверки
Более детально, проверка выполняется так:
Во-первых, JSP-страница разбирается с использованием информации в TLD. На этом этапе проверяются атрибуты - мандатные и по выбору/optional.
Во-вторых, для всех директив taglib страницы, в лексическом порядке их появления, вызывается класс их ассоциированного проверщика (если имеется). Это вызывает выполнение нескольких дополнительных шагов.
Первый шаг выполняется для получения инициализированного экземпляра проверщика путём, либо:
конструирования нового экземпляра и вызова в нём setInitParameters(), либо
получения существующего объекта, который не используется, вызова в нём release() и вызова следом в нём же setInitParameters(), либо
локализации существующего объекта, который не используется, в котором необходимый setInitParameters() уже вызван.
Имя класса - такое, какое указано в элементе
Второй дополнительный шаг выполняет реальную проверку. Это делается через вызов метода validate() с префиксом, uri и PageData, которые соответствуют проверяемому экземпляру директивы taglib и PageData, представляющему эту страницу.
Последний дополнительный шаг вызывает метод release() в тэге проверщика, когда он уже больше не нужен.
Этот метод освобождает все ресурсы.
Наконец, после проверки всех классов проверщика библиотеки тэгов, классы TagExtraInfo для всех тэгов будут проверяться вызовом их метода isValid. Порядок вызова этого метода не определён.
JSP.2.1.3 Фазы Трансляции и Выполнения
JSP-контейнер обслуживает две фазы существования JSP-страницы. В фазе трансляции контейнер определяет класс реализации JSP-страницы, соответствующий JSP-странице. В фазе выполнения контейнер обслуживает один или более экземпляров этого класса в ответ на запрос и другие события.Во время фазы трансляции контейнер локализует или создаёт класс реализации JSP-страницы, соответствующий данной JSP-странице. Этот процесс определяется семантикой JSP-страницы. Контейнер интерпретирует имеющиеся на этой странице стандартные директивы и акции и специальные акции, ссылающиеся на библиотеки тэгов. Библиотека тэгов может по выбору представлять метод проверки корректности использования на JSP-странице данной библиотеки.
JSP-контейнер гибко работает с деталями класса реализации JSP-страницы, что может использоваться для адресации вопросов quality-of-service/качества-сервиса.
В фазе выполнения
JSP-контейнер направляет события объекту реализации JSP-страницы. Контейнер отвечает за инициацию объектов request и response и вызов подходящего объекта реализации JSP-страницы.
По окончании процессинга, объект response получается контейнером для соединения с клиентом.
Детали соглашения/контракта между классом реализации JSP-страницы и JSP-контейнером описаны в .
Трансляция JSP-страницы-источника в класс её реализации может произойти в любой момент между начальной публикацией JSP-страницы в JSP-контейнер и получением и процессингом запроса клиента для целевой JSP-страницы. В Разделе описывается выполнение фазы трансляции перед публикацией.
JSP.2.1.5 Компилирование Страниц JSP
JSP-страница может быть откомпилирована в свой класс реализации, плюс информация публикации в процессе создания (JSP-страница может также компилироваться в процессе публикации).Таким способом утилиты авторизации JSP-страниц и библиотеки тэгов JSP могут использоваться для создания сервлетов. Преимущества этого подхода таковы:
Компиляция JSP-страницы в контексте web-приложения предоставляет разрешение спецификаций относительных URL в директивы include (и в другом месте), ссылок на taglib и акции времени трансляции, используемых в специальных акциях.
JSP-страница может также компилироваться во время публикации.
JSP.2.1.5.1 Упаковка Страницы JSP
Когда класс реализации JSP-страницы зависит от поддержки классов (в дополнение к классам JSP 1.2 и Servlet 2.3), классы поддержки включаются в упакованный WAR-файл (как определено в спецификации Servlet 2.3) для обеспечения переносимости по JSP-контейнерам.
В Приложении есть два примера упаковки JSP-страниц в WAR'ы:
В информации для публикации указаны необходимые поддерживающие классы и отображение между путём оригинального URL в JSP-страницу и URL для класса реализации этой JSP-страницы.
JSP.2.1.7 Соглашение по Именованию для Файлов JSP
JSP-страница упаковывается в один или более файлов, часто - как web-приложение, и направляется утилите типа JSP-контейнера, J2EE-контейнера или IDE. Полная JSP-страница может содержаться в одном файле. В других случаях основной файл содержит другие файлы, которые содержать полные JSP-страницы или включаемые фрагменты.Утилиты обычно требуют отделения файлов JSP-страницы от других файлов. В некоторых случаях утилиты также требуют отделения файлов верхнего уровня/top JSP от включаемых фрагментов. Например, если фрагмент может не быть правильной JSP-страницей и может не компилироваться соответствующим образом.
Определение типа файла также часто практикуется на уровне документации и обслуживания, как должно быть уже известно тем, кто работает с соглашениями “.c” и “.h” языка C.
Спецификация Servlet 2.3 использует расширение “.jsp” для обозначения JSP-страницы, но не дифференцирует основные JSP-файлы и включаемые фрагменты.
Мы рекомендуем (но не обязываем), чтобы:
JSP.2.1 Что такое Страница JSP?
JSP-страница это текстовый документ, который описывает, как создавать объект responseиз объекта request для данного протокола. Процессинг JSP-страницы может включать создание и/или использование других объектов.
JSP-страница определяет класс реализации JSP-страницы который реализует семантику JSP-страницы. Этот класс является подклассом Servlet'а (см. ). Во время запроса, запрос, предназначенный для JSP-страницы, направляется объекту реализации JSP-страницы для обработки/процесинга.
HTTP является протоколом по умолчанию для запросов и ответов. Дополнительные протоколы запроса/ответа могут поддерживаться JSP-контейнерами (см. ниже). Объекты request и response по умолчанию имеют тип HttpServletRequest и HttpServletResponse, соответственно.
JSP.2.10.1 Директива page
Директива page определяет количество свойств страницы и сообщает о них JSP-контейнеру.Трансляционный модуль (JSP файл-источник и любые файлы, включённые директивой include) может содержать более одного экземпляра директивы page, все атрибуты будут применяться ко всему трансляционному модулю (т.е. директивы page не зависят от позиции). Однако должно быть только одно вхождение любого атрибута/значения, определённого этой директивой, в данном трансляционном модуле, исключая атрибут “import”; многократные использования этого атрибута накапливаются (с семантикой объединения упорядоченного набора/ordered set union). Другие такие множественные (пере)определения атрибута/значения приводят к фатальной ошибке трансляции. Пространство имён attribute/value зарезервировано для использования данной и последующими спецификациями JSP.
Нераспознаваемые атрибуты или значения приводят к фатальным ошибкам трансляции.
Примеры
Следующая директива предоставляет некоторую видимую пользователем информацию на данной JSP-странице:
<%@ page info=”my latest JSP Example” %>
Следующая директива запрашивает отсутствие буферизации, указывает, что страница является "безопасным потоком"/thread safe и предоставляет страницу для сообщений об ошибке:
<%@ page buffer=”none” isThreadSafe=”yes” errorPage=”/oops.jsp” %>
Следующая директива указывает, что язык скриптинга базируется на Java, что типы, объявленные в пакете com.myco, непосредственно доступны коду скриптинга и что должна использоваться буферизация в 16KB:
<%@ page language=”java” import=”com.myco.*” buffer=”16kb” %>
Синтаксис
<%@ page
список_атрибутов_директивы_page %>
список_атрибутов_директивы_page ::= { language=”scriptingLanguage\языкСкриптинга”}
{ extends=”className”}
{ import=”importList”}
{ session=”true|false” }
{ buffer=”none|sizekb” }
{ autoFlush=”true|false” }
{ isThreadSafe=”true|false” }
{ info=”info_text” }
{ errorPage=”error_url” }
{ isErrorPage=”true|false” }
{ contentType=”ctinfo” }
{ pageEncoding=”peinfo”
Далее дана детальная информация об атрибутах:
Таблица JSP.2-1
| language | Определяет язык скриптинга, используемый в скриптлетах, скриптлетах выражений и объявлениях внутри тела трансляционного модуля (JSP-страница любые файлы, включённые с использованием последующей директивы include). В JSP 1.2 единственным определённым и необходимым для данного атрибута значением языка скриптинга является “java”. Данная спецификация описывает семантику только для скриптов со значением атрибута языка “java”. Если “java” является значением языка скриптинга, фрагменты исходного кода Java Programming Language, используемые внутри данного трансляционного модуля, должны соответствовать спецификации Java Programming Language Specification так, как описано в . Все языки скриптинга обязаны предоставлять неявные объекты, которые автор JSP-страниц может использовать в объявлениях, скриптлетах и выражениях. Специфические объекты, которые могут использоваться, определены в , “Неявные Объекты.” Все языки скриптинга обязаны поддерживать Java Runtime Environment (JRE)/Среду Java. Все языки скриптинга обязаны представлять объектную модель технологии Java окружению скрипта, особенно неявные переменные, свойства компонентов JavaBeans и публичные методы. Будущие версии спецификации JSP могут определять дополнительные значения атрибута language, и все такие значения резервируются. Для директивы с атрибутом language не-”java” будет фатальной ошибкой появление после первого вычисленного элемента скриптинга. |
| extends | Значением является полное квалифицированное имя класса языка программирования Java, которое именует суперкласс класса, к которому JSP-страница трансформируется (см. ). Этот атрибут не должен использоваться без тщательного учёта ограничения им способности JSP-контейнера предоставлять специализированные суперклассы, которые могут улучшить качество службы представления. См. в Разделе альтернативный способ ввода объектов на JSP-страницу, не имеющий такого недостатка. |
| import | Атрибут import описывает типы, которые доступны среде скриптинга. Значение - такое же, как для объявления import в языке программирования Java, т.е. список (разделённых запятыми) полных квалифицированных имён типов языка программирования Java, обозначающих этот тип, или имя пакета с последующей строкой “.*”, обозначающей все публичные типы, объявленные в этом пакете. Список import должен будет импортироваться транслируемой реализацией транслируемой JSP-страницы и будет, таким образом, доступен среде скриптинга. По умолчанию список импорта - java.lang.*, javax.servlet.*, javax.servlet.jsp.* и javax.servlet.http.*. В настоящее время это значение определено только тогда, когда значением директивы language является “java”. |
| session | Означает, что данная страница требует участия в (http) сессии. Если “true”, тогда неявная переменная языка скрипта с названием “session” типа javax.servlet.http.HttpSession ссылается на текущую/новую сессию для этой страницы. Если “false” - тогда эта страница не участвует в сессии; неявная переменная “session” недоступна, и любая ссылка на неё в теле JSP-страницы является недопустимой и приводит к фатальной ошибке трансляции. По умолчанию “true”. |
| buffer | Специфицирует модель буферизации для начального “out” JspWriter для обработки содержимого вывода с этой страницы. Если “none”, тогда буферизации нет и весь вывод записывается непосредственно в ServletResponse PrintWriter. Размер может специфицироваться только в килобайтах, и суффикс “kb” является мандатным (обязательным). Если размер буфера специфицирован, тогда вывод буферизуется с размером буфера не меньше специфицированного. В зависимости от значения атрибута “autoFlush”, содержимое этого буфера автоматически очищается, или возникает исключение при появлении переполнения. По умолчанию буферизуется с размером буфера реализации не менее 8kb. |
| autoFlush | Специфицирует, должен ли буферизованный вывод очищаться автоматически (значение “true”), когда буфер заполнен, или должно вызываться исключение/exception (значение “false”), означающее переполнение буфера. По умолчанию “true”. Примечание: не допускается установка autoFlush в “false”, если “buffer=none”. |
| isThreadSafe | Обозначает уровень потока, безопасно выполняемого на странице. Если “false” - тогда JSP-контейнер должен выполнять диспетчеризацию множественных внешних запросов клиентов, по одному за раз в порядке их поступления, реализации страницы для процессинга. Если “true”, тогда JSP-контейнер может избрать одновременное направление странице множественных внешних запросов клиентов. Авторы страниц, использующие “true”, должны быть уверены, что осуществляется соответствующая синхронизация доступа к странице. По умолчанию “true”. Заметьте, что, даже если атрибут isThreadSafe имеет значение “false”, автор JSP-страницы должен иметь уверенность, что доступы к любым объектам раздельного использования/shared соответствующим образом синхронизированы. Объекты могут использоваться раздельно в ServletContext или в HttpSession. |
| info | Определяет произвольную строку, которая внедряется в транслируемую страницу, которая затем может быть получена из реализации страницы методом Servlet.getServletInfo(). |
| isErrorPage | Указывает, предназначена ли текущая JSP-страница служить целевым URL для другой JSP-страницы как errorPage. Если “true”, тогда неявная переменная языка скриптинга “exception” определяется и её значением является ссылка на нарушающий Throwable из исходной JSP-страницы, в случае ошибки. Если “false” - неявная переменная “exception” недоступна, и любая ссылка на неё в теле JSP-страницы является недопустимой и приведёт к фатальной ошибке трансляции. По умолчанию “false”. |
| errorPage | Определяет URL ресурса, которому любой объект(ы) Throwable языка программирования Java, вызываемый, но не отлавливаемый реализацией страницы, направляется для обработки ошибки. Спецификация предоставляемого URL выполняется так, как указано в . Если URL именует другую JSP-страницу, тогда неявная переменная скрипта вызываемого исключения этой JSP-страницы содержит ссылку на начальный неотловленый Throwable. URL по умолчанию зависит от реализации. Обратите внимание, что объект Throwable передаётся реализацией страницы, вызывающей исключение/throwing, реализации страницы ошибки, сохраняя ссылку на объект в обычном объекте ServletRequest путём использования метода setAttribute(), с именем “javax.servlet.jsp.jspException”. Примечание: если autoFlush=true, то, если содержимое начального Jsp-Writer было очищено для потока вывода ServletResponse, любая последующая попытка диспетчеризации неотловленного исключения из страницы-нарушителя странице errorPage может потерпеть неудачу. Если страница обработки ошибок указана также в дескрипторе web.xml, то сначала применяется JSP-страница обработки ошибок, а затем страница web.xml. |
| contentType |
Определяет кодировку символов для JSP-страницы и для JSP-страницы - ответа и тип MIME для JSP-страницы - ответа. Значения могут иметь форму “TYPE” или “TYPE; charset=CHARSET” с необязательным пробелом после “;”. CHARSET, если имеется, обязан быть значением IANA для кодировки символов. TYPE это MIME-тип: см. в регистре IANA используемые значения. Для TYPE значение по умолчанию - “text/html”; значение по умолчанию для кодировки символов - ISO-8859-1. См. в детальную информацию о кодировках символов. |
| pageEncoding | Определяет кодировку символов для JSP-страницы. Значения имеют форму “CHARSET”, который обязан быть IANA-значением для кодировки символов. Значение contentType для CHARSET используется по умолчанию, если имеется, в противном случае - ISO-8859-1. См. в детальную информацию о кодировках символов. |
JSP.2.10.2 Директива taglib
Набор значащих тэгов, интерпретируемых JSP-контейнером, может быть расширен “tag library/библиотекой тэгов”. Директива taglib на JSP-странице объявляет, что данная страница использует библиотеку тэгов, уникально идентифицирует библиотеку тэгов, используя URI, и ассоциирует префикс тэгов, который служит для отличения использования акций в этой библиотеке. Если реализация JSP-контейнера не может локализовать описание библиотеки тэгов, должна возникать фатальная ошибка трансляции. Фатальная ошибка трансляции возникнет также, если директива taglib появится после акций, использующих данный префикс.Библиотека тэгов может включать метод проверки корректности использования JSP-страницей функциональности библиотеки тэгов. См. более конкретные детали в . Также см. замечания по реализации в .
Примеры
В следующем примере библиотека тэгов вводится и становится доступной данной странице путём использования префикса super; никакие другие библиотеки тэгов не должны вводиться на данной странице, используя этот префикс. В данном конкретном случае мы принимаем, что библиотека тэгов включает тип элемента doMagic, который используется на странице.
<%@ taglib uri=”http://www.mycorp/supertags” prefix=”super” />
...
...
Синтаксис
<%@ taglib uri=”tagLibraryURI” prefix=”tagPrefix” %>
где атрибуты:
Таблица JSP.2-1
| uri | Спецификация абсолютного или относительного URI, который уникально идентифицирует дескриптор библиотеки тэгов, ассоциированной с данным префиксом. URI используется для локализации описания библиотеки тэгов, как указано в . |
| tagPrefix | Определяет строку prefix в конструкции Использование префиксов, начинающихся с jsp:, jspx:, java:, javax:, servlet:, sun: и sunw:, зарезервировано. Префикс обязан следовать соглашению об именовании, специфицированному в спецификации пространств имён XML. Пустые префиксы в данной версии спецификации не допускаются. |
Фатальная ошибка трансляции возникнет, если транслятор JSP-страницы обнаруживает тэг с именем prefix: Name,
использующий префикс, введённый директивой taglib, и если Name не распознаётся соответствующей библиотекой тэгов.
JSP.2.10.3 Директива include
Директива include используется для подстановки текста и/или кода в JSP-страницу на этапе трансляции.Директива <%@ include file=”спецификация относительного URL” %>
вставляет текст специфицированного ресурса в .jsp-файл. Включённый файл является субъектом контроля доступа, доступного JSP-контейнеру. Атрибут file рассматривается в Разделе . JSP-контейнер может включать механизм уведомления в случае изменения включённого файла, чтобы контейнер мог перекомпилировать эту JSP-страницу, однако спецификация JSP 1.2 не содержит способа указания JSP-контейнеру, что включённые файлы должны изменяться.
Примеры
В следующем примере запрашивается включение на этапе трансляции файла авторских прав/copyright.
Этот файл может содержать элементы, которые также будут обрабатываться:
<%@ include file=”copyright.html” %>
Синтаксис
<%@ include file="спецификация относительного URL" %>
JSP.2.10.4 Включение Данных в Страницы JSP
Включение данных является важной частью задач JSP-страницы. Соответственно, спецификация JSP 1.2 имеет два механизма включения для различных задач. Обобщение их семантики дано в Таблице JSP.2-1.
Таблица JSP.2-1 Обобщение Механизмов include в спецификации JSP 1.2
| <%@ include file=... %> | относительно файла | статический/static | Содержимое разбирается/parsed JSP-контейнером. | |
| относительно страницы | статический и динамический | Содержимое не разбирается; оно вставляется в этом месте. |
Колонка Спецификация описывает, какой тип спецификации является верным для данного элемента. Данная спецификация JSP требует специфицировать относительный URL. Ссылка разрешается сервером web/приложений, и выполняется отображение её URL. Директивы include
интерпретируются относительно текущего JSP-файла; акции jsp:include интерпретируются относительно текущей JSP-страницы. Директива include относится к ресурсу вроде JSP-страницы как к статичному/static объекту; т.е. байты в JSP-странице включаются. Акция include относится к ресурсу вроде JSP-страницы как к динамическому/dynamic объекту; т.е. запрос направляется этому объекту, и результат процессинга включается .
JSP.2.10 Директивы
Директивы являются сообщениями JSP-контейнеру.Синтаксис директивы:
<%@ директива { атрибут=”значение” }* %>
Могут иметься необязательные пробелы после “<%@” и перед “%>”. Это синтаксис легко вводится и понятен, но он несовместим с XML. В описано отображение директив в элементы XML.
Директивы не производят никакого вывода в текущий поток out. Есть три директивы: page и taglib описаны здесь, а директива include - в следующей главе.
JSP.2.11.1 Объявления
Объявления используются для объявления переменных и методов на языке скриптинга, используемого на данной JSP-странице. Объявление должно быть декларативным оператором или последовательность операторов, соответствующей синтаксису специфицированного языка скриптинга.Объявления не производят никакого вывода в текущий поток вывода. Объявления инициализируются в момент инициализации JSP-страницы и становятся доступными другим объявлениям, скриптлетам и выражениям.
Примеры
Например, первое объявление здесь объявляет целое число, глобальное в пределах страницы.
Второе объявление делает то же самое и инициализирует число в нуль. Этот тип инициализации должен выполняться осторожно при наличии нескольких запросов к странице.
В третьем случае объявляется метод, глобальный в пределах страницы.
<%! int i; %>
<%! int i = 0; %>
<%! public String f(int i) { if (i<3) return(“...”); ... } %>
Синтаксис
<%! объявление(-я) %>
JSP.2.11.2 Скриптлеты
Скриптлеты могут содержать любые фрагменты кода, которые являются верными для языка скриптинга, специфицированного директивой language. Является ли фрагмент кода действующим, зависит от деталей языка скриптинга (см. ).Скриптлеты выполняются во время обработки запроса. Производят они вывод в поток вывода или нет, зависит от кода скриптлета.
Скриптлеты могут иметь побочные эффекты, модифицируя объекты, видимые для них. Когда все фрагменты скриптлетов в данном трансляционном модуле комбинируются для появления на JSP-странице, они обязаны давать в результате верный оператор или последовательность операторов на специфицированном языке скриптинга.
Чтобы использовать последовательность символов %> как литеральные символы в скриптлете, вместо того , чтобы они оканчивали скриптлет, вводите их так %\>.
Примеры
Вот простой пример динамического изменения страницы, в зависимости от времени суток.
<% if (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM) {%>
Good Morning
<% } else { %>
Good Afternoon
<% } %>
Скриптлет может также содержать объявление локальных переменных, например, следующий скриптлет просто объявляет и инициализирует целое число и затем отображает это число и увеличивает его.
<% int i; i= 0; %>
Привет, значение i равно <% i++ %>
Синтаксис
<% скриптлет %>
JSP.2.11.3 Выражения
Элемент expression в JSP-странице является выражением языка скриптинга, которое вычисляется, а результат приводится к String. Результат затем посылается в текущий объект вывода JspWriter. Если результат выражения не может быть приведён к String, обязаны выполняться следующие действия:Если проблема обнаружена на этапе трансляции, должна возникать ошибка времени трансляции.
Если приведение не обнаруживается в процессе трансляции, должно вызываться исключение ClassCastException/ОшибкаПриведенияКласса во время запроса.
Язык скриптинга может поддерживать побочные эффекты в выражениях, когда выражение вычисляется.
Выражения вычисляются слева направо на JSP-странице. Если выражения появляется в более чем одном атрибуте времени выполнения, они должны вычисляться слева направо в тэге. Выражение может изменять значение объекта out, хотя это не всегда легко выполнимо. Выражение обязано быть полным выражением языка скриптинга, на котором оно написано.
Выражения вычисляются во время HTTP-процессинга.
Значение выражения конвертируется к String и вставляется в соответствующую позицию в .jsp-файл.
Примеры
Вставляется текущая дата:
<%= (new java.util.Date()).toLocaleString() %>
Синтаксис
<%= выражение %>
JSP.2.11 Элементы Скриптинга/Сценариев
Элементы скриптинга обычно используютсядля манипулирования объектами и для выполнения вычислений, влияющих на генерируемое содержимое.
Есть три класса элементов скриптинга: declarations\объявления, scriptlets\скриптлеты и expressions\выражения. Язык скриптинга, используемый на данной странице, задаётся значением директивы language (см. , "Директива page"). В JSP 1.2 единственным определённым значением является “java”.
Объявления используются для объявления конструкций языка скриптинга, которые доступны всем другим элементам скриптинга.
Скриптлеты используются для описания акций, выполняемых в ответ на некоторый запрос. Скриптлеты являются фрагментами программы, которые также могут использоваться для выполнения действий типа итераций и условного выполнения других элементов на JSP-странице.
Выражения являются сложными выражениями на языке скриптинга, которые вычисляются на этапе ответа; обычно результат конвертируется в строку и вставляется в поток вывода.
Все JSP-контейнеры обязаны поддерживать элементы скриптинга, базирующиеся на языке программирования Java. Кроме того, JSP-контейнеры обязаны поддерживать другие языки скриптинга.
Все такие языки скриптинга обязаны поддерживать:
Точное определение семантики скриптинга, выполняемого с использованием элементов на базе языка Java, дано в .
Семантика других языков скриптинга не определена точно в данной версии спецификации, что означает, что переносимость в разных реализациях не гарантируется. Точные определения могут быть даны для других языков в будущем.
Каждый элемент скриптинга имеет следующий синтаксис на базе “<%”:
<%! это объявление %>
<% это скриптлет %>
<%= это выражение %>
Могут иметься необязательные пробелы после “<%!”, “<%” и “<%=” и до “%>”.
Эквивалентные данным элементам скриптинга элементы XML описаны в .
JSP.2.12 Акции
Акции могут воздействовать на текущий поток вывода и использовать, модифицировать и/или создавать объекты. Акции могут зависеть от деталей конкретного объекта request/запроса, получаемого JSP-страницей.Данная спецификация JSP содержит некоторые акции, которые являются
стандартными и обязаны реализовываться всеми соответствующими JSP-контейнерами; эти акции описываются в .
Новые акции определяются в соответствии с механизмами, описанными в Главах и , и вводятся с использованием директивы taglib.
Синтаксис элементов акций базируется на XML. Акции могут быть пустыми и непустыми.
JSP.2.13.1 Значения Атрибутов Времени Запроса
Значение атрибута в форме “<%= scriptlet_expr %>” или ‘<%= scriptlet_expr %>’ обозначает значение атрибута времени запроса. Указываемое значение является значением включаемого скриптлета. Значения атрибутов времени запроса могут использоваться только в акциях и не могут использоваться в директивах. Если в тэге имеется более одного такого атрибута, выражения вычисляются слева направо.Закавычивание выполняется так же, как и в других значениях атрибута (). Таким способом могут обозначаться только значения атрибута (имя атрибута всегда является явно определённым именем).
Выражение обязано появляться само по себе (множественные выражений и смешивание выражений и строковых констант не допускаются).
Множественные операции обязаны выполняться внутри выражения.
Конверсия типов описана в Разделе . По умолчанию все атрибуты имеют семантику времени трансляции страницы. Попытка специфицировать выражение скриптлета как значение атрибута, который (по умолчанию или нет) имеет семантику времени трансляции, является недопустимой и приводит к фатальной ошибке трансляции.
Тип элемента action указывает, будет ли данный атрибут принимать значения атрибута времени запроса.
Большинство атрибутов стандартных акций из имеют семантику времени трансляции страницы, но следующие атрибуты принимают выражения атрибутов времени запроса:
().
().
JSP.2.13.2 Соглашения о Типах
Мы описываем два случая конверсии типов:JSP.2.13.2.1 Конверсия из Значений String
Значение строки может использоваться для описания значения типа не-String через конверсию. Возможна ли конверсия и, если да, какая она, зависит от типа назначения.
Значения String могут использоваться для присвоения значений типу, который имеет класс PropertyEditor, как указано в спецификации JavaBeans. Если это именно тот случай, используется метод setAs-Text(String).
Конверсия терпит неудачу, если метод вызывает исключение IllegalArgumentException.
Значения String могут также использоваться для присвоения типов, как указано в Таблице JSP.2-2. Применяется так конверсия, которая указана в таблице. Неудача конверсии ведёт к ошибке времени трансляции или времени запроса.
Таблица JSP.2-2 Конверсия из Строковых Значений в Тип Назначения
| Свойство Bean | Использовать setAsText(string-literal) |
| boolean или Boolean | Как указано в java.lang.Boolean.valueOf(String) |
| byte или Byte | Как указано в java.lang.Byte.valueOf(String) |
| char или Character | Как указано в String.charAt(0) |
| double или Double | Как указано в java.lang.Double.valueOf(String) |
| int или Integer | Как указано в java.lang.Integer.valueOf(String) |
| float или Float | Как указано в java.lang.Float.valueOf(String) |
| long или Long | Как указано в java.lang.Long.valueOf(String) |
| short или Short | Как указано в java.lang.Short.valueOf(String) |
| Object | Как если бы new String(string-literal) |
Эти конверсии являются частью общего механизма, используемого для присвоения значений атрибутам акций: когда значение атрибута, который не является атрибутом времени запроса, присваивается данному атрибуту, используется описанная здесь конверсия, использующая тип атрибута как целевой тип. Тип каждого атрибута стандартных акций описан в данной спецификации, а типы атрибутов специальных/custom акций описаны в ассоциированном с ними Дескрипторе Библиотеки Тэгов/Tag Library Descriptor.
Конкретная акция может также определять дополнительные способы использования конверсии типа/значения.
В описан механизм, используемый для стандартной акции setProperty.
JSP.2.13.2.3 Конверсия из Выражений Времени Запроса
Выражения времени запроса могут назначаться свойству любого типа.
Автоматическая конверсия не выполняется.
JSP.2.2.1 Специфицирование Относительных URL
Элементы могут использовать спецификации относительных URL, называемые “URI-пути” в спецификации Servlet 2.3. Эти пути описаны в спецификации RFC 2396. Мы имеем в виду часть path данной спецификации, а не части scheme или authority.Некоторые примеры:
Путь относительно контекста это путь, начинающийся со знака “/”. Он интерпретируется относительно приложения, к которому принадлежит JSP-страница, то есть говорится, что её объект ServletContext предоставляет базовый контекстный URL.
Путь относительно страницы это путь, не начинающийся со знака “/”. Он интерпретируется как относительный к текущей JSP-странице или текущему JSP-файлу, в зависимости от того, где путь используется:
для директивы include (); когда путь используется в атрибуте файла - интерпретация относительно JSP-файла;
для акции jsp:include (), когда путь используется атрибуте страницы - интерпретация относительно JSP-страницы.
В обоих случаях текущая страница (или файл) обозначается некоторой частью пути, начинающейся с “/”, который (путь) затем модифицируется новой спецификацией, производящей путь с начальным “/”.
Новый путь интерпретируется через объект ServletContext. См. точную информацию об этой интерпретации в .
Спецификация JSP универсально интерпретирует пути в контексте web-сервера, где JSP-страница публикуется. Спецификация проходит через отображающую трансляцию. Семантика, обрисованная здесь, применяется к фазе времени трансляции, а не к фазе времени запроса.
JSP.2.2 Web-Приложения
Приложение web это коллекция ресурсов, которые доступны по указанным URL.Web-приложение состоит из следующих компонентов:
Web-приложения описаны более детально в спецификации Servlet 2.3. Web-приложение содержит дескриптор публикации web.xml, содержащий информация о JSP-страницах, сервлетах и других ресурсах, используемых в этом web-приложении. Дескриптор публикации детально описан в спецификации Servlet 2.3.
JSP 1.2 требует, чтобы эти ресурсы были неявно/косвенно ассоциированы с, и доступны через, уникальный экземпляр ServletContext, доступный как неявный объект приложения ().
Приложение, которому принадлежит JSP-страница, отражается в объекте application и влияет на семантику следующих элементов:
JSP 1.2 поддерживает переносимую упаковку и публикацию/deployment web-приложений через спецификацию Servlet 2.3. Спецификация JavaServer Pages наследует от спецификации Servlet концепцию приложений, ServletContext'ы, Sessions/Сессии, Requests/Запросы и Responses/Ответы.
JSP.2.3.1 Элементы и Шаблонные Данные
JSP-страница содержит элементы и шаблонные данные.Элемент является экземпляром типа элемента, известного JSP-контейнеру.
Шаблонные данные это то, о чём JSP-танслятор ничего не знает.
Тип элемента описывает его синтаксис и семантику. Если элемент имеет атрибуты, тип описывает имена, верные типы атрибутов и их интерпретацию. Если элемент определяет объекты, семантика включает эти определяемые объекты и их типы.
JSP.2.3.2 Синтаксис Элемента
Имеются элементы трёх типов: директивы, элементы скриптинга и акции.Директивы
Директивы
предоставляют глобальную информацию, которая концептуально верна, независимо от специфики запроса, полученного JSP-страницей. Директивы предоставляют информацию для фазы трансляции.
Синтаксис элемента-директивы
<%@ директива...%>
Акции
Акции предоставляют информацию для фазы обработки запроса. Интерпретация
акции может, и часто так и бывает, зависеть от специфики запроса, полученного JSP-страницей. Акции могут быть стандартными, то есть определёнными этой спецификацией, или custom/специальными, то есть предоставленными через посредство механизма развёртывания переносимых тэгов.
Элементы action следуют синтаксису XML-элемента: они имеют начальный тэг, включающий имя элемента, и могут иметь атрибуты, необязательное тело/body и соответствующий конечный тэг, или они могут быть пустыми тэгами, возможно, с атрибутами:
и
Элемент имеет тип элемента, описывающий имя его тэга, верные атрибуты и их семантику.
Мы обращаемся к типу по имени его тэга.
JSP-тэги чувствительны к регистру, как в XML и XHTML.
Акция может создавать объекты и делать их доступными элементам скриптинга через
специфические для скриптинга переменные.
Элементы Скриптинга
Элементы Скриптинга являются связкой между шаблонным текстом и акциями.
Есть три типа элементов скриптинга: declarations\объявления, scriptlets\скриптлеты и expressions\выражения.
Объявления имеют синтаксис
<%! ... %>
скриптлеты <% ... %>
выражения
<%= ... %>
JSP.2.3.3 Начальный и Конечный Тэги
Элементы, имеющие разные начальный и конечный тэги (при наличии тела), обязаны иметь начало и конец в одном файле. Стартовый тэг не может быть в одном файле, когда конечный тэг находится в другом файле.То же самое правило применяется к элементам с альтернативным синтаксисом. Например, скриптлет имеет синтаксис <% скриптлет %>. Открывающий <% и закрывающий %> символы обязаны находиться в одном и том же физическом файле.
Язык скриптинга может также вводить ограничения на размещение начальных и конечных тэгов для специфических конструкций скриптинга. Например, в
демонстрируется, как блоки языка Java не могут разделять начальный и конечный тэг; см. детали в .
JSP.2.3.4 Пустые Элементы
Следуя спецификации XML, элемент, описанный с использованием пустого тэга, не отличается от элемента. использующего начальный тэг, пустое тело и конечный тэг.Вот примеры пустых тэгов:
Далее - примеры непустых тэгов:
JSP.2.3.7 Пробелы
В HTML и XML пробел обычно не является значащим, но есть исключения. Например, файл XML может начинаться символамиДанная спецификация следует поведению пробелов, определённому в спецификации XML.
Пробел в теле текста документа не является значащим, но сохраняется.
Далее идут два фрагмента JSP с ассоциированным выводом.
Обратите внимание, что директивы не генерируют никаких данных и применяются глобально к JSP-странице.
Таблица 2.1: Пример 1 - Ввод
| 1 | |
| 2 | <%@ page buffer=”8kb” %> |
| 3 | Здесь - остальная часть документа. |
Результат:
Таблица 2.2: Пример 1 - Вывод
| 1 | |
| 2 | |
| 3 | Здесь - остальная часть документа. |
Следующие две таблицы - другой пример ввода и вывода:
Таблица 2.3: Пример 2 - Ввод
| 1 | <% response.setContentType(“....”); |
| 2 | что-нибудь... %> |
| 3 | <%@ page buffer=”8kb” %> |
| 4 | Здесь - остальная часть документа. |
Результат:
Таблица 2.4: Пример 2 - Вывод
| 1 | |
| 2 | |
| 4 | Здесь - остальная часть документа. |
JSP.2.4.2 Ошибки Процесса Времени Запроса
В процессе обработки запросов клиентов ошибки могут возникать в теле класса реализации JSP-страницы или в каком-либо другом коде (языка Java или других языков программирования реализации), вызываемом из тела класса реализации JSP-страницы.Возникающие ошибки этапа прогона обрабатываются в реализации страницы, используя механизм исключений языка программирования Java для сообщения вызывающему(-им) о нарушениях.
Обратите внимание, что это не зависит от языка программирования. Данная спецификация требует, чтобы о необработанных ошибках, возникающих в среде языка скриптинга, используемого реализацией JSP-контейнера, сообщалось классу реализации JSP-страницы через механизм исключений языка Java.
Эти исключения могут отлавливаться и обрабатываться (как необходимо) в теле класса реализации JSP-страницы. Любые неотловленные исключения, вызываемые в теле класса реализации JSP-страницы, приводят к перенаправлению клиентского запроса и неотловленного исключения по URL errorPage, специфицированному этой JSP-страницей (или выполнением действий по умолчанию, если ничего не специфицировано).
Нарушающее java.lang.Throwable, описывающее появляющуюся ошибку, хранится в экземпляре javax.ServletRequest клиентского запроса, использующего метод setAttribute(), использующего имя “javax.servlet.jsp.jspException”.
Имена, начинающиеся с префиксов “java” и “javax”, зарезервированы различными спецификациями платформы Java. Префикс “javax.servlet”
зарезервирован и используется спецификациями Servlet и JSP.
Если атрибут errorPage директивы страницы именует URL, который ссылается на другую JSP и та JSP сигнализирует, что на странице имеется ошибка (установкой атрибута isErrorPage директивы страницы в true), тогда неявная переменная языка программирования “exception” этой страницы инициализируется ссылкой Throwable-нарушителя.
JSP.2.5.1 Генерирование Комментариев при Выводе Клиенту
Для генерации комментариев, появляющихся в потоке вывода response к запрашивающему клиенту, используется следующий синтаксис комментариев HTML и XML:Такие комментарии рассматриваются JSP-контейнером как неизменяемый шаблонный текст. Если генерируемый комментарий должен содержать динамические данные, это может быть сделано посредством такого синтаксиса:
JSP.2.5.2 Комментарии JSP
JSP-комментарий имеет форму:<%-- что-либо, кроме закрывающих символов --%> ... --%>
Содержимое тела комментария полностью игнорируется. Комментарии используются для документирования, а также для “закомментирования” некоторой части JSP-страницы.
Обратите внимание, что JSP-комментарии не вкладываются.
Альтернативным способом размещения "комментария" на JSP-странице является использование механизма комментария языка скриптинга. Например:
<% /** это комментарий ... **/ %>
JSP.2.6 Соглашения по Кавычкам и Escape-Последовательностям
В JSP-страницах применяются следующие соглашения по кавычкам:Кавычки в Элементах Скриптинга
Литерал %> закавычивается %\>
Кавычки в Шаблонном Тексте
Литерал <% закавычивается <\%
Закавычивание Атрибутов
Закавычивание выполняется независимо от того, является значение атрибута литералом или выражением атрибута этапа запроса. Закавычивание может использоваться в значениях атрибутов независимо от того, ограничены они одинарными или двойными кавычками. Это выполняется только так, как описано ниже:
Примеры
В следующей строке показаны неправильные значения атрибутов:
В следующей строке дан верный скриптлет, но с, возможно, неожиданным результатом. Результат будет “Joe said %\>”, а не “Joe said %>”:
В следующих строках - правильное закавычивание:
<%= "Joe said \"" + joes_statement + "\"." %>
Представление XML
Соглашения по кавычкам отличаются от соглашений XML. См. .
JSP.2.7 Общая Семантика Страницы JSP
Класс реализации JSP-страницыопределяет отображение метода _jspService()из объекта request в объект response. Некоторые детали этой трансформации специфичны для используемого языка скриптинга (см. ). Некоторые детали не зависят от языка и описаны в данной главе.
Содержимое JSP-страницы большей частью описывает данные, которые записываются в поток вывода ответа. (JSP-контейнер обычно посылает эти данные обратно клиенту.) Это описание базируется на объекте JspWriter, который выводится через неявный объект out (см. , “Неявные Объекты).
Его значение варьируется:
JspWriter не буферизуется, тогда содержимое, записанное в него, будет передано прямо в поток вывода ServletResponse.
JSP-страница может также описывать, что должно происходить, когда возникают некоторые конкретные события. В JSP 1.2 могут быть описаны только события инициализации и ликвидации страницы. Эти события описаны с использованием “имён хорошо известных методов” в элементах обявления/declaration. (См. ).
JSP.2.8.1 Объекты и Переменные
Объект может быть сделан доступным для кода в элементах скриптинга через переменную языка скриптинга.Элемент может определять переменные скриптинга, которые будут содержать, в процессе времени запроса, ссылку на объект, определённый этим элементом, хотя могут существовать и другие ссылки, в зависимости от области видимости объекта.
Тип элемента указывает имя и тип таких переменных, хотя в деталях имя переменной может зависеть от Языка Скриптинга.
Язык скриптинга может также влиять на то, как происходит доступ к различным свойствам объекта. Например, в спецификации JavaBeans доступ к свойствам осуществляется через методы
getter
и setter, в то время как эти свойства доступны напрямую как переменные в языке JavaScript™.
Точные правила видимости переменных зависят от языка скриптинга. В
определены правила для случая, когда атрибут language директивы page установлен в “java”.
JSP.2.8.2 Объекты и Область Видимости
JSP-страница может создавать и/или получать доступ к Java-объектам при обработке запроса. Спецификация JSP указывает, что некоторые объекты создаются неявно, возможно, как результат директивы (см. , "Неявные Объекты"). Другие объекты создаются явно через акции или непосредственно путём использования кода скрипта. Созданные объекты имеют атрибут scope, определяющий, где находится ссылка на объект и когдаэта ссылка удаляется.
Созданные объекты могут также непосредственно видимы элементам скриптинга через переменные уровня скриптинга (см. , "Неявные Объекты"). Каждая акция и объявление определяют, как часть своей семантики, какой объект они создают, с каким атрибутом scope и доступны ли они элементам скриптинга.
Объекты создаются внутри экземпляра JSP-страницы, которая отвечает объекту request.
Имеется несколько областей видимости:
page доступны только в пределах страницы, на которой они создаются. Все ссылки на такие объекты должны быть разорваны после того, как response/ответ отослан обратно клиенту из JSP-страницы или запрос направляется куда-либо ещё. Ссылки на объекты с областью видимости page хранятся в объекте pageContext.
request доступны со страниц, обрабатывающих этот же самый запрос там, где они были созданы. Ссылки на такой объект должны быть разорваны после обработки запроса. Конкретнее, если запрос направляется ресурсу на том же самом этапе прогона/runtime, объект остаётся доступным. Ссылки на объекты с областью видимости request
хранятся в объекте request.
session доступны для страниц, обрабатывающих запросы, находящихся в той же сессии, что и страница, на которой они были созданы. Нельзя определять объект с областью видимости session из страницы, которая не находится в данной сессии (см. , "Директива page"). Все ссылки на такой объект должны быть разорваны после того, как ассоциированная сессия закончилась. Ссылки на объекты с областью видимости session хранятся в объекте session, ассоциированном с активацией страницы.
Имя/name должно ссылаться на уникальный объект из всех точек в ходе выполнения, то есть все области видимости должны в действительности вести себя как единое пространство имён. Реализация JSP-контейнера может или может не форсировать это правило явно по соображениям производительности.
JSP.2.8.3 Неявные/Implicit Объекты
Авторы JSP-страниц имеют доступ к определённым неявным (неявно создаваемым) объектам, которые всегда доступны для использования в скриптлетах и выражениях через переменные скриптинга, которые объявляются неявно в начале страницы. Все языки скриптинга должны предоставлять доступ к этим объектам.Неявные объекты доступны обработчикам тэгов через объект pageContext (см. ниже).
Каждый неявный объект имеет тип класса или интерфейса, определённый в основной технологии Java или в пакете Java Servlet API, как показано в Таблице JSP. 2-1.
Таблица JSP.2-1 Неявные Объекты, Доступные в JSP-страницах
| request | подтип, зависящий от протокола: javax.servlet.ServletRequest, например: javax.servlet.http.HttpServletRequest |
Запрос, включающий вызов сервиса/службы. Область видимости: request. |
| response | подтип, зависящий от протокола: javax.servlet.ServletResponse, например: javax.servlet.http.HttpServletResponse |
Ответ на запрос. Область видимости: page. |
| pageContext | javax.servlet.jsp.PageContext | Контекст страницы для данной JSP-страницы. Область видимости: page. |
| session | javax.servlet.http.HttpSession | Объект session, созданный для запрашивающего клиента (если клиент имеется). Эта переменная верна только для протоколов Http. Область видимости: session. |
| application | javax.servlet.ServletContext | Контекст сервлета, полученный из объекта конфигурации сервлета (как при вызове getServletConfig().getContext()) Область видимости: application. |
| out | javax.servlet.jsp.JspWriter | Объект, записывающий в поток вывода. Область видимости: page. |
| config | javax.servlet.ServletConfig | ServletConfig для данной JSP-страницы. Область видимости: page. |
| page | java.lang.Object | Экземпляр класса реализации данной страницы, обрабатывающий текущий запрос. Область видимости: page. |
a. Если язык скриптинга - “java”, тогда “page” является синонимом для “this” в теле/body страницы.
Кроме того, может быть получен доступ к неявному объекту exception на странице ошибок, как указано в .
JSP.2.8.4 Объект pageContext
PageContext это объект, предоставляющий контекст для хранения ссылок на объекты, используемые страницей. Он инкапсулирует зависящие от реализации свойства и предоставляет нужные методы. Класс реализации JSP-страницы может использовать PageContext для прогона в неизменённом виде в любом подходящем JSP-контейнере, одновременно используя преимущества специфичных для реализации улучшений типа высокопроизводительного JspWriters. См. детали в .Таблица JSP.2-2 Неявные Объекты, Доступные на Страницах Ошибок\Error Pages
| exception | java.lang.Throwable | Неотловленный Throwable, приводящий к вызову страницы информации об ошибках. Область видимости: page. |
Имена объектов с префиксами jsp, _jsp, jspx и _jspx, в любой комбинации нижнего и верхнего регистров, зарезервированы данной спецификацией JSP. См. в Разделе некоторые ненормативные соглашения для введения новых неявных объектов.
JSP.2.8 Объекты
JSP-страница может создавать и модифицировать серверные объекты/server-side и получать к ним доступ.Объекты могут быть сделаны видимыми для акций и элементов скриптинга. Объект имеет scope\область видимости, которая описывает, какие экземпляры могут получать доступ к объекту.
Акции могут получать доступ к объекту, используя имя в объекте PageContext. Объект, видимый через переменную скриптинга, имеет область видимости в пределах страницы.
Элементы скриптинга могут получать доступ к объектам непосредственно через
переменную скриптинга.
Некоторые неявные объекты видны через переменные скриптинга на любой JSP-странице.
JSP.3.1 Кодировка Символов Страницы
Поддержка платформой Java локализованного содержимого базируется на универсальном внутреннем представлении текста как символов Unicode 2.0 (ISO010646) и поддержке нескольких кодировок символов в Unicode.Java Virtual Machine (JVM)/Виртуальная Машина Java обязана поддерживать кодировки Unicode и Latin-1, но большинство машин поддерживают гораздо больше кодировок. Кодировки символов, поддерживаемые JVM от Sun, описаны по адресу:
JSP-страница использует кодировку символов. Кодировка может быть описана явно атрибутом pageEncoding директивы page. По умолчанию кодировка выполняется по атрибуту contentType директивы page, если она имеется, или, в противном случае, устанавливается ISO-8859-1. ISO-8859-1 известна также как Latin-1.
Верные имена кодировок символов в JSP 1.2 - те же, что и имена IANA. Они описаны по адресу:
Атрибут pageEncoding должен использоваться только тогда, когда кодировка символов JSP-страницы организована так, что символы ASCII отображают сами себя. Директива, содержащая атрибут pageEncoding, должна появляться на JSP-странице как можно раньше.
JSP-контейнер может использовать какую-нибудь зависящую от реализации эвристику и/или структуру для определения ожидаемой кодировки JSP-страницы и проверки соответствия атрибута contentType.
JSP-контейнер вызовет ошибку времени трансляции, если запрошена неподдерживаемая кодировка символов.
JSP.4.1
Акция jsp:useBeanассоциирует экземпляр объекта языка программирования Java, определённый в данной области видимости/scope
и доступный с данным id через вновь объявленную переменную скриптинга с тем же id.
Акция jsp:useBean
весьма гибка: её точная семантика зависит от заданных атрибутов. Базовая семантика пытается найти существующий объект, используя id и область видимости. Если объект не найден, будет сделана попытка создания этого объекта с использованием других атрибутов.
Можно использовать эту акцию также для задания локального имени объекту, определённому в другом месте, например, в другой JSP-странице или Сервлете. Это может быть выполнено с помощью атрибута типа без предоставления атрибутов class или beanName. Должен быть представлен как минимум тип или класс, и неверным будет предоставление и class, и beanName. Если тип и класс имеются, class обязан быть назначен типу (в понимании Java-платформы). Невозможность его назначить является ошибкой времени трансляции.
Атрибут beanName специфицирует имя Bean'а, как указано в спецификации JavaBeans. Оно используется в качестве аргумента для метода instantiate()
класса java.beans.Beans. Оно обязано иметь форму “a.b.c” и может быть именем класса или ресурса в форме “a/b/c.ser”, которое будет разрешено в текущем ClassLoader/ЗагрузчикеКлассов. Если это не так, будет вызвано исключение времени запроса, как указано в семантике instantiate(). Значением этого атрибута может быть выражение атрибута времени запроса.
Более детально о роли id и scope говорится далее.
Атрибут id
Пара атрибут/значение id=”имя” является элементом jsp:useBean
и имеет специальное значение для JSP-контейнера во время трансляции страницы при обработке запроса клиента.
Конкретно:
обязано быть уникальным в пределах трансляционного модуля и идентифицирует определённый элемент, в котором оно появляется в JSP-контейнере и странице. Дубликаты id, найденные в том же самом трансляционном модуле, приводят в фатальной ошибке времени трансляции.
page-context, описанный далее в этой спецификации.
Это name используется также для экспонирования переменной (имени) в среде языка скриптинга. Область видимости переменной языка скриптинга зависит от правил видимости и возможностей языка скриптинга, используемого на этой странице.
Заметьте, что это подразумевает, что синтаксис значения name обязан соответствовать синтаксическим правилам именования переменных языка скриптинга, используемого на этой странице.
В детально рассматривается случай, когда атрибут language - ”java”.
Пример использования правил правил области видимости, только что упомянутых, дан здесь:
<% { // вводится новый блок %>
...
<%
/*
* тэг создаёт или получает ссылку на Customer Bean,
* ассоциирует её с именем “customer”
* в PageContext и объявляет переменную языка программирования Java
* с тем же именем, которое инициализировано для ссылки на объект
* в пределах видимости этого блока.
*/
%>
...
<%= customer.getName(); %>
...
<% } // закрывает блок %>
<%
// переменная customer находится сейчас вне области видимости,
// но объект всё ещё действует (и доступ к нему осуществляется через PageContext)
%>
Атрибут scope
Пара атрибут/значение scope=”page|request|session|application” ассоциирована с (и модифицирует) поведением атрибута id, описанного выше (она (пара) имеет семантику и времени трансляции, и времени процессинга запроса клиента).
Конкретнее, она описывает пространство имён, предполагаемый жизненный цикл ссылки на объект, ассоциированной с name, и API, используемые для доступа к этой ассоциации, таким образом:
Таблица JSP.4-1
| page | Именованный объект, доступный из javax.Servlet.jsp.PageContext для данной страницы. Эта ссылка должна быть уничтожена после выполнения текущего запроса телом страницы. Не допускается изменение объекта экземпляра, ассоциированного таким образом, что его (объекта?) тип времени прогона/выполнения является поднабором типа текущего объекта, ассоциированного ранее. |
| request |
Именованный объект, доступный из объекта ServletRequest текущей страницы через использование метода getAttribute(name). Эта ссылка должна быть уничтожена после выполнения текущего клиентского запроса. Не допускается изменение значения объекта экземпляра, ассоциированного таким образом, что его (объекта?) тип времени прогона/выполнения является поднабором(-ами) типа объекта, ассоциированного ранее таким же образом. |
| session | Именованный объект, доступный из объекта HttpSession текущей страницы (который, в свою очередь, может быть получен из объекта ServletRequest) через использование методаgetAttribute(name). Эта ссылка должна быть уничтожена после аннулирования текущей сессии. Не допускается изменение значения объекта экземпляра, ассоциированного таким образом, чтобы его новый тип времени прогона был поднабором(-ами) типа объекта, ассоциированного ранее. Заметьте, что будет фатальной ошибкой трансляции попытка использовать область видимости сессии, когда JSP-страница, делающая эту попытку, объявляется через директиву <%@ page ... %> (см. далее) так, что она не участвует в сессии. |
| application | Именованный объект, доступный из объекта ServletContext текущей страницы через использование метода getAttribute(name). Эта ссылка должна быть уничтожена после использования ServletContext. Не допускается изменение значения объекта экземпляра, ассоциированного таким образом, чтобы его новый тип времени прогона был поднабором(-ами) типа объекта, ассоциированного ранее таким же образом. |
Семантика
Акциями, выполняемыми в jsp:useBean, являются:
Переменная языка скриптинга специфицированного типа (если задан) или class/класс (если type не задан) определяется с данным id в текущей лексической области видимости языка скриптинга.
Ссылка на новый объект ассоциируется с переменной скриптинга и со специфицированным именем в специфицированной области видимости через использование подходящей области видимости, в зависимости от механизма ассоциирования (см. PageContext). После этого выполняется шаг 7.
Если объект не найден и класс является абстрактным классом, интерфейсом или не определён public безаргументный/no-args конструктор, тогда должно возникать исключение java.lang.InstantiationException. Это завершает работу данной акции jsp:useBean.
будет вызван с Class-Loader/Загрузчиком-Классов объекта Servlet и с beanName в качестве аргументов.
Если метод выполнен успешно, новая ссылка на объект ассоциируется с переменной скриптинга и со специфицированным именем в специфицированной области видимости через использование подходящей области видимости, в зависимости от механизма ассоциирования (см. PageContext). После этого выполняется шаг 7.
Обычно непустое тело используется для завершения инициализации созданного экземпляра. В этом случае тело, вероятно, будет содержать акции jsp:setProperty и скриптлеты, которые вычисляются. Это завершает работу данной акции jsp:useBean.
Примеры
В этом примере Bean с именем “connection” и типом “com.myco.myapp.Connection” доступен после выполнения акций в этом элементе, или потому что он уже создан и найден, или потому что он создан заново.
В следующем примере свойство timeout устанавливается в 33, если Bean был инстанциирован.
В последнем примере объект должен существовать в данной сессии. Если это так, ему присваивается локальное имя wombat типа WombatType. Может возникать исключение ClassCastException, если это объект неверного класса, а InstantiationException может возникать, если объект не определён.
Синтаксис
Эта акция может иметь или не иметь тело/body. Если акция не имеет тела, она имеет форму:
typeSpec ::= class=”className” |
class=”className” type=”typeName” |
type=”typeName” class=”className” |
beanName=”beanName” type=”typeName” |
type=”typeName” beanName=”beanName” |
type=”typeName”
Если акция имеет тело, она имеет форму:
body
В этом случае тело тело будет вызвано, если Bean, обозначаемый этой акцией, создаётся. Обычно body будет содержать тэги скриптлетов или jsp:setProperty, которые будут использоваться для модификации вновь созданного объекта, но содержимое тела не ограничивается.
Тэг
Таблица JSP.4-1
| id | Имя, используемое для идентификации экземпляра объекта в пространстве имён специфицированной области видимости, а также имя переменной скриптинга, объявленное и инициализированное вместе со ссылкой на этот объект. Специфицированное пространство имён чувствительно к регистру и должно соответствовать соглашениям текущего языка скриптинга по именованию переменных. |
| scope | Область видимости/scope, в зоне которой ссылка доступна. Значение по умолчанию - page. См. описание атрибута scope, определённого ранее здесь же. |
| class | Полное квалифицированное имя класса, определяющего реализацию объекта. Имя класса чувствительно к регистру. Если атрибуты class и beanName не специфицированы, объект обязан быть представлен в данной области видимости. |
| beanName | Имя для Bean, как предполагается методом instantiate() класса java.beans.Beans. Этот атрибут может принимать в качестве значения выражение атрибута времени запроса. |
| type | Если специфицирован, определяет тип переменной скриптинга. Это позволяет типу переменной скриптинга отличаться от (но соотноситься с) типа специфицированного класса реализации. Тип должен быть самим классом, суперклассом этого класса, либо интерфейсом, реализованным специфицированным классом. Объект, на который ссылаются, должен быть этого типа, иначе должно возникать исключение java.lang.ClassCastException во время запроса, когда делается попытка назначения объекта, на который ссылаются, переменной скриптинга. Если не специфицировано, значение будет тем же, что и значение атрибута class. |
JSP.4.2
Акция jsp:setPropertyустанавливает значения свойств в Bean'е. Атрибут name, обозначающий этот Bean, обязан быть определён до появления этой акции.
Имеются два варианта акции jsp:setProperty. Оба они устанавливают значение одного или более свойств в Bean на базе типа свойств. Обычно в Bean выполняется самоанализ с целью обнаружения существующих свойств, и, для каждого из них, имени, простое оно или индексированное, его типа и методов setter и getter. Самоанализ также указывает, имеет ли тип данного свойства класс PropertyEditor.
Свойства в Bean могут быть установлены из одного или более параметров объекта request, из String-константы или из вычисленного выражения времени запроса. Простые и индексированные свойства могут быть установлены с использованием jsp:setProperty.
При установке из параметра объекта request применяется конвертация, описанная в , использующая целевое свойство для определения целевого типа.
При присвоении из значения, заданного как String-константа, применяется конвертация, описанная в , использующая целевое свойство для определения целевого типа.
При присвоении из значения, заданного как атрибут времени запроса, никакая конвертация типов не применяется, как указано в Разделе .
При присвоении значений индексированным свойствам значение обязано быть массивом/array; к элементам применяются правила, описанные в предыдущем параграфе. Неудача конверсии приводит к ошибке времени трансляции или времени запроса.
Примеры
Следующие два элемента устанавливают значение из значений параметра request:
Следующие два элемента устанавливают свойство из значения:
Синтаксис
prop_expr ::=
property="*" |
property=”propertyName”|
property=”propertyName” param="parameterName"|
property=”propertyName” value=”propertyValue”
propertyValue ::= string
Значение propertyValue может также быть значением атрибута времени запроса, как описано в .
propertyValue ::= expr_scriptlet
(См. синтаксис скриптлета выражения “<%= ... %>”)
Элемент
Таблица JSP.4-2
| name | Имя экземпляра Bean'а, определённое элементом Экземпляр Bean'а обязан содержать свойство, которое Вы хотите установить. Определяющий элемент обязан появиться до элемента |
| property | Имя свойства Bean'а, значение которого Вы хотите установить. Если Вы устанавливаете propertyName в *, тогда тэг будет выполнять итерацию поверх текущих параметров ServletRequest, подбирая совпадения имён параметров и типа(-ов) значений с именами свойств и типом(-ами) метода setter, устанавливая каждое совпавшее свойство в значение совпадающего параметра. Если параметр имеет значение "", соответствующее свойство не модифицируется. |
| param | Имя параметра запроса, значение которого Вы хотите дать свойству Bean'а. Имя параметра запроса приходит обычно от web-формы. Если param опущен, принимается, что имя параметра запроса - то же самое, что и имя свойства Bean'а. Если param не установлен в объекте Request или если он имеет значение ““, элемент jsp:setProperty не оказывает влияния (a noop - шо цэ такэ?). Акция может не иметь атрибутов param и value. |
| value |
Значение, присваиваемое данному свойству. Этот атрибут может принимать выражение атрибута времени запроса в качестве значения. Акция может не иметь атрибутов param и value. |
JSP.4.3
Акция Конверсия к String выполняется также, как в методах println(), т.е. метод toString() данного объекта применяется для экземпляров Object, а примитивные типы конвертируются напрямую.
Если объект не найден, вызывается исключение времени запроса.
Значение атрибута name в jsp:setProperty и jsp:getProperty будет ссылаться на объект, который получен из объекта PageContext с помощью его метода findAttribute().
Объект, именованный посредством name, обязан быть “представлен” JSP-процессору путём использования акции jsp:useBean или специальной акции с ассоциированным входом VariableInfo для данного имени.
Примечание: из предыдущего параграфа следует, что объекты, хранимые, скажем, в сессии лицевым/front компонентом, не являются автоматически видимыми акциям jsp:set-Property и jsp:getProperty на данной странице, если только акция jsp:useBean или какая-нибудь другая не делает их видимыми.
Если JSP-процессор может убедиться, что имеется альтернативный способ, гарантирующий доступ к тому же объекту, он может использовать эту информацию. Например, он может использовать переменную скриптинга, но он обязан гарантировать, что никакой вставляемый код не нарушит копию, хранимую переменной скриптинга. Верным всегда будет значение, содержащееся объектом PageContext.
Пример
Синтаксис
Таблица JSP.4-3 Атрибуты
| name | Имя экземпляра объекта, из которого получено свойство. |
| property | Именует получаемое свойство. |
JSP.4.4
Элемент Включение производится в текущее значение 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’.
Примеры
Вышеприведённый пример - это простое включение объекта. Путь интерпретируется в контексте Web-Приложения. Это похоже на static/статичный объект, но он может также отображаться в, например, Servlet посредством web.xml.
Например, в качестве более сложного набора включений рассмотрим следующие 4 ситуации, построенные с использованием 4 JSP-файлов: A.jsp, C.jsp, dir/B.jsp и dir/C.jsp:
В данном случае относительная спецификация “C.jsp” разрешается в “dir/C.jsp”.
В данном случае относительная спецификация “C.jsp” разрешается в “dir/C.jsp”.
В данном случае относительная спецификация “C.jsp” разрешается в “dir/C.jsp”.
В данном случае относительная спецификация “C.jsp” разрешается в “C.jsp”.
Синтаксис
и
{
В первом примере синтаксиса выполняется включение на этапе запроса.
Во втором случае значения в субэлементах param используются для увеличения запроса с целью включения.
Верными атрибутами являются:
Таблица JSP.4-4
| page | Этот URL является относительным urlSpec, как указано в . Относительные пути интерпретируются относительно текущей JSP-страницы. Принимает атрибут времени запроса value (который обязан вычисляться до String, которая является спецификацией относительного URL). |
| flush | Необязательный булев атрибут. Если “true”, буфер немедленно очищается. По умолчанию - “false”. |
JSP.4.5
Элемент jsp:forward эффективно прерывает выполнение текущей страницы. Относительный
urlSpec - как в . Объект запроса будет настроен в соответствии со значением атрибута page.
Акция jsp:forward может иметь субэлементы jsp:param, которые могут предоставлять значения для некоторых параметров запроса, используемых для перенаправления.
Если вывод страницы буферизуется, то буфер очищается перед перенаправлением.
Если вывод страницы буферизуется и буфер был очищен, то попытка направить запрос вызовет исключение IllegalStateException.
Если вывод страницы не буферизовался и в него что-то было записано, то попытка направить запрос вызовет исключение IllegalStateException.
Примеры
Следующий элемент может использоваться для направления статической странице, на базе некоторого динамического условия.
<% String whereTo = “/templates/”+someValue; %>
Синтаксис
и
{
Этот тэг позволяет автору страницы осуществлять воздействие на процессинг текущего запроса специфицированными атрибутами:
Таблица JSP.4-5
| page | URL является относительным urlSpec, как указано в . Относительные пути интерпретируются относительно текущей JSP-страницы. Принимает атрибут времени запроса value (который обязан вычисляться до String, которая является спецификацией относительного URL). |
JSP.4.6
Элемент 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
Акция plugin даёт автору JSP-страниц возможность генерировать HTML, содержащий соответствующие клиентскому браузеру конструкции (OBJECT или EMBED), которые приводят к загрузке компонента Java Plugin (если это необходимо) и последующему выполнению специфицированного компонента Applet или JavaBeans.Тэг