Tag接口的执行流程
JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法。
1、public
void setPageContext(PageContext pc),
JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
2、public
void
setParent(Tag t),setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
3、public
int
doStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
4、public
int
doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
5、public
void
release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。
开发人员在编写Jsp页面时,经常还需要在页面中引入一些逻辑,例如:
1:控制jsp页面某一部分内容是否执行。
2:控制整个jsp页面是否执行。
3:控制jsp页面内容重复执行。
4:修改jsp页面内容输出。
自定义标签除了可以移除jsp页面java代码外,它也可以实现以上功能。
tld文件中的四种标签体类型
EMPTY JSP scriptless tagdepentend
1:控制jsp页面某一部分内容是否执行。
1
2
3
4
5
6
7
8 |
public
class TagDemo1 extends TagSupport { @Override public
int doStartTag() throws JspException { return
Tag.EVAL_BODY_INCLUDE; //控制标签内容显示 // return Tag.SKIP_BODY; ////控制标签内容不显示 } } |
1
2
3
4
5 |
<tag> <name>demo1</name> <tag- class >cn.gbx.web.tag.TagDemo1</tag- class > <body-content>JSP</body-content> </tag> |
2:控制整个jsp页面是否执行。
1
2
3
4
5
6
7
8
9
10
11
12
13 |
public
class TagDemo2 extends TagSupport { @Override public
int doEndTag() throws JspException { return
Tag.SKIP_PAGE; // 控制余下的jsp是否执行 Tag.EVAL_PAGE 执行 } } <tag> <name>demo2</name> <tag- class >cn.gbx.web.tag.TagDemo2</tag- class > <body-content>empty</body-content> </tag> |
3:控制jsp页面内容重复执行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
public
class TagDemo3 extends TagSupport{ private
int x = 5; @Override public
int doStartTag() throws JspException { return
Tag.EVAL_BODY_INCLUDE; } @Override public
int doAfterBody() throws JspException { x--; if
(x > 0) { return
IterationTag.EVAL_BODY_AGAIN; } else
{ return
IterationTag.SKIP_BODY; } } } <tag> <name>demo3</name> <tag- class >cn.gbx.web.tag.TagDemo3</tag- class > <body-content>JSP</body-content> </tag> |
4:修改jsp页面内容输出。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 |
public
class TagDemo4 extends BodyTagSupport { @Override public
int doStartTag() throws JspException { return
BodyTag.EVAL_BODY_BUFFERED; //标志的setBodyContent的执行, 然后我们就能够获得标签体的内容 } @Override public
int doEndTag() throws JspException { //获得标签体的内容 BodyContent bodyContent = this .getBodyContent(); String content = bodyContent.getString(); //修改 content = content.toUpperCase(); try
{ this .pageContext.getOut().write(content); } catch
(IOException e) { throw
new RuntimeException(e); } return
super.doEndTag(); } } <tag> <name>demo4</name> <tag- class >cn.gbx.web.tag.TagDemo4</tag- class > <body-content>JSP</body-content> </tag> |
原文:http://www.cnblogs.com/E-star/p/3554386.html