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

         

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-файл указывает, что тело всегда обязано иметь пустую акцию (когда вхождение <body-content> установлено в “empty”), тогда метод doStartTag() обязан возвращать SKIP_BODY. В ином случае метод doStartTag() может возвратить SKIP_BODY или EVAL_BODY_INCLUDE.


Если возвращено 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- контейнер обязан выдерживать конверсии типов, описанные в , при присвоении значений атрибутам акции.

Пустые и Непустые Акции


Пустая акция не имеет тела; она может использовать один или два синтаксиса: <foo/> или <foo></foo>. Поскольку пустые акции не имеют тела, методы, имеющие отношение к работе с телом, не вызываются.

В 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-файл указывает, что акция всегда обязана иметь пустую акцию (когда вхождение <body-content> установлено в “empty”), тогда метод doStartTag() обязан возвращать SKIP_BODY. В ином случае метод doStartTag() может возвратить SKIP_BODY, EVAL_BODY_INCLUDE или EVAL_BODY_BUFFERED.

Если возвращено 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 - не реализует его.

<x:iterate src=“foo”>

<x:doit att1=“one” att2=“<%=1 +1 %>”/>

  <x:foobar />

  <x:doit att1=“one” att2=“<%=2 +2 %>”/>

</x:iterate>

<x:doit att1=“one” att2=“<%=3 +3 %>”/>

Код, показанный ниже, принимает, что имеется обслуживаемый пул обработчиков тэгов (детали не описаны, хотя обслуживание пула проще, если нет атрибутов по выбору), и пытается использовать обработчики тэгов повторно, если это возможно. Этот код “крадёт” установки этих свойств для уменьшения затрат, где это возможно, например, при итерации.

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 может получить доступ к этому серверному объекту и выполнить какое-нибудь действие.

<x:foo id=“myObject” />

<x:bar ref=“myObjet” />

В JSP-реализации отображение “имя”->значение хранится в неявном объекте pageContext. Этот объект передаётся по кругу через экземпляры обработчика Tag так, что он (объект) может использоваться для передачи информации: всё, что необходимо, это знать имя, под которым информация хранится в pageContext.


Стэк Времени Прогона/Runtime Stack

Альтернативой явной передаче информации через именованный объект является неявная координация на базе синтаксической видимости. Например, в следующем JSP-фрагменте акция foo могла бы создать серверный объект; затем вложенная акция bar могла бы получить доступ к этому серверному объекту. Этот объект не именован внутри pageContext: он может быть найден, поскольку конкретный элемент foo является ближайшим содержащим экземпляром известного типа элемента.

<foo>

<bar/>

</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.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 путём использования субэлемента <variable> элемента <tag>. См. спецификацию JSP.

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.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 - значение <name-given>

nameFromAttribute - значение <name-from-attribute>

className - значение <variable-class>

declare - значение <declare>

scope - значение <scope>

JSP.10.5.10.40 Методы

public java.lang.String getClassName()

Тело элемента <variable-class>.


Возвращает: имя класса переменной.


public booleangetDeclare()

Тело элемента <declare>.


Возвращает: объявляется переменная, или нет.


public java.lang.String getNameFromAttribute()

Тело элемента <name-from-attribute>. Это имя атрибута, чьё значение (этапа трансляции) даст имя переменной. Необходимо одно из: <name-given> или <name-from-attribute>.


Возвращает: атрибут, чьё значение определяет имя переменной.

public java.lang.String getNameGiven()

Тело элемента <name-given>.


Возвращает: имя переменной как константу.


public int getScope()

Тело элемента <scope>.


Возвращает: область видимости для переменной.



JSP.10.5 Классы Времени Трансляции


Следующие классы используются на этапе трансляции.


Tag-отображение, Tag-имя

Директива taglib вводит библиотеку тэгов и ассоциирует с ней префикс. TLD, ассоциированный с библиотекой, ассоциирует классы обработчика Tag (плюс другая информация) с именами тэгов. Эта информация используется для ассоциирования Tag-класса, префикса и имени с каждым элементом специальной акции, появляющимся на JSP-странице.


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


Переменные Скриптинга

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

В некоторых случаях информация переменных скриптинга может быть описана непосредственно в TLD, используя элементы. Особый случай - типичная итерация атрибута &quotid“. В других случаях логика, определяющая определение экземпляром акции переменной скриптинга, может быть довольно сложной, и имя класса 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() уже вызван.



