001: /*
002: * Copyright (c) 1998-2001 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: * Free SoftwareFoundation, Inc.
023: * 59 Temple Place, Suite 330
024: * Boston, MA 02111-1307 USA
025: *
026: * @author Scott Ferguson
027: *
028: * $Id: BodyTagSupport.java,v 1.2 2004/09/29 00:12:48 cvs Exp $
029: */
030:
031: package javax.servlet.jsp.tagext;
032:
033: import javax.servlet.jsp.JspException;
034: import javax.servlet.jsp.JspWriter;
035:
036: /**
037: * Convenience class defining default behavior for a BodyTag. Most
038: * implementations will extend BodyTagSupport instead of implementing
039: * BodyTag directly.
040: *
041: * <p>The default behavior executes the body once, ignoring the contents.
042: */
043: public class BodyTagSupport extends TagSupport implements BodyTag {
044: protected BodyContent bodyContent;
045:
046: /**
047: * Implementing tags must implement a zero-arg constructor.
048: */
049: public BodyTagSupport() {
050: }
051:
052: /**
053: * Called by the JSP engine just before calling doInitBody(). Empty
054: * tags never have setBodyContent called on them. Because the JSP
055: * engine reuses BodyContents, a tag cannot use the body content after
056: * doAfterBody completes.
057: *
058: * @param bodyContent a bodyContent generated by the JSP engine.
059: */
060: public void setBodyContent(BodyContent bodyContent) {
061: this .bodyContent = bodyContent;
062: }
063:
064: /**
065: * Returns the tag's body content. The body content is in scope for
066: * the BodyTag methods doInitBody and doAfterBody, but not for the
067: * tag methods doStartTag and doEndTag.
068: */
069: public BodyContent getBodyContent() {
070: return bodyContent;
071: }
072:
073: /**
074: * Returns the enclosing writer. For BodyTags with no body, this is
075: * equivalent to pageContext.getOut().
076: */
077: public JspWriter getPreviousOut() {
078: if (bodyContent != null)
079: return bodyContent.getEnclosingWriter();
080: else
081: return pageContext.getOut();
082: }
083:
084: /**
085: * The default start action is EVAL_BODY_TAG, i.e. evaluate the body.
086: */
087: public int doStartTag() throws JspException {
088: return EVAL_BODY_BUFFERED;
089: }
090:
091: /**
092: * The default init action is to do nothing.
093: */
094: public void doInitBody() throws JspException {
095: }
096:
097: /**
098: * Action after the body completes, returning EVAL_BODY_TAG to loop and
099: * SKIP_BODY to stop looping.
100: *
101: * <p>The default action is to only execute the body once.
102: */
103: public int doAfterBody() throws JspException {
104: return SKIP_BODY;
105: }
106:
107: /**
108: * Release the tag.
109: */
110: public void release() {
111: super.release();
112:
113: bodyContent = null;
114: }
115: }
|