javax.servlet.jsp.tagext
Интерфейс BodyTag

Все Известные Реализующие Классы:
BodyTagSupport

public abstract interface BodyTag
extends IterationTag

Интерфейс BodyTag расширяет IterationTag путём определения дополнительных методов, которые дают обработчику тэга возможность манипулировать содержимым, вычисляя его тело.

Обработчик тэга отвечает за манипуляции с содержимым тела. Например, обработчик тэга может взять содержимое тела, конвертировать его в 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(), doInitBody(), 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() не вызывается, тело вычисляется и "передаётся/passed through" текущему out, doAfterBody() вызывается, а затем, после 0 или более итераций, вызывается doEndTag().

Если возвращено EVAL_BODY_BUFFERED, вызывается setBodyContent(), вызывается doInitBody(), тело вычисляется, вызывается doAfterBody(), а затем, после 0 или более итераций, вызывается doEndTag().


Поле. Резюме.
static int EVAL_BODY_BUFFERED
          Запрашивается создание нового буфера, BodyContent, в котором вычисляется тело этого тэга.
static int EVAL_BODY_TAG
          Не рекомендуется. Как и в Java JSP API 1.2, использовать BodyTag.EVAL_BODY_BUFFERED или IterationTag.EVAL_BODY_AGAIN.
 
Поля, унаследованные из класса javax.servlet.jsp.tagext.IterationTag
EVAL_BODY_AGAIN
 
Поля, унаследованные из класса javax.servlet.jsp.tagext.Tag
EVAL_BODY_INCLUDE, EVAL_PAGE, SKIP_BODY, SKIP_PAGE
 
Метод. Резюме.
 void doInitBody ()
          Подготавливает вычисление тела.
 void setBodyContent (BodyContent b)
          Устанавливает свойство bodyContent.
 
Методы, унаследованные из интерфейса javax.servlet.jsp.tagext.IterationTag
doAfterBody
 
Методы, унаследованные из интерфейса javax.servlet.jsp.tagext.Tag
doEndTag, doStartTag, getParent, release, setPageContext, setParent
 

Поле. Детали.

EVAL_BODY_TAG

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

EVAL_BODY_BUFFERED

public static final int EVAL_BODY_BUFFERED
Запрашивает создание нового буфера, BodyContent, в котором вычисляется тело данного тэга. Возвращено из doStartTag, если он реализует BodyTag. Для doStartTag будет недопустимым return-занчением, если класс не реализует BodyTag.
Метод. Детали.

setBodyContent

public void setBodyContent(BodyContent b)
Устанавливает свойство bodyContent. Этот метод вызывается объектом реализации JSP-страницы не более одного раза на каждый вызов акции. Этот метод вызывается до doInitBody. Этот метод не будет вызываться для пустых тэгов или непустых тэгов, чей метод doStartTag() возвращает SKIP_BODY или EVAL_BODY_INCLUDE.

Если setBodyContent вызывается, значение неявного объекта out уже было изменено в pageContext-объекте. Передаваемый BodyContent-объект не будет содержать в себе данных, но может быть использован повторно (и зачищен) после некоторого предыдущего вызова.

BodyContent-объект является доступным и имеет соответствующее содержимое до момента сразу после вызова метода doEndTag - в этом случае он может быть снова использован повторно.

Параметры:
b - BodyContent

doInitBody

public void doInitBody() throws JspException
Подготавливает вычисление тела. Этот метод вызывается объектом реализации JSP-страницы после setBodyContent и до первого вычисления тела. Этот метод не будет вызываться для пустых тэгов или непустых тэгов, чей метод doStartTag() возвращает SKIP_BODY или EVAL_BODY_INCLUDE.

JSP-контейнер будет ресинхронизировать любые значения переменных, которые обозначены как таковые в TagExtraInfo, после вызова doInitBody().

Вызывает:
JspException