Имя класса - такое, какое указано в элементе <validator-class>, а Map, переданный в setInitParameters() - такой, как описано в элементе <init-params>. Предполагается, что все классы TagLibraryValidator сохраняют свои initParameters до тех пор, пока не будут установлены новые или пока release() не будет в них вызван.

Второй дополнительный шаг выполняет реальную проверку. Это делается через вызов метода validate() с префиксом, uri и PageData, которые соответствуют проверяемому экземпляру директивы taglib и PageData, представляющему эту страницу.

Последний дополнительный шаг вызывает метод release() в тэге проверщика, когда он уже больше не нужен.

Этот метод освобождает все ресурсы.

Наконец, после проверки всех классов проверщика библиотеки тэгов, классы TagExtraInfo для всех тэгов будут проверяться вызовом их метода isValid. Порядок вызова этого метода не определён.


JSP-Документы


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

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



JSP-Контейнер


В этой главе рассматриваются контракты между JSP-контейнером и JSP-страницей.

Протокол прекомпиляции (см. ) также представлен здесь.


Информация, представленная здесь, не зависит от Языка Скриптинга, используемого на JSP-странице.

описывает информацию для случая, когда атрибут language директивы page установлен в “java”.

Классы реализации JSP-страницы должны использовать классы JspFactory и PageContext для получения преимуществ платформозависимых реализаций.



расширяет Спецификацию JavaServer Pagesтм


JSP 1. 2 расширяет Спецификацию JavaServer Pagesтм 1.1 (JSP 1.1) следующим образом:

Требуя платформы Java 2 версии 1.2 или более поздней.

Используя Servlet 2.3 как основу своей семантики.

Определяя синтаксис XML для страниц JSP.

Предоставляя проверку страниц JSP на этапе трансляции.

Специфицируя очистку библиотеки тэгов на этапе прогона.

Улучшая контракт обработчика тэгов.

Предоставляя улучшенную поддержку авторизации страниц.

Улучшая поддержку кодировки символов и локализации.

Фиксируя печально известное ограничение “flush before you include” из JSP 1.1.


JSP.P.2 Лицензирование Спецификации


Детали условий, по которым данный документ распространяется, даны в .



JSP.P.3 Для кого предназначен этот документ


Этот документ является авторизованной спецификацией JSP 1.2. Он предназначен для предоставления требований к реализациям процессинга JSP и поддерживается web-контейнерами в web-серверах и серверами приложений.

Он не является справочником пользователя. Мы ожидаем появления других документов, предназначенных для различных категорий читателей.



JSP.P.4 Родственные Документы


Разработчики контейнеров JSP и авторы страниц JSP могут найти необходимую информацию также в следующих документах:

Таблица  JSP.P-1  Некоторые Родственные Web-Сайты

Домашняя страница JSP: 
Домашняя страница Servlet:  
Java 2 Platform, Standard Edition::  
Java 2 Platform, Enterprise Edition:  
Домашняя страница XML на платформе Java:  
Домашняя страница JavaBeans™:  
Домашняя страница XML на W3C:  
Домашняя страница HTML на W3C:  
Домашняя страница XML.org:  



JSP.P.5 Немного Истории


Пионерами, выполнившими начальную работу по платформе Java, относящуюся к данной Спецификации, были: James Gosling, работавший над Web Server в Java в 1994/1995 гг. - основой сервлетов.


Расширенный проект был начат в 1996 г. Pavani Diwanji - ведущим инженером - и многими другими ключевыми участниками, перечисленными ниже. Результатом работы над этим проектом стал продукт Java Web Server компании Sun.

Некоторые проекты начались в 1999 г.. Группа экспертов по сервлетам во главе с James Davidson выпустила спецификации: Servlet 2.1 - в январе и Servlet 2.2 в декабре, а группа JSP во главе с Larry Cable и Eduardo Pelegri-Llopart выпустила JSP 1.0 в июне и JSP 1.1 - в декабре.

Год 2000 ознаменовался большим количеством разработок: многочисленные реализации контейнеров, утилит, книг и тренировочных материалов по JSP 1.1, Servlet 2.2 и платформе Java 2 Enterprise Edition. Интенсивно разрабатывались библиотеки тэгов и различные усовершенствования. Внедрение технологии JSP продолжилось в 2001 году по многим направлениям Web и сервиса JavaOne.

