您的位置:首页 > 其它

深入理解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

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类的方法:
编写标签对应的实现类时,需要重载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_TAGSKIP_BODY
EVAL_PAGESKIP_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()返回。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: