深入理解BodyTagSupport和TagSupport 包括SKIP_PAGE, EVAL_PAGE等
2011-11-08 19:50
337 查看
博客分类:
web 前端
标签库的接口和类的继承关系
答:表现形式一:
a. 接口的继承关系:
☉ interface javax.servlet.jsp.tagext.JspTag
☉ interface javax.servlet.jsp.tagext.SimpleTag
☉ interface javax.servlet.jsp.tagext.Tag
☉ interface javax.servlet.jsp.tagext.IterationTag
☉ interface javax.servlet.jsp.tagext.BodyTag
b. 类的继承关系:
☉ class javax.servlet.jsp.tagext.TagSupport (implements javax.servlet.jsp.tagext.IterationTag, java.io.Serializable)
☉ class javax.servlet.jsp.tagext.BodyTagSupport (implements javax.servlet.jsp.tagext.BodyTag)
☉ class javax.servlet.jsp.tagext.SimpleTagSupport (implements javax.servlet.jsp.tagext.SimpleTag)
表现形式二:
(Interface)
JspTag
↑
|ˉˉˉˉˉˉˉˉ|
(Interface) (Interface)
Tag SimpleTag ←--SimpleTagSupport
↑
|
(Interface)
IterationTag←--TagSupport
↑ ↑
| |
(Interface) |
BodyTag ←--BodyTagSupport
BodyTagSupport
博客分类:
JAVAJSP Servlet XML Web SUN
1 TagSupport与BodyTagSupport的区别
TagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果不需要交互就用BodyTagSupport。
交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。
用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport。
2 doStartTag(),doEndTag()
doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字;doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE 与 SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页
doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。
预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.
如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:
doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页
如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执行顺序是
doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页
display.tld 源码
xml 代码
<!---->xml version = "1.0" encoding = "gbk" ?>
<!---->
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd" >
< taglib >
< tlibversion > 1.0 tlibversion >
< jspversion > 2.4 jspversion >
< shortname > 测试程序 shortname >
< uri > uri >
< info > 测试程序 info >
< tag >
< name > display name >
< tagclass > test.DisplayTag tagclass >
<!---->
tag >
taglib >
DisplayTag.java 源码
java 代码
package test;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class DisplayTag extends TagSupport {
public int doStartTag() throws JspException {
System.out.println( "********* doStartTag()........\n" );
return this .EVAL_BODY_INCLUDE;
}
public int doAfterBody() throws JspException {
System.out.println( "********* doAfterBody()........\n" );
return this .SKIP_BODY;
}
public int doEndTag() throws JspException {
System.out.println( "********* doEndTag()........\n" );
JspWriter out = this .pageContext.getOut();
try {
out.println( "Hello !!!!" );
} catch (IOException e) {
e.printStackTrace();
}
return super .doEndTag();
}
}
index.jsp 源码
xml 代码
< %@ page language = "java" import = "java.util.*" pageEncoding = "GB18030"% >
< %@ taglib uri = "/WEB-INF/classes/test/display.tld" prefix = "test" % >
<!---->>
< html >
< head >
< title > My JSP 'index.jsp' starting page title >
head >
< body >
< test:display >
冬国 < br >
test:display >
body >
html >
效果图
注意:这里的汉字 显示在 hello 前面证明啦 它是先执行index.jsp 中标签中的内容后才执行 doEndTag()这个方法的
2011-11-08 19:50 82人阅读 评论 (0) 收藏 举报
一、传统标签的开发
1、 在开发传统标签之前,需要了解两个支持类的生命周期。
1、TagSupport
2、TagSupport
2、TagSupport类的生命周期:
如果所示
3、TagSupport类的生命周期方法
4、BodyTagSupport类的生命周期
接下来我们用图来表示:
5、BodyTagSupportl类的生命周期方法。
BodyTagSupport类的方法:
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag();
他们执行顺序如下:
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,
而直接执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,
EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。
标签中静态常量:
EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
SKIP_BODY:告诉服务器不要处理正文内容
EVAL_PAGE:让服务器继续执行页面
SKIP_PAGE:让服务器不要处理剩余的页面
EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回
EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。
web 前端
标签库的接口和类的继承关系
答:表现形式一:
a. 接口的继承关系:
☉ interface javax.servlet.jsp.tagext.JspTag
☉ interface javax.servlet.jsp.tagext.SimpleTag
☉ interface javax.servlet.jsp.tagext.Tag
☉ interface javax.servlet.jsp.tagext.IterationTag
☉ interface javax.servlet.jsp.tagext.BodyTag
b. 类的继承关系:
☉ class javax.servlet.jsp.tagext.TagSupport (implements javax.servlet.jsp.tagext.IterationTag, java.io.Serializable)
☉ class javax.servlet.jsp.tagext.BodyTagSupport (implements javax.servlet.jsp.tagext.BodyTag)
☉ class javax.servlet.jsp.tagext.SimpleTagSupport (implements javax.servlet.jsp.tagext.SimpleTag)
表现形式二:
(Interface)
JspTag
↑
|ˉˉˉˉˉˉˉˉ|
(Interface) (Interface)
Tag SimpleTag ←--SimpleTagSupport
↑
|
(Interface)
IterationTag←--TagSupport
↑ ↑
| |
(Interface) |
BodyTag ←--BodyTagSupport
BodyTagSupport
BodyTagSupport类的方法: 编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag(); 他们执行顺序如下: doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag() doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY, 如果返回EVAL_BODY_INCLUDE则继续执行; 如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行, 而直接执行doEndTag()方法。 setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。 标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY, EVAL_PAGE或SKIP_PAGE。 如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY; 如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分; 如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。 标签中静态常量: EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流 SKIP_BODY:告诉服务器不要处理正文内容 EVAL_PAGE:让服务器继续执行页面 SKIP_PAGE:让服务器不要处理剩余的页面 EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回 EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回 EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。 |
TagSupport与BodyTagSupport的区别
博客分类: JAVAJSP Servlet XML Web SUN
1 TagSupport与BodyTagSupport的区别
TagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果不需要交互就用BodyTagSupport。
交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。
用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport。
2 doStartTag(),doEndTag()
doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字;doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE 与 SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页
doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。
预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.
如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:
doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页
如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执行顺序是
doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页
display.tld 源码
xml 代码
<!---->xml version = "1.0" encoding = "gbk" ?>
<!---->
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd" >
< taglib >
< tlibversion > 1.0 tlibversion >
< jspversion > 2.4 jspversion >
< shortname > 测试程序 shortname >
< uri > uri >
< info > 测试程序 info >
< tag >
< name > display name >
< tagclass > test.DisplayTag tagclass >
<!---->
tag >
taglib >
DisplayTag.java 源码
java 代码
package test;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class DisplayTag extends TagSupport {
public int doStartTag() throws JspException {
System.out.println( "********* doStartTag()........\n" );
return this .EVAL_BODY_INCLUDE;
}
public int doAfterBody() throws JspException {
System.out.println( "********* doAfterBody()........\n" );
return this .SKIP_BODY;
}
public int doEndTag() throws JspException {
System.out.println( "********* doEndTag()........\n" );
JspWriter out = this .pageContext.getOut();
try {
out.println( "Hello !!!!" );
} catch (IOException e) {
e.printStackTrace();
}
return super .doEndTag();
}
}
index.jsp 源码
xml 代码
< %@ page language = "java" import = "java.util.*" pageEncoding = "GB18030"% >
< %@ taglib uri = "/WEB-INF/classes/test/display.tld" prefix = "test" % >
<!---->>
< html >
< head >
< title > My JSP 'index.jsp' starting page title >
head >
< body >
< test:display >
冬国 < br >
test:display >
body >
html >
效果图
注意:这里的汉字 显示在 hello 前面证明啦 它是先执行index.jsp 中标签中的内容后才执行 doEndTag()这个方法的
JSP—传统标签TagSupport和BodyTagSupport类的生命周期和方法
2011-11-08 19:50 82人阅读 评论 (0) 收藏 举报一、传统标签的开发
1、 在开发传统标签之前,需要了解两个支持类的生命周期。
1、TagSupport
2、TagSupport
2、TagSupport类的生命周期:
如果所示
3、TagSupport类的生命周期方法
方法名 | 描述 | 返回值说明 |
doStarTag() | 容器在遇开始标签的时会调用这个方法 | SKIP_BODY:忽视标签主体的内容,这是默认值。EVAL_BODY_INCLUDE:要求JSP容器要执行标签主体内容并将结果包括在响应中。 |
doAfterBody() | 如果标签有主体内容,容器执行标签主体后,会调用这个方法。 | SKIP_BODY:要求JSP容器忽略主体,进入标签处理程序的下一步工作,是默认值。 EVAL_BODY_AGAIN:要求JSP容器再次显示标签主体内容。 |
doEndTag() | 容器在遇到结束标签时会调用这个方法。 | EVAL_PAGE,运行自定义标签以后的JSP网页内容,这是默认值。 SKIP_PAGE:忽略自定义标签以后的JSP网页内容。 |
release() | 容器通过这个方法来释放本标签处理对象所占用的系统资源。 | 没有返回值 |
4、BodyTagSupport类的生命周期
接下来我们用图来表示:
5、BodyTagSupportl类的生命周期方法。
方法名 | 方法描述 | 返回值说明 |
doStartTag() | 容器在遇到开始标签时会调用这个方法 | SKIP_BODY:要求JSP容器忽略主体. EVAL_BODY_BUFFERED:JSP容器会将标签主体的处理结果建立成一个BodyContent对象。这是默认返回值。 |
setBodyContent() | 提供BodyContent实例的一个引用,该实例为此标签处理类将主计算结果加以缓存 | 无返回值 |
doInitBody() | 在第一次处理标签主体内容时,他讲对主体进行初始化的工作。 | 无返回值 |
doAfterBody() | 如果标签有主体内容,容器在执行完标签主体后,会调用这个方法。 | SKIP_BODY:要求JSP容器忽略主体,进入下一步的处理工作。 EVAL_BODY_AGAIN:要求JSP容器再次处理标签主体。 |
doEndTag() | 容器在遇到结束标签是会调用这个方法。 | SKIP_PAGE:忽略自定义标签以后的JSP网页内容。 EVAL_PAGE:运行自定义标签以后的JSP网页内容。 |
release() | 容器通过这个方法来释放本标签处理对象所占用的系统资源 | 无返回值 |
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag();
他们执行顺序如下:
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,
而直接执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,
EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。
标签中静态常量:
EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
SKIP_BODY:告诉服务器不要处理正文内容
EVAL_PAGE:让服务器继续执行页面
SKIP_PAGE:让服务器不要处理剩余的页面
EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回
EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。
相关文章推荐
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE等
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE
- BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE等
- linux page buffer cache深入理解
- selenium+java+testNG+pageObject深入理解自动化测试框架
- selenium+java+testNG+pageObject深入理解自动化测试框架
- TagSupport.SKIP_BODY,SKIP_PAGE,EVAL_BODY_INCLUDE,EVAL_BODY_AGAIN
- IIS使用指南之五 :深入理解Socket Pooling(套接字池)http://www.winsvr.org/info/info.php?sessid=&amp;infoid=52&amp;page=2
- selenium+java+testNG+pageObject深入理解自动化测试框架
- selenium+java+testNG+pageObject深入理解自动化测试框架
- 深入理解 c# 第四章 一个包括计算年龄的人物类
- 无刷新“页面跳转” Page,你是怎样处理回发事件的? 深入理解 __doPostBack
- 关于EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_BODY_AGAIN、EVAL_PAGE、SKIP_PAGE的区别探讨
- 深入理解Asp.net中DataBinder.Eval的用法总结
- 深入理解Asp.net中DataBinder.Eval的用法总结
- 深入理解 ruby 中的 eval 与 binding
- 深入理解 Ruby 中的 instance_eval 和 class_eval