Проследить развитие печатной продукции весьма трудно; лучше всего это сделано на сайте  .



JSP.P.6 Благодарности


Успех Java Platform обусловлен деятельностью Java Community Process по её разработке. Этот процесс, вовлёкший в свою орбиту множество людей и корпораций, продвигает разработку высококачественных спецификаций эпохи Internet.

Хотя невозможно перечислить всех участвовавших в разработке этой версии Спецификации, мы хотели бы поблагодарить всех членов нашей экспертной группы. Мы использовали преимущества большой активной группы экспертов, без которой спецификации JSP не были бы созданы.



JSP.S.1 Процессы Сообщества Java


JCP создаёт спецификации, используя три сообщества: сообщество экспертов (the expert group), 

participants\участники JCP и public\публика вообще.

Эксперты является авторами спецификаций, создавая проекты/drafts.

Проекты проходят путь от экспертов, через участников, к публике, постепенно совершенствуясь в деталях, всегда возвращая комментарии обратно группе экспертов; final draft/окончательный проект отправляется для одобрения в Executive Committee\Исполнительный Комитет.

Лидер группы экспертов отвечает за облегчение работы группы экспертов, авторизацию спецификации и за организацию reference implementation\справочной реализации и conformance test suite\блока тестирования на соответствие.



JSP.S.2 JCP и Эта Спецификация


JCP разработан как чрезвычайно гибкий процесс, так что каждая группа экспертов может адресовать требования специфического сообщества, обслуживаемого ею. Справочная реализация JSP 1.2 и Servlet 2.3 использует код, который разрабатывается как открытый проект-ресурс по соглашению с Apache Software Foundation.


Данная спецификация содержит главы, которые получены непосредственно из комментариев javadoc в классах API, но там, где имеются расхождения, данная спецификация имеет преимущество над комментариями javadoc.


Процесс JCP предоставляет механизм обновления спецификации в процессе

поддержки через Erratas\Списки Ошибок. Если они имеются, эти списки имеют приоритет над данной спецификацией.

Приложения C и D являются нормативными; остальные приложения являются ненормативными.

 



КУДА СООБЩИТЬ


Вы можете сообщить о какой-либо неоднозначности, неполноте или неточностях в связи с использованием Вами данной Спецификации ("Обратная Связь/Feedback"). В связи с тем, что Вы направляете Sun информацию Feedback, Вы, кроме того:

(i) согласны с тем, что эта информация предоставляется Вами на некоммерческой и неконфиденциальной основе, и

(ii) предоставляете Sun бессрочное, неисключительное, всемирно действующее, неотзываемое разрешение безвозмездно, с правом сублицензирования на несколько уровней сублицензирования, внедрять, публиковать и использовать без ограничений Feedback для любых целей, относящихся к данной Спецификации и её последующим версиям, реализациям, и утилитам тестирования.



ЛИЦЕНЗИЯ


Данная Спецификация защищена авторскими правами, и информация, приведённая здесь, может быть защищена одним или более патентами США, иностранными патентами или задействованными приложениями.


За исключением случаев, указанных в данной лицензии, никакая часть данной Спецификации не может воспроизводиться в любой форме и любым способом без наличия предварительного письменной авторизации Sun Microsystems, Inc. ("Sun") и её лицензоров, если имеются.


Любая часть данной Спецификации и описанной здесь информации управляется терминами и условиями данной лицензии и Export Control Guidelines, как установлено ранее в Terms of Use на сайте Sun.

Просматривая, загружая и копируя данную Спецификацию, Вы соглашаетесь с тем, что Вы прочли, поняли и согласны со всеми терминами и условиями, установленными здесь и далее.

Настоящим документом Sun предоставляет Вам лицензию на бесплатное, неисключительное пользование без права передачи (без права на сублицензию), с сохранением прав интеллектуальной собственности Sun, что является непременным условием использования данной Спецификации для внутренних целей дизайна и разработки Ваших Java-аплетов и приложений, предназначенных для работы на платформе Java, или для создания чисто рабочих реализаций данной Спецификации, которые:

(i) полную реализацию текущей версии Спецификации без подразделения или объединения её;

(ii) реализует весь интерфейс и функциональность данной Спецификации без подразделения или объединения её;

(iii) включают полную реализацию всех необязательных компонентов (как определено Спецификацией), которые Вы выбрали для реализации, без подразделения или объединения;

(iv) реализует все интерфейсы и функциональность таких необязательных компонентов без подразделения или объединения;

(v) не добавляют никаких дополнительных пакетов, классов или интерфейсов к пакетам "java.*" или "javax.*" или подпакетам или другим пакетам, определённым в данной Спецификации;

(vi) удовлетворяют всем требованиям тестирования, доступным от Sun, относящимся к самой последней версии данной Спецификации, опубликованной за шесть (6) месяцев до любого релиза реализации такой чисто рабочей реализации или обновления до неё;

(vii) не происходят от какого-либо кода-источника Sun или кодов двоичных материалов; и

(viii) не включает какого-либо первичного кода Sun или кодов двоичных материалов без отдельной соответствующей лицензии Sun. Данная Спецификация содержит информацию о правах собственности Sun и может использоваться только в соответствии с данной лицензией.

Действие данной лицензии оканчивается немедленно без предупреждения от Sun, если Вы не согласны с каким-либо из условий данной лицензии. После окончания или истечения срока действия данной лицензии Вы обязаны исключить использование или уничтожить имеющуюся у Вас Спецификацию.



Мы хотим поблагодарить:


Alex Yiu, Alex Chaffee, Allan Scott, Amit Kishnani, Bill dehOra, Bjorn Carlson, Bob Foster, Chris Hansen, Clement Wong, Craig McClanahan, Dano Ferrin, Danny Coward, Dave Brown, Edwin Smith, Francios Jouaux, Frank Biederich, Govind Seshadri, Hans Bergsten, Howard Melman, James Strachan, Jason McGeee, Jason Hunter, Jeff Mischkinsky, Jon Rousseau, Julie Basu, Karl Avedal, Kevin Jones, Larry Cable, Larry Isaas, Magnus Rydin, Magnus Stenman, Mark Wallace, Miles Sabin, Misha Davidson, Murty Chintalapati, Nathan Abamson, Nic Ferrier, Olli Blackburn, Paul Bonfanti, Peter Petersen, Petr Jiricka, Pier Paolo Fumagalli, Pierre Delisle, Ramesh Mandava, Rod Magnuson, Sam Pullara, Satoshi Kikuchi, Scott Ferguson, Scott Snyder, Simeon Simeonov, Stephanie Bodoff, Stefano Mazzocchi, Tim Ampe, Tom Reilly, Vince Bonfanti.


Мы благодарим всё сообщество, разрабатывавшее пробные реализации, и продавцов, выпускавших утилиты авторизации и библиотеки тэгов.


Отдельно упомянем Scott Ferguson, Bob Foster, Stefano Mazzocchi и Ricardo Rocha и их работу по Главе 5. Bob Foster заслуживает благодарности за ОТД& XSchema, а сообщество Cocoon - за Cocoon & XSP. Наши благодарности Jess Holle за кропотливую работу над статьями в Главе JSP.3.


Мы хотим поблагодарить также всех авторов книг о JSP и создателей web-сайтов, отслеживавших и облегчавших работу по созданию сообщества JSP.


Редактор особо признателен участникам Java Platform Group, в особенности - James, Jon, Mala, Jeff, Connie и Graham.


Наконец, мы благодарим разработчиков программного обеспечения, web-авторов и членов группы public, прочитавших эту спецификацию, использовавших пробную реализацию и поделившихся своим опытом.

Благодаря вам, появилась технология JavaServerPages.



Обзор


В этой главе даётся обзор технологии JavaServer Pages/Серверные Страницы Java.



ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ


