blob: 6452bd504e8089830dbe4380f216693f9e3c06aa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package javax.servlet.jsp.tagext;
import javax.servlet.jsp.JspException;
/**
* The BodyTag interface extends IterationTag by defining additional methods
* that let a tag handler manipulate the content of evaluating its body.
* <p>
* 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.
* <p>
* 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.
* <p>
* If EVAL_BODY_INCLUDE is returned, then evaluation happens as in IterationTag.
* <p>
* 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.
* <p>
* The interface provides one new property with a setter method and one new
* action method.
* <p>
* <B>Properties</B>
* <p>
* 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 and the
* corresponding action element does not have an empty body.
* <p>
* <B>Methods</B>
* <p>
* In addition to the setter method for the bodyContent property, there is a new
* action method: doInitBody(), which is invoked right after setBodyContent()
* and before the body evaluation. This method is only invoked if doStartTag()
* returns EVAL_BODY_BUFFERED.
* <p>
* <B>Lifecycle</B>
* <p>
* 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.
* <p>
* <IMG src="doc-files/BodyTagProtocol.gif"
* alt="Lifecycle Details Transition Diagram for BodyTag"/>
* <p>
* <B>Empty and Non-Empty Action</B>
* <p>
* If the TagLibraryDescriptor file indicates that the action must always have
* an empty element body, by an &lt;body-content&gt; 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.
* <p>
* Note that which methods are invoked after the doStartTag() depends on both
* the return value and on if the custom action element is empty or not in the
* JSP page, not how it's declared in the TLD.
* <p>
* If SKIP_BODY is returned the body is not evaluated, and doEndTag() is
* invoked.
* <p>
* If EVAL_BODY_INCLUDE is returned, and the custom action element is not empty,
* 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 the custom
* action element is empty, only doStart() and doEndTag() are invoked.
* <p>
* If EVAL_BODY_BUFFERED is returned, and the custom action element is not
* empty, setBodyContent() is invoked, doInitBody() is invoked, the body is
* evaluated, doAfterBody() is invoked, and then, after zero or more iterations,
* doEndTag() is invoked. If the custom action element is empty, only doStart()
* and doEndTag() are invoked.
*/
public interface BodyTag extends IterationTag {
/**
* 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.
*
* @deprecated As of Java JSP API 1.2, use BodyTag.EVAL_BODY_BUFFERED or
* IterationTag.EVAL_BODY_AGAIN.
*/
@SuppressWarnings("dep-ann")
// TCK signature test fails with annotation
public static final int EVAL_BODY_TAG = 2;
/**
* 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.
*/
public static final int EVAL_BODY_BUFFERED = 2;
/**
* 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.
* <p>
* 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.
* <p>
* 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.
*
* @param b
* the BodyContent
* @see #doInitBody
* @see #doAfterBody
*/
void setBodyContent(BodyContent b);
/**
* 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.
* <p>
* The JSP container will resynchronize the values of any AT_BEGIN and
* NESTED variables (defined by the associated TagExtraInfo or TLD) after
* the invocation of doInitBody().
*
* @throws JspException
* if an error occurred while processing this tag
* @see #doAfterBody
*/
void doInitBody() throws JspException;
}