BodyTag接口定义了一个新的整型常量
EVAL_BODY_TAG当doStartTag()返回时,使得新的BodyContent对象被创建并与此标签处理器相关联。当doAfterBody()返回时,使得JSPservlet在修改完此标签控制的任意变量后再次评估体。
BodyTag接口的方法
publicvoidsetBodyContern(BodyContentout)在当前JspWriter已被写入,一个新的BodyContent在被创建后由Jspservlet调用,它发生在doStartTag()之后。
publicvoiddoInitBody()throwsJspExceptionsetBodyContent()之后,体被评估前调用的生命期方法。如果多次评估体,此方法只调用一次。
publicinitdoAfterBody()throwsJspException体被评估后,BodyContent写入者仍处于激活状态时调用的生命期方法。此方法必须返回EVAL_BODY_TAG或SKIP_BODY,若返回EVAL_BODY_TAG时体再次被评估。
BodyTagSupport类的方法
publicintdoStartTag()throwsJspException复写TagSupport中的doStartTag()方法。
publicintdoEndTag()throwsJspException调用TagSupport中的doEndTag()方法,返回结果。
publicvoidsetBodyContent(BodyContentout)在一保护成员变量bodyContent中保存新的体内容对象,子类可直接访问此对象。
publicvoiddoInitBody()throwsJspException缺省什么都不做。被需要执行初始化的子类所复写。
publicintdoAfterBody()throwsJspException每次体被评估后由JSPservlet调用,体同容对象仍处于激活状态。返回SKEP_BODY或EVAL_BODY_TAG则体再次被评估
publicvoidrelease()设置bodyContent对象为null,然后调用super.release()。
publicBodyContentgetBodyContent()返回bodyContent变量。子类已经可以访问保护变量,但此方法允许无关的标签处理类对此体内容发送输出。
publicJspWritergetPreviousOut()在bodyContent变量上调用getEnclosingWriter()并返回结果的简便方法。
5.体标签处理器的生命期
a.生成servlet需要创建标签处理器类的一个实例。实现方式通常是调用JSP容器的工厂类的一个方法,工厂类包含一个标签处理器实例池以使其可重用不再处于激活状态的对象。
b.初始化标签处理器,使servlet获知其存在性。servlet通过调用标签处理器的两个方法实现此过程:setPageContext(PageContextctx)和setParent(Tagparent)。
c.如果标签具有属性,属性的取值通过处理器提供setter方法传入到对象。属性setter方法是一个标签支持属性所需的唯一方法。
d.页面的上下文和父标签已被调置,并已具备属性。调用标签处理器的doStartTag()方法,该方法可以读取这些变量并执行实现标答功能所需的计算和操作。
doStartTag()方法必须返回一个整型数。
返回EVAL_BODY_TAG则正常处理标签体(跳到e);
返回SKIP_BODY则从初始JSP页面中直到此标签结束标记处的内容均被忽略。(跳到f)
e.如果返回EVAL_BODY_TAG时,则正常处理标签体。
e1.在栈中保存当前的JspWriter对象,创建新的BodyContent对象,并将其置为JSP页面的out对象保存在上下文范围内名为name的属性中。并调用它的setBodyContent()方法。
e2.调用doInitBody()方法进行初始化。
e3.处理标签体。将输出写入BodyContent对象中,此过程依赖于TLD的标签元素
e4.调用doAfterBody()方法,将体内体内容写入JspWriter,可如下实现:
JspWriterout=bodyContent.getEnclosingWriter();
out.println(bodyContent.getString());//bodyContent.writeOut(out);
bodyContent.clear();
e5.doAfterBody()方法返回两种可能:
返回EVAL_BODY_TAG时,再对标签体进行评估,这是数组和枚举被循环处理的典型情况。
返回SKIP_PAGE时,继续页面的其余部份。
e6.体内容完成,因此创建它的过程被反向:
调用pageContent.popBody()方法检索前面的JspWriter对象。
将写入者设置回out隐含对象。
f.标签体被评估或忽视后调用doEndTag()方法,允许标签处理器像输出流发回内容。
返回EVAL_PAGE则页面的其余部分被评估;
返回SKIP_PAGE则servlet代码立即从_jspService()中返回。
g.此时体的内容在受保护的bodyContent对象中仍然可用。
可以将它写入servlet输出流中:
JspWriterout=pageContext.getOut();
out.println(bodyContent.getString());
或者
bodyContent.WriteOut(pageContext.getOut());
6.标签附加信息类
四、标签指令
taglib指令元素的目的是指定TLD的位置,设置在页面上与标签区分开来的一个短别名。
语法:<%@taglibprefix=”tagprefix”uri=”taglibURI”%>
属性:prefix:用于标识标签库的唯一标识。uri:标签库本身的URI。
uri不必指向一个实际文件,它是JSP容器可以在web.xml中查找实际文件位置的唯一标识符。
