实现BodyTag接口
BodyTag接口继承了IterationTag接口。它提供了这样一种功能,将标签体的处理结果放到一个缓冲区,在缓冲区内对结果在进行处理,而不是象Tag或IterationTag接口将标签体的处理结果直接发送到输出流。
另外,由于继承了IterationTag接口,对标签体结果的处理也可以循环进行多次。
在该接口中定义了两个方法(setBodyContent()和doInitBody())和一个整数常量(EVAL_BODY_BUFFERED)。
setBodyContent()方法
完整写法是:
public int setBodyContent(BodyContent);
该方法的典型实现是将BodyContent赋值给本地局部变量以供后面使用。
doInitBody()方法
jsp引擎在调用完setBodyContent方法后会接着调用doInitBody方法。完整写法是:
public void doInitBody() throws JspException;
该接口的运行机制象前两种接口一样,先依次调用setPagerContext(),setParent(),实例变量的setXXX方法,doStartTag()。
这是doStartTag方法返回一个常量(EVAL_BODY_INCLUDE, SKIP_BODY或EVAL_BODY_BUFFERED)。
如果返回的是EVAL_BODY_BUFFERED,jsp引擎首先创建一个BodyContent类对象。BodyContent类是JspWriter的子类,而且所有的write,print方法都被重写。不再直接输出到客户端,而是输出到该对象(缓冲对象)内部。
jsp引擎接着将该对象作为参数带入到setBodyContent方法中,在执行完setBodyContent方法后,接着再调用doInitBody方法,此时并没有对缓冲对象进行计算,只是给出一个机会,对缓冲对象初始化。
接着,jsp引擎处理缓冲对象,并将结果再存在缓冲对象中。
再后来,doAfterBody方法被调用,它将返回EVAL_BODY_AGAIN或EVAL_BODY_BUFFERED用以指示缓冲对象需要循环计算,而返回SKIP_BODY则标明就此结束。
最后,呼叫doEndTag方法,结束标签处理。
其流程图如下: