TagSupport与BodyTagSupport的区别

一、传统标签的开发

   1、   在开发传统标签之前,需要了解两个支持类的生命周期。

         1、TagSupport

         2、BodyTagSupport

 

   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()返回。


二. 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 >   

来源:网络


智能推荐

“equals”与“==”的区别

定义:String s1 = “uml”; String s2 = “uml”; String s3= new String(“uml”); String s4= new String(“uml”);那么,s1==s2;s3 == s4;s1.equals(s3); 判断正确与否。 答案:T,F,T &...

equal与==的区别

1.java基本类型(short,int,long,byte,char,float,double,boolean) 比较基本类型,只能用==,不能用equal,这里的==比较的是两个变量的值; 2.比较包装类型 ==比较的是内存地址,因为a和b是new出来的,是两个不同的对象,所以地址肯定是不同的,而equal比较的是值,附上源码...

equals与==的区别

首先==与equals是有明显区别的。 ==强调栈中的比较,可以理解为地址比较 equals强调对象的内容比较 String s=“hello”;会在栈中生成hello字符串,并存入字符串常量池中。 String t=“hello” ;创建时,会在字符串常量池中寻找,当找到需要的hello时,不进行字符串的创建,引用已有的。 所以,s==t返回tru...

==与equals的区别

有些朋友又会有疑问了,为什么下面一段代码中str1与str2两个对象并不相同,为什么输出结果是true?   要知道究竟,可以看一下String类的equals方法的具体实现,同样在该路径下,String.java为String类的实现。   下面是String类中equals方法的具体实现:   可以看出,String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等...

equal与==的区别

“==”对于基本数据类型,判断两个变量的值是否相等;对于引用类型则比较两个对象是否地址相同,是否为同一引用。 “equal”不能用于基本数据类型。只能用于类变量。对于基本数据类型要用其包装类。 因为对象变量的存储的是对象在内存中的路径,即内存地址。所以用“==”比较时,即使对象的值相等,但是他们的内存地址不同,所以==的结果为...

猜你喜欢

==与equals()的区别

== 一种java操作符,有两种比较方式 对于基本数据类型,判断两边的值是否相等 对于引用类型,判断两个变量是否引用同一个对象,即判断两个变量是否指向了同一块内存区域 equals() object类定义的一个方法 基本数据类型没有equals()方法 对于引用类型,equals判断引用对象是否等价...

equals与==的区别

equals与==的区别 1.==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同 2.==是指对内存地址进行比较 , equals()是对字符串的内容进行比较 3.指引用是否相同, equals()指的是值是否相同 equals与的区别详解: == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是...

== 与equals的区别

str1后在常量池会产生4个对象,a,b,c,abc,str1在栈中,堆中也产生一块空间adc,这块空间通过映射表注册adc对应的位置   str2直接在常量池中找,有就直接用,实际上str1,str2所指的位置一样   str3会在堆中new出一块空间,直接在映射表中注册,直接定位到原来在内存中所开辟的空间...

== 与equals的区别

== 与equals的区别 首先我们的jvm的内存结构,jvm 基本可分为两个区域,一个是共享内存区,一个是非共享内存区,共享内存区有虚拟机栈 本地方法栈,程序计数器,共享内存区有堆和方法区。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQ3jroD9-1623032778734)(https://ftp.bmp.ovh/imgs/2021/06/428f1da...

原型对象,原型链

函数都有prototype属性,它指向原型对象。 实例对象有__proto__属性,它指向对象原型 每一个原型对象都有constructor输赢,指向构造函数,每一个原型对象又具有__proto__属性,这个指向Object.prototype.在这里插入图片描述...

问答精选

Correctly formatting GCM notifications?

I'm currently trying out the google cloud messaging service with its sample application "Guestbook." https://developers.google.com/cloud/samples/mbs/ I'm attempting to send notifications tha...

Are there any performance benefits of using Asynchronous functions over Synchronous in Node Js?

Now I came across an article that distinguishes between an Asynchronous function and Synchronous functions. From my understanding of the different examples and explanations, synchronous functions are ...

Python: Costing calculator output

Good day all I'm busy creating a small costing calculator for the signage department. I'm not getting the calculator to output the amount. Brief Description: You enter the height and width and then wh...

Flask-SQLAlchemy - model has no attribute 'foreign_keys'

I have 3 models created with Flask-SQLalchemy: User, Role, UserRole role.py: user.py: user_role.py: If I try (in the console) to get all users via User.query.all() I get AttributeError: 'NoneType' obj...

Seeding many PRNGs, then having to seed them again, what is a good quality approach?

I have many particles that follow an stochastic process in parallel. For each particle, there is a PRNG associated to it. The simulation must go through many repetitions to get average results. For ea...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答