В ДОПОЛНЕНИЕ К НЕ ЗАПРЕЩЁННОМУ ЗАКОНОМ, НИ ПРИ КАКИХ СОБЫТИЯХ SUN ИЛИ ЕЁ ЛИЦЕНЗОРЫ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБОЙ УЩЕРБ, ВКЛЮЧАЯ, БЕЗ ОГРАНИЧЕНИЯ, УПУЩЕННУЮ ВЫГОДУ, ПОТЕРЮ ДАННЫХ ИЛИ ЗА ПРИЧИНЁННЫЙ, КОСВЕННЫЙ, ПОСЛЕДУЮЩИЙ, СЛУЧАЙНЫЙ ИЛИ УМЫШЛЕННЫЙ ВРЕД, НАНЕСЁННЫЙ КАКИМ-ЛИБО ОБРАЗОМ, ВНЕ ЗАВИСИМОСТИ ОТ ПРАВИЛ ОБ ОТВЕТСТВЕННОСТИ, ПРИЧИНЁННЫЙ ИЛИ ОТНОСЯЩИЙСЯ К: ЛЮБОМУ ОБОРУДОВАНИЮ, ИСПОЛЬЗОВАНИЮ, МОДИФИЦИРОВАНИЮ ИЛИ ИНОМУ ИСПОЛЬЗОВАНИЮ ДАННОЙ СПЕЦИФИКАЦИИ, ДАЖЕ ЕСЛИ SUN И/ИЛИ ЕЁ ЛИЦЕНЗОРЫ БЫЛИ УВЕДОМЛЕНЫ О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА/ВРЕДА.

Вы страхуете и защищаете Sun и её лицензоров от любых претензий, являющихся результатом:

(i) Вашего использования данной Спецификации;

(ii) использования или распространения Ваших Java-приложений, аплетов и/или чисто рабочих реализаций; и/или

(iii) любых претензий, которые могут явиться результатом несовместимости последующих версий или релизов любой Спецификации, использованной Вами, со Спецификацией, предоставленной Вам по данному соглашению.



ОГРАНИЧЕННАЯ ГАРАНТИЯ


ДАННАЯ СПЕЦИФИКАЦИЯ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ". SUN НЕ ДАЁТ НИКАКИХ ГАРАНТИЙ, ЯВНЫХ ИЛИ КОСВЕННЫХ (ВКЛЮЧАЯ - НО НЕ ОГРАНИЧИВАЯСЬ ИМИ - ГАРАНТИИ РЕАЛИЗУЕМОСТИ), СООТВЕТСТВИЯ ОПРЕДЕЛЁННОМУ НАЗНАЧЕНИЮ ИЛИ НЕНАРУШЕНИЯ УСЛОВИЙ, ЧТО СОДЕРЖИМОЕ ДАННОЙ СПЕЦИФИКАЦИИ ПОДХОДИТ ДЛЯ КАКИХ-ЛИБО ЦЕЛЕЙ ИЛИ ЧТО ЛЮБОЕ ИСПОЛЬЗОВАНИЕ ИЛИ РЕАЛИЗАЦИЯ ТАКОГО СОДЕРЖИМОГО НЕ БУДЕТ НАРУШАТЬ КАКИХ-ЛИБО ПАТЕНТОВ ТРЕТЬЕЙ СТОРОНЫ, АВТОРСКИХ ПРАВ, КОММЕРЧЕСКОЙ ТАЙНЫ ИЛИ ИНЫХ ПРАВ.

Данный документ не содержит каких-либо обязательств на реализацию или выпуск какой-либо части данной Спецификации в каком-либо продукте.

ДАННАЯ СПЕЦИФИКАЦИЯ МОЖЕТ СОДЕРЖАТЬ ТЕХНИЧЕСКИЕ НЕТОЧНОСТИ ИЛИ ТИПОГРАФСКИЕ ОШИБКИ. ИЗМЕНЕНИЯ ПЕРИОДИЧЕСКИ ДОБАВЛЯЮТСЯ К ИМЕЮЩЕЙСЯ ИНФОРМАЦИИ; ЭТИ ИЗМЕНЕНИЯ БУДУТ ВНЕДРЕНЫ В НОВЫЕ ВЕРСИИ ДАННОЙ СПЕЦИФИКАЦИИ, ЕСЛИ ОНИ (ВЕРСИИ) ПОЯВЯТСЯ. SUN МОЖЕТ В ЛЮБОЕ ВРЕМЯ ДЕЛАТЬ УЛУЧШЕНИЯ И/ИЛИ ВНОСИТЬ ИЗМЕНЕНИЯ В ПРОДУКТЫ И/ИЛИ ПРОГРАММЫ, ОПИСАННЫЕ В ДАННОЙ СПЕЦИФИКАЦИИ.


Любое использование таких изменений данной Спецификации регулируется лицензией, существующей в данный момент для данной версии Спецификации.



