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();
}
}