looptagsupport.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 316 行

JAVA
316
字号
/* * Copyright (c) 1998-2003 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the *   Free SoftwareFoundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package javax.servlet.jsp.jstl.core;import javax.el.ValueExpression;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspTagException;import javax.servlet.jsp.tagext.IterationTag;import javax.servlet.jsp.tagext.TagSupport;import javax.servlet.jsp.tagext.TryCatchFinally;abstract public class LoopTagSupport extends TagSupport  implements IterationTag, TryCatchFinally, LoopTag {    protected int begin;  protected boolean beginSpecified;  protected ValueExpression deferredExpression;    protected int end = -1;  protected boolean endSpecified;    protected int step = 1;  protected boolean stepSpecified;    protected String itemId;  protected String statusId;  private Object _initialVar;  private Object _current;  private LoopTagStatus _status;  private int _index;  private int _count;  /**   * Sets the var attribute.   */  public void setVar(String id)  {    this.itemId = id;  }  /**   * Sets the var status attribute.   */  public void setVarStatus(String id)  {    this.statusId = id;  }  /**   * Checks that the begin property makes sense.   */  protected void validateBegin()    throws JspTagException  {    if (begin < 0)      throw new JspTagException("Invalid loop tag, 'begin' < 0.");  }  /**   * Checks that the end property makes sense.   */  protected void validateEnd()    throws JspTagException  {    if (this.end < 0)      throw new JspTagException("Invalid loop tag, 'end' < 0.");  }  /**   * Checks that the step property makes sense.   */  protected void validateStep()    throws JspTagException  {    if (step <= 0)      throw new JspTagException("Invalid loop tag, 'step' <= 0.");  }  /**   * Called before iteration starts   */  protected abstract void prepare()    throws JspTagException;  /**   * Returns the next object for the tag.   */  protected abstract Object next()    throws JspTagException;    /**   * Returns true if there are more values in the tag.   */  protected abstract boolean hasNext()    throws JspTagException;  /**   * Returns the current object.   */  public Object getCurrent()  {    return _current;  }  /**   * Returns the loop status.   */  public LoopTagStatus getLoopStatus()  {    return _status;  }  /**   * Starts the iteration.   */  public int doStartTag()    throws JspException  {    _index = 0;    _count = 0;    prepare();    if (this.itemId != null)      _initialVar = pageContext.getAttribute(itemId);    if (getLoopStatus() == null)      _status = new Status();    while (_index < begin && hasNext()) {      _index++;      next();    }    if (hasNext() && (! endSpecified || _index <= end)) {      _count++;      _current = next();      if (itemId != null)        pageContext.setAttribute(itemId, _current);      if (statusId != null)        pageContext.setAttribute(statusId, getLoopStatus());      return EVAL_BODY_INCLUDE;    }    else      return SKIP_BODY;  }  public int doAfterBody() throws JspException  {    int stepCount;    if (! stepSpecified)      stepCount = 1;    else      stepCount = step;    for (; stepCount > 0; stepCount--) {      if (! hasNext()) {	if (this.itemId != null)	  pageContext.setAttribute(itemId, _initialVar);		return SKIP_BODY;      }              _index++;      _current = next();    }    _count++;    if (! endSpecified || _index <= end) {      if (itemId != null)        pageContext.setAttribute(itemId, _current);      if (statusId != null)        pageContext.setAttribute(statusId, getLoopStatus());            return EVAL_BODY_AGAIN;    }    else {      return SKIP_BODY;    }  }    public void doCatch(Throwable t) throws Throwable  {    throw t;  }    public void doFinally()  {    if (itemId != null)      pageContext.setAttribute(itemId, _initialVar);        if (statusId != null)      pageContext.setAttribute(statusId, null);  }  public class Status implements LoopTagStatus {    /**   * Returns the current object.   */    public Object getCurrent()    {      return _current;    }    /**   * Returns the index.   */    public int getIndex()    {      return _index;    }    /**   * Returns the number of objects returned.   */    public int getCount()    {      return _count;    }    /**   * Returns true if this is the first item.   */    public boolean isFirst()    {      return _count == 1;    }    /**   * Returns true if this is the last item.   */    public boolean isLast()    {      try {        if (! hasNext())          return true;        else if (endSpecified && step + _index > end)          return true;        else          return false;      } catch (Exception e) {        return false;      }    }    /**     * Returns the begin index.     */    public Integer getBegin()    {      if (beginSpecified)        return new Integer(begin);      else        return null;    }      /**     * Returns the end index.     */    public Integer getEnd()    {      if (endSpecified)        return new Integer(end);      else        return null;    }      /**   * Returns the step index.   */    public Integer getStep()    {      if (stepSpecified)        return new Integer(step);      else        return null;    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?