`
liqita
  • 浏览: 291330 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

TagSupport与BodyTagSupport的区别

 
阅读更多
标签库的接口和类的继承关系
答:表现形式一:
   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类几个方法: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()返回。

 

 

 

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 代码
  1. <!---->xml   version = "1.0"   encoding = "gbk"   ?>   
  2. <!---->
  3.   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"   
  4.   "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd" >   
  5. < taglib >   
  6.      < tlibversion > 1.0 tlibversion >   
  7.      < jspversion > 2.4 jspversion >   
  8.      < shortname > 测试程序 shortname >   
  9.      < uri > uri >   
  10.      < info > 测试程序 info >   
  11.      < tag >   
  12.          < name > display name >   
  13.          < tagclass > test.DisplayTag tagclass >   
  14.         <!---->   
  15.            
  16.            
  17.      tag >   
  18. taglib >   

DisplayTag.java 源码

java 代码
  1. package  test;   
  2.   
  3. import  java.io.IOException;   
  4.   
  5. import  javax.servlet.jsp.JspException;   
  6. import  javax.servlet.jsp.JspWriter;   
  7. import  javax.servlet.jsp.tagext.TagSupport;   
  8.   
  9. public   class  DisplayTag  extends  TagSupport {   
  10.   
  11.      public   int  doStartTag()  throws  JspException {   
  12.         System.out.println( "*********  doStartTag()........\n" );   
  13.   
  14.          return   this .EVAL_BODY_INCLUDE;   
  15.   
  16.     }   
  17.   
  18.      public   int  doAfterBody()  throws  JspException {   
  19.         System.out.println( "*********  doAfterBody()........\n" );   
  20.   
  21.          return   this .SKIP_BODY;   
  22.     }   
  23.   
  24.      public   int  doEndTag()  throws  JspException {   
  25.         System.out.println( "*********  doEndTag()........\n" );   
  26.         JspWriter out =  this .pageContext.getOut();   
  27.   
  28.          try  {   
  29.             out.println( "Hello !!!!" );   
  30.         }  catch  (IOException e) {   
  31.             e.printStackTrace();   
  32.         }   
  33.          return   super .doEndTag();   
  34.     }   
  35.   
  36. }   
index.jsp 源码
xml 代码
  1.   
  2. < %@ page  language = "java"   import = "java.util.*"   pageEncoding = "GB18030" % >   
  3. < %@ taglib  uri = "/WEB-INF/classes/test/display.tld"   prefix = "test" % >   
  4.   
  5. <!---->>   
  6. < html >   
  7.    < head >   
  8.      < title > My JSP 'index.jsp' starting page title >   
  9.    head >   
  10.      
  11.    < body >   
  12.     < test:display   >   
  13.         冬国   < br >   
  14.     test:display >   
  15.    body >   
  16. html >   

效果图

注意:这里的汉字 显示在 hello 前面证明啦 它是先执行index.jsp 中标签中的内容后才执行 doEndTag()这个方法的

 

 

JSP—传统标签TagSupport和BodyTagSupport类的生命周期和方法

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`的`setBodyContent()`方法用于获取标签体内容,而在`doStartTag()`和`doEndTag()`中可以处理这些内容,比如进行格式化、过滤或者与其他业务逻辑结合。 在实际开发中,你可能会根据需求添加更多的...

    javax.servlet.jsp.tagext源码

    与`TagSupport`不同,`SimpleTagSupport`不涉及开始和结束标签的概念,而是通过一个单一的方法`doTag()`来处理整个标签的逻辑。这种方法使得编写标签更加直观,特别是对于那些不需要在开始和结束标签之间进行多次...

    jsp面试题及答案

    这个类可以继承TagSupport或者BodyTagSupport,两者的差别是前者适用于没有主体的标签,而后者适用于有主体的标签。如果选择继承TagSupport,可以实现doStartTag和doEndTag两个方法实现Tag的功能,如果选择继承...

    JSP+Servlet面试题

    * 自定义标签要继承 TagSupport 或者 BodyTagSupport 类。 * TagSupport 类适用于没有主体的标签,而 BodyTagSupport 类适用于有主体的标签。 * 如果选择继承 TagSupport,可以实现 doStartTag 和 doEndTag 两个方法...

    JSP面试题及答案借鉴.pdf

    这个类可以继承TagSupport或者BodyTagSupport,两者的差别是前者适用于没有主体的标签,而后者适用于有主体的标签。如果选择继承TagSupport,可以实现doStartTag和doEndTag两个方法实现Tag的功能,如果选择继承...

    JSP自定义标签.ppt

    JSP 1.2提供了TagSupport、BodyTagSupport,而JSP 2.0引入了SimpleTagSupport。BodyTagSupport同时实现了BodyTag、Tag和IterationTag接口。每个接口都有一系列的方法,例如: - `doStartTag()`:处理标签开始。 - `...

    jsp自定义标签库问答集锦.

    3. **接口关系说明**:从上图可以看出 JspTag 是所有标签接口的基础,Tag 和 SimpleTag 分别提供了不同的功能,而 TagSupport 和 BodyTagSupport 提供了具体的实现支持。 #### 十一、Tag 实现的关键方法 1. **方法...

    jsp&js&java实用技术

    【知识点详解】 ...实现一个Tag涉及创建一个继承自TagSupport或BodyTagSupport的Java类,定义属性的setter方法,以及处理doStartTag、doEndTag等生命周期方法。TLD文件用于描述标签的属性、行为和关联的Java类。

    创建JSP自定义标签.doc

    一个自定义标签其实是一个Java类,这个类需要继承自`TagSupport`或`BodyTagSupport`。这两个类由JSP容器提供,它们包含处理JSP页面与自定义标签之间交互所需的方法。选择继承哪个基类取决于标签是否需要处理内部内容...

    JAVA_scwcd_認證部份筆記

    首先,你需要编写Tag Handler,这个类需要实现Tag、IterationTag或BodyTag接口,通常会继承TagSupport或BodyTagSupport。然后,创建一个Tag Library Descriptor (TLD)文件,用于描述标签的行为、名称、类路径以及...

    JSP自定义标签基础知识学习

    TagSupport类为标签提供了基础的生命周期方法,如doStartTag和doEndTag,而BodyTagSupport类则扩展了TagSupport,增加了对标签体内内容的处理能力。通过覆盖这些方法,开发者可以实现自定义标签的具体功能。 其次,...

    java_自定义标签的使用.docx

    - 创建标签处理程序类,继承TagSupport或BodyTagSupport。 - 实现必要的接口方法,如doStartTag、doEndTag等。 - 编写TLD文件,定义标签的元数据,包括标签名、处理程序类、属性等。 - 在web.xml中声明标签库,...

    在jsp中使用自定义taglib

    Tag是一个Java类,它继承自`TagSupport`或`BodyTagSupport`。这两个基类是JSP容器提供的,它们提供了与JSP页面交互的方法,如数据的输入和输出。开发者只需专注于实现业务逻辑,而无需关心与页面交互的细节。`...

    jsp java自定义标签 实现分页 当前位置标签

    首先,自定义标签的实现基于Java的`TagSupport`或`BodyTagSupport`类。`TagSupport`适用于无内容体的简单标签,而`BodyTagSupport`则适用于包含内容体的标签,即标签内部可以包含HTML或其他JSP元素。在这个场景下,...

    JSP-面试题[定义].pdf

    - **实现方式**:创建一个继承自TagSupport或BodyTagSupport的Java类,实现特定业务逻辑,然后在.tld文件中定义标签的属性和行为,最后将.tld文件部署到应用中。 总结,JSP是一种服务器端技术,用于构建动态Web...

    jsp中的代码重用技术

    - `TagSupport`和`BodyTagSupport`允许开发者轻松扩展新的功能,同时保持良好的性能。 2. **标签库声明和使用** - 在JSP页面中通过`&lt;%@ taglib uri="/WEB-INF/bold.tld" prefix="b" %&gt;`声明标签库,使得标签库...

    清华ITjsp课件6

    - **标签实现类**:这是自定义标签的核心,实现了javax.servlet.jsp.tagext.Tag接口或者其子接口,如TagSupport、BodyTagSupport等。这些类提供了处理标签生命周期的方法,如doStartTag()和doEndTag()。 - **TLD...

    JSP标签库,ppt

    标签处理器通过`Tag`或`BodyTag`接口来实现,例如`TagSupport`和`BodyTagSupport`为这些接口提供了默认的实现。标签处理器可以访问页面上下文(`pageContext`),处理标签属性和标签体内的内容。 3. **TLD文件(Tag...

    JSP程序设计考试试题与答案-(1).docx

    在这个问题中,代码使用了 BodyTagSupport 来生成动态内容,并输出了 2 次 "good"。 5. 如果我们的提交方式是 POST,在 HttpServlet 里没有 doPost 方法对应的话,将出现 405 错误。 答案:D 知识点:在 ...

Global site tag (gtag.js) - Google Analytics