background image

Tag Handler Manipulates the Body

<< Tags with Bodies | CooperatingTags >>
<< Tags with Bodies | CooperatingTags >>

Tag Handler Manipulates the Body

Tag Handler Does Not Manipulate the Body
If the tag handler does not need to manipulate the body, the tag handler should implement the
Tag
interface. If the tag handler implements the Tag interface and the body of the tag needs to be
evaluated, the doStartTag method must return EVAL_BODY_INCLUDE; otherwise it should return
SKIP_BODY
.
If a tag handler needs to iteratively evaluate the body, it should implement the IterationTag
interface. The tag handler should return EVAL_BODY_AGAIN from the doAfterBody method if it
determines that the body needs to be evaluated again.
Tag Handler Manipulates the Body
If the tag handler needs to manipulate the body, the tag handler must implement BodyTag (or
must be derived from BodyTagSupport).
When a tag handler implements the BodyTag interface, it must implement the doInitBody and
the doAfterBody methods. These methods manipulate body content passed to the tag handler
by the JSP page's servlet.
A BodyContent object supports several methods to read and write its contents. A tag handler
can use the body content's getString or getReader method to extract information from the
body, and the writeOut(out) method to write the body contents to an out stream. The writer
supplied to the writeOut method is obtained using the tag handler's getPreviousOut method.
This method is used to ensure that a tag handler's results are available to an enclosing tag
handler.
If the body of the tag needs to be evaluated, the doStartTag method must return
EVAL_BODY_BUFFERED
; otherwise, it should return SKIP_BODY.
doInitBody
Method
The doInitBody method is called after the body content is set but before it is evaluated. You
generally use this method to perform any initialization that depends on the body content.
doAfterBody
Method
The doAfterBody method is called after the body content is evaluated. doAfterBody must
return an indication of whether to continue evaluating the body. Thus, if the body should be
evaluated again, as would be the case if you were implementing an iteration tag, doAfterBody
should return EVAL_BODY_AGAIN; otherwise, doAfterBody should return SKIP_BODY.
The following example reads the content of the body (which contains an SQL query) and passes
it to an object that executes the query. Because the body does not need to be reevaluated,
doAfterBody
returns SKIP_BODY.
Programming Tags That Accept Scripting Elements
Chapter 9 · Scripting in JSP Pages
281