读源码学jsp自定义标签 (2) IteataionTag接口

IterationTag接口继承了Tag接口,增加了一个方法和一个静态常量分别是:

 

//javax.servlet.jsp.tag
public interface IterationTag extends Tag 
{
    public final static int EVAL_BODY_AGAIN = 2;  //作为doAfterBody()的返回值,表示重复执行标签体内容
    
    
     /*当容器执行标签体内容后,遇见结束标签前执行,根据返回值来确定流程
     * 可选值:EVAL_BODY_AGAIN: 重复执行标签体
     * SKIP_BODY:不再执行标签体
     */
    int doAfterBody() throws JspException;
}

 

由此,当前接口中可供访问的就有5个静态的常量了。由此可见,IterationTag接口增加了重复执行标签体内容的功能,仅此而已哦.
根据tag对象的生命周期图,很容易知道该方法执行的时机和相关流程。在此不做描述。
类TagSupport实现了IerationTag接口,自己写的标签可以直接继承该类。
查询该类的源码:

 

package javax.servlet.jsp.tagext;

import java.io.Serializable;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;

public class TagSupport implements IterationTag, Serializable {
 
    protected String id;
    protected PageContext pageContext;
    private   Tag  parent;
    private   Hashtable<String, Object> values;


    public static final Tag findAncestorWithClass(Tag from, Class klass)
    {
       boolean isInterface = false;
        if (from == null ||klass == null ||(!Tag.class.isAssignableFrom(klass) &&!(isInterface = klass.isInterface()))) 
            { return null;}
       for (;;) 
       {
         Tag tag = from.getParent();
           if (tag == null)
           { return null;}

          if ((isInterface && klass.isInstance(tag)) || klass.isAssignableFrom(tag.getClass()))
            return tag;
          else
             from = tag;
       }
    }

    //空的构造方法
    public TagSupport() { }

    //默认是返回 跳过标签体,子类需重写该方法
    public int doStartTag() throws JspException {
        return SKIP_BODY;
    }
    
    //默认是返回 执行标签后的JSP代码
    public int doEndTag() throws JspException {
       return EVAL_PAGE;
    }
    
    //默认是返回 不重复执行标签体
    public int doAfterBody() throws JspException {
       return SKIP_BODY;
    }

    //释放标签对象
    public void release() {
   parent = null; //父标签为空
   id = null;
   if( values != null ) 
   {
     values.clear();
   }
   values = null;
    }

   
    //设置父标签
    public void setParent(Tag t) {
       parent = t;
    }

    //返回父标签对象或者null
    public Tag getParent() {
      return parent;
    }

    
    public void setId(String id) {
      this.id = id;
    }
    
    public String getId() {
      return id;
    }

    //设置当前页面上下文
    public void setPageContext(PageContext pageContext) {
       this.pageContext = pageContext;
    }

    

    public void setValue(String k, Object o) {
       if (values == null) 
       {
           values = new Hashtable<String, Object>();
       }       
       values.put(k, o);
    }


    public Object getValue(String k) {
      if (values == null){
          return null;
       } 
       else {
          return values.get(k);
      }
    }


    public void removeValue(String k) {
      if (values != null) {
         values.remove(k);
       }
    }


    public Enumeration<String> getValues() {
       if (values == null) {
          return null;
       }
       return values.keys();
    }

}

 

你可能感兴趣的:(jsp,servlet)