ОГРАНИЧЕННЫЕ ПРАВА


Правительство США: Если данная Спецификация получена от имени или для Правительства США первичным контрактором или субконтрактором Правительства США (любого уровня), тогда права Правительства в области Программного Обеспечения и сопутствующей документации будут действовать так, как описано ранее в данной лицензии; это действует в соответствии с правилами от 48 C.F.R. 227.7201 до 227.7202-4 (для приобретений Департамента Обороны/Department of Defense (DoD)) и в соответствии с правилами 48 C.F.R. 2.101 и 12.212 (для приобретений не Департамента Обороны).



Основной API


Эта глава описывает пакет javax.servlet.jsp. В главе имеется содержимое, сгенерированное автоматически из javadoc, внедрённых в Java-классы и интерфейсы. Это делает возможным создание единого авторизованного документа спецификации.


Пакет javax.servlet.jsp содержит несколько классов и интерфейсов, описывающих и определяющих контракты между классом реализации JSP-страницы и средой работы программы/runtime environment, предоставляемые экземпляру такого класса соответствующим JSP-контейнером.



Определение Типа Данных) для Дескриптора


В этом приложении содержится DTD/ОТД ( Определение Типа Данных) для Дескриптора Библиотеки Тэгов (TLD) с использованием JSP 1.1.

Все JSP 1.2-контейнеры должны принимать такие TLD.

Это то же самое ОТД, что и "", исключая некоторые изменения форматирования для извлечения комментариев, чтобы сделать их более читабельными.


DTD для дескриптора библиотеки тэгов


В этом приложении содержится ОТД/ DTD для дескриптора библиотеки тэгов (TLD) с использованием JSP 1.2.

Все JSP 1.2-контейнеры должны принимать такой TLD.

Это то же самое ОТД, что и  "", исключая некоторые изменения форматирования текста для извлечения комментариев и для того, чтобы сделать его более читабельным.


ОТД(Определение Типа Данных)и Схема для Синтаксиса XML


Это приложение содержит ОТД и XSchema для JSP-страниц с синтаксисом XML.

Это приложение не является нормативным.

Как указано в, ОТД не является хорошим описанием, пригодным для проверки документа, использующего пространства имён, типа JSP-страницы с синтаксисом XML, но то, что многие читатели знакомы с ним, делает, тем не менее, возможным её использование.



Этот документ является спецификацией JavaServer


Этот документ является спецификацией JavaServer Pagesтм 1.2 (JSP 1.2).
Данная Спецификация была разработана как часть процесса Java Community Process (JCP). Комментарии от Экспертов, Участников и Публики были рассмотрены, и все изменения были внесены в спецификацию, где это было необходимо.

Расширения Тэгов


В этой главе рассматриваются возможности библиотеки тэгов по введению новых акций в JSP-страницу.

Сюда относятся поддержка переносимости, механизм проверки и поддержка утилит авторизации.

Здесь дан также концептуальный обзор библиотеки тэгов. Рассмотрен Tag Library Descriptor/Дескриптор Библиотеки Тэгов и директива taglib. Детальное описание задействованных API даётся в .



Синтаксис Ядра и Семантика


В этой главе описаны синтаксис ядра и семантика спецификации JavaServer Pages 1.2 (JSP 1.2).



Скриптинг


В этой главе детально разбираются Элементы Скриптинга, когда значением директивы language является “java”. Этот язык скриптинга базируется на языке программирования Java (как специфицировано в “The Java Language Specification”), но заметьте, что верная Java-программа не является верной JSP-страницей или её разделом.

Далее детально описаны взаимоотношения объявлений скриптинга, скриптлетов и выражений скриптов и языка программирования Java. Описание дано в терминах структуры класса реализации JSP-страницы.

От JSP-контейнера не требуется генерировать класс реализации JSP-страницы, но он обязан вести себя так, как будто этот класс существует.



Словарь


Данное приложение является справочником по главным концепциям данной спецификации.


Данное приложение является ненормативным.

action/акция

Элемент JSP-страницы, который может работать на неявных объектах и других серверных объектах/server-side objects, или может определять новые переменные скриптинга. Акции следуют синтаксису XML для элементов с начальным тэгом, телом и конечным тэгом; если body/тело является пустым, можно использовать также синтаксис пустого тэга. Этот тэг обязан использовать префикс.

action, standard/стандартнаяАкция, которая определена в спецификации JSP и всегда доступна файлу JSP без импортирования.

action, custom/специальная

Акция, описанная переносимым способом дескриптором библиотеки тэгов и коллекцией Java-классов и импортированная в JSP-страницу директивой taglib.

Application Assembler/Ассемблер Приложения

Человек, который комбинирует JSP-страницы, сервлет-классы, HTML-содержимое, библиотеки тэгов и другое Web-содержимое в переносимое Web-приложение.

component contract

Контракт между компонентом и его контейнером, включающий обслуживание жизненного цикла компонента и APIs и протоколы, которые это контейнер обязан поддерживать.

Component Provider/Провайдер Компонента

Продавец компонента либо как Java-классов, либо как JSP-страницы-ресурса.

distributed container/распределённый контейнер

JSP-контейнер, который может запускать Web-приложение, размеченное как распределённое, и распределять его на несколько виртуальных Java-машин, которые могут находиться на разных хостах.

declaration/объявление

Элемент скриптинга, объявляющий методы, переменные, или их обоих, в JSP-странице. Синтаксически ограничивается символами  <%!  и  %>.

directive/директива

Элемент JSP-страницы, который даёт инструкцию JSP-контейнеру и интерпретируется во время трансляции. Синтаксически ограничивается символами <%@  и  %>.

element/элемент

Часть JSP-страницы, распознаваемая JSP-транслятором. Элемент может быть директивой, акцией или элементом скриптинга.


expression/выражение

Элемент скриптинга, содержащий верное выражение на языке скриптинга, которое вычисляется, конвертируется к String и помещается в предполагаемый объект вывода. Синтаксически ограничивается символами <%=  и  %>.

fixed template data/фиксированные шаблонные данные

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

implicit object/неявный (предполагаемый) объект

Серверный объект, который определяется JSP-контейнером и всегда доступен JSP-файлу без объявления. Неявными объектами являются request, response, pageContext, session, application, out, config, page и exception.

IMPLIED

Предполагается (наличие).

(Технология) JavaServer Pages

Расширяемая технология Web, использующая шаблонные данные, специальные элементы, языки скриптинга и серверные Java-объекты для возвращения динамического содержимого клиенту. Обычно шаблонные данные - это элементы HTML или XML, а клиентом во многих случаях является Web-браузер.

JSP-контейнер

Экземпляр системного уровня, предоставляющий обслуживание жизненного цикла и поддержку времени выполнения для JSP- и Servlet-компонентов.

JSP-файлТекстовый файл, содержащий JSP-страницу. В текущей версии спецификации JSP-файл обязан иметь расширение  .jsp

JSP-страницаТекстовый документ, который использует фиксированные шаблонные данные JSP-элементы и описывает, как обрабатывать

request\запрос для создания response\ответа. Семантика JSP-страницы реализуется на этапе прогона в классе реализации JSP-страницы.

JSP-страница, front/первичная

JSP-страница, которая получает HTTP-запрос непосредственно от клиента. Она создаёт, обновляет и/или получает доступ к некоторым данным на стороне сервера и передаёт затем запрос презентационной JSP-странице.

JSP-страница, презентационнаяJSP-страница, предназначенная только для целей представления содержимого. Она получает доступ к, и/или обновляет, некоторые данные на стороне сервера и встраивает фиксированные шаблонные данные для создания содержимого, которое затем пересылается клиенту.



OptionalПо выбору (использование по выбору).

REQUIREDТребуется (наличие).scriptlet/скриптлет

Элемент скриптинга, содержащий любой фрагмент кода, который является верным для используемого в JSP-странице языка скриптов. Спецификация JSP описывает, какой скриптлет является верным, для случая, когда атрибут языка страницы - "java". Синтаксически скриптлет ограничивается символами  <%  и  %>.

tag/тэгУчасток текста между левой и правой угловыми скобками, который имеет имя, может иметь атрибуты и является частью элемента JSP-страницы. Имена тэгов известны транслятору JSP, или потому, что имя является частью спецификации JSP (в случае стандартной акции), или потому, что имя вводится с использованием Tag Library/Библиотеки Тэгов (в случае специальной акции).tag handler/обработчик тэга

