一、标签:
标签处理程序是在运行时期调用。必须实现或扩展javax.servlet.jsp.tagext包定义的三个Java接口中的一个
Tag: 标签处理程序和JSP页面的基本协议。定义了所有标签处理程序的基本方法。
IterationTag: 扩展Tag接口,控制对标签体的重复处理
BodyTag: 继承IterationTag接口,对标签体中内容进行处理
有标签体的标签必须实现 BodyTag 接口。
<jsptag:table name="list" var="item">body</jsptag:table>
也可能没有标签体:
<jsptag:page/>
无标签体的简单标签可以实现 Tag 接口。
接口的默认实现:TagSupport和BodyTagSupprt类
TagSupport类为Tag和IterationTag接口的默认实现。支持简单标签和带主体迭代的标签。
BodyTagSupprt类为BodyTag接口的默认实现。支持需要访问和操作标签主体内容的标签。
二、标签处理程序:
1、doStartTag():返回EVAL_BODY_INCLUDE或SKIP_BODY
EVAL_BODY_INCLUDE :输出标签体到当前的输出流 执行标签体(被执行一遍);
SKIP_BODY:忽略标签体
2、doEndTag(): 返回EVAL_PAGE或SKIP_PAGE
EVAL_PAGE:执行页面余下部分
SKIP_PAGE:忽略页面余下部分
3,doAfterBody(); 返回EVAL_BODY_AFTER或SKIP_BODY;
EVAL_BODY_AFTER: 跳转到前面重新执行标签体, 对标签体循环处理
SKIP_BODY:忽略标签体
4、release();释放实例;
5、setPageContext():设置标签的页面上下文;
6、setParent():设置该标签的父标签,没有则设置为NULL;
三、处理程序生命周期
一、实现Tag接口的标签处理程序类的生命周期
1、setPageContext():在标签处理器之前被JSP容器调用。调用 setParent()方法
2、设置标签的属性: 有属性,调用setXxx方法设置标签属性,没有属性则跳过。
3、doStartTag()
4、doEndTag():
5、容器缓存标签处理器类实例,重复使用缓存的标签处理类实例
6、release()
二、实现IterationTag接口的标签处理程序类的生命周期
1、setPageContext(),setParent()
2、设置标签的属性
3、doStartTag(),执行标签体(被执行一遍);
4、doAfterBody(),根据返回值决定循环执行标签体还是跳过不执行。
5、doEndTag()
6、从1开始
7、release()
三、实现BodyTag接口的标签处理程序类的生命周期
1、setPageContext(),setParent()
2、设置标签的属性
3、doStartTag(): 返回EVAL_BODY_BUFFERED或SKIP_BODY_INCLUDE,SKIP_BODY.
EVAL_BODY_BUFFERED且标签体不为null:
setBodyContent():
设置标签处理器类的bodyContent属性,提供了BodyContent对象,缓存标签体静态内容和动态内容。
调用doInitBody()为标签体执行做准备
跳转到 执行标签体:
SKIP_BODY_INCLUDE : 直接跳转到 执行标签体:
SKIP_BODY : 忽略标签体,直接跳到 5
4、doAfterBody(),根据返回值决定循环执行标签体还是跳过不执行。
5、 doEndTag()
6、从1开始
7、release()