The BodyTag interface extends IterationTag by defining additional
methods that let a tag handler manipulate the content of evaluating its body.
It is the responsibility of the tag handler to manipulate the body
content. For example the tag handler may take the body content,
convert it into a String using the bodyContent.getString
method and then use it. Or the tag handler may take the body
content and write it out into its enclosing JspWriter using
the bodyContent.writeOut method.
A tag handler that implements BodyTag is treated as one that
implements IterationTag, except that the doStartTag method can
return SKIP_BODY, EVAL_BODY_INCLUDE or EVAL_BODY_BUFFERED.
If EVAL_BODY_INCLUDE is returned, then evaluation happens
as in IterationTag.
If EVAL_BODY_BUFFERED is returned, then a BodyContent object will be
created (by code generated by the JSP compiler) to capture the body
evaluation.
The code generated by the JSP compiler obtains the BodyContent object by
calling the pushBody method of the current pageContext, which
additionally has the effect of saving the previous out value.
The page compiler returns this object by calling the popBody
method of the PageContext class;
the call also restores the value of out.
The interface provides one new property with a setter method and one
new action method.
Properties
There is a new property: bodyContent, to contain the BodyContent
object, where the JSP Page implementation object will place the
evaluation (and reevaluation, if appropriate) of the body. The setter
method (setBodyContent) will only be invoked if doStartTag() returns
EVAL_BODY_BUFFERED.
Methods
In addition to the setter method for the bodyContent property, there
is a new action methods: doInitBody(), which is invoked right after
setBodyContent() and before the body evaluation. This method is only
invoked if doStartTag() returns EVAL_BODY_BUFFERED.
Lifecycle
Lifecycle details are described by the transition diagram below.
Exceptions that are thrown during the computation of doStartTag(),
setBodyContent(), doInitBody(), BODY, doAfterBody() interrupt the
execution sequence and are propagated up the stack, unless the
tag handler implements the TryCatchFinally interface; see that
interface for details.
Empty and Non-Empty Action
If the TagLibraryDescriptor file indicates that the action must
always have an empty action, by an <body-content> entry of "empty",
then the doStartTag() method must return SKIP_BODY.
Otherwise, the doStartTag() method may return SKIP_BODY,
EVAL_BODY_INCLUDE, or EVAL_BODY_BUFFERED.
If SKIP_BODY is returned the body is not evaluated, and doEndTag() is
invoked.
If EVAL_BODY_INCLUDE is returned, setBodyContent() is not invoked,
doInitBody() is not invoked, the body is evaluated and
"passed through" to the current out, doAfterBody() is invoked
and then, after zero or more iterations, doEndTag() is invoked.
If EVAL_BODY_BUFFERED is returned, setBodyContent() is invoked,
doInitBody() is invoked, the body is evaluated, doAfterBody() is
invoked, and then, after zero or more iterations, doEndTag() is invoked.
Field Summary
static int
EVAL_BODY_BUFFERED
Request the creation of new buffer, a BodyContent on which to
evaluate the body of this tag.
static int
EVAL_BODY_TAG Deprecated.As of Java JSP API 1.2, use BodyTag.EVAL_BODY_BUFFERED
or IterationTag.EVAL_BODY_AGAIN.
Fields inherited from interface javax.servlet.jsp.tagext.IterationTag
Deprecated.As of Java JSP API 1.2, use BodyTag.EVAL_BODY_BUFFERED
or IterationTag.EVAL_BODY_AGAIN.
Deprecated constant that has the same value as EVAL_BODY_BUFFERED
and EVAL_BODY_AGAIN. This name has been marked as deprecated
to encourage the use of the two different terms, which are much
more descriptive.
Request the creation of new buffer, a BodyContent on which to
evaluate the body of this tag.
Returned from doStartTag when it implements BodyTag.
This is an illegal return value for doStartTag when the class
does not implement BodyTag.
Set the bodyContent property.
This method is invoked by the JSP page implementation object at
most once per action invocation.
This method will be invoked before doInitBody.
This method will not be invoked for empty tags or for non-empty
tags whose doStartTag() method returns SKIP_BODY or EVAL_BODY_INCLUDE.
When setBodyContent is invoked, the value of the implicit object out
has already been changed in the pageContext object. The BodyContent
object passed will have not data on it but may have been reused
(and cleared) from some previous invocation.
The BodyContent object is available and with the appropriate content
until after the invocation of the doEndTag method, at which case it
may be reused.
Prepare for evaluation of the body.
This method is invoked by the JSP page implementation object
after setBodyContent and before the first time
the body is to be evaluated.
This method will not be invoked for empty tags or for non-empty
tags whose doStartTag() method returns SKIP_BODY or EVAL_BODY_INCLUDE.
The JSP container will resynchronize
any variable values that are indicated as so in TagExtraInfo after the
invocation of doInitBody().