Java-класс, реализующий интерфейс Tag или BodyTag

и являющийся представлением специальной акции на этапе прогона.

tag handler

JavaBean-компонент, реализующий интерфейс Tag или BodyTag и являющийся представлением специальной акции на этапе прогона.

tag library/библиотека тэгов

Коллекция специальных акций, описанных дескриптором библиотеки тэгов и Java-классами.

tag library descriptor/дескриптор библиотеки тэгов

Документ XML, описывающий библиотеку тэгов.

Tag Library Provider/Провайдер Библиотеки Тэгов

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

web application/приложение

Приложение, созданное для Internet, intranet или extranet.

web-приложение, distributable/распределяемое

Web-приложение, написанное так, что оно может публиковать в Web-контейнере, распределяемом не несколько виртуальных машин Java, запущенных на одно или нескольких хостах. Дескриптор публикации/deployment descriptor для такого приложения использует распределяемый элемент.

web-компонентКласс сервлета или JSP-страница, работающая в JSP-контейнере и предоставляющая сервис в ответ на запросы.



ИнстанциацияСоздание экземпляра.Класс реализации JSP-страницы

Класс языка программирования Java,  Servlet/Сервлет, представляющий JSP- страницу на этапе прогона, который получает объект request и обновляет объект response. Класс реализации страницы может использовать сервис, предоставляемый JSP-контейнером, включая API Servlet'а и API JSP.

Объект реализации JSP-страницы

Экземпляр класса реализации JSP-страницы, который получает объект request и обновляет объект response.

Провайдер Web-Контейнера

Продавец сервлета и контейнера JSP, поддерживающий соответствующие контракты компонентов.

Публикатор Web-Приложения

Тот, кто публикует Web-приложение в Web-контейнере, специфицируя, как минимум, префикс для корня/root Web-приложения и, в среде J2EE, отображение безопасности и ресурсов.

Элемент скриптингаОбъявление, скриптлет или выражение, синтаксис тэга которого определяется спецификацией JSP, а содержимое которого записано в соответствии с языком скриптов, используемым в JSP-странице. Спецификация JSP описывает синтаксис и семантику для случая, когда атрибут языка страницы - "java".


Стандартные Акции


В этой главе описаны стандартные акции JavaServer Pages 1.2 (JSP 1.2).



Статус


Это спецификация JSP 1.2, разработанная группой экспертов JSR053 как часть процесса Java Community Process (детали - по адресу ).



ТОРГОВЫЕ МАРКИ


Никакие права названия или интересы торговых марок, сервисных марок или торговых имён Sun или лицензоров Sun не передаются по данному соглашению.

Sun, Sun Microsystems, логотип Sun, Java, логотип Java Coffee Cup, JSP и JavaServer Pages являются торговыми марками или зарегистрированными торговыми марками Sun Microsystems, Inc. в США и других странах.



Упаковка (Архивирование)JSP-Страниц


В этом приложении показано два примера упаковки JSP-страницы в WAR публикации в Web-контейнере.

В первом примере JSP-страница публикуется в исходной форме. Это самый общий пример.

Во втором примере JSP-страница компилируется в Servlet, который использует только вызовы API Servlet 2.3 и JSP 1.2; Servlet затем упаковывается в WAR с таким дескриптором публикации, что он выглядит для любого клиента как оригинальная JSP-страница.

Это приложение не является нормативным. В действительности, строго говоря, Это Приложение больше относится к возможностям Servlet 2.3, чем к возможностям JSP 1.2. Приложение дано здесь, потому что эти возможности могут представлять интерес для авторов JSP-страниц и создателей авторских утилит.



San Antonio Road, Palo


Пожалуйста, направляйте комментарии по e-mail:

и переводчику: (Александр Пирамидин)


Понедельник, 27 августа, 2001 г.
Редактор: Eduardo Pelegrí-Llopart.

901 San Antonio Road
Palo Alto, CA 94303 USA
650 960-1300 факс: 650 969-9131

Статус: FCS

Релиз: 17 сентября 2001 г.

Copyright 2001 Sun Microsystems, Inc.

901 San Antonio Road, Palo Alto, California 94303, U.S.A.
Все Права Зарезервированы.


Вопросы Локализации


В этой Главе описаны требования по локализации в JavaServer Pages 1.2 (JSP 1.2).