一、传统标签的开发
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_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的区别
display.tld 源码
DisplayTag.java 源码
来源:网络
定义: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 &...
1.java基本类型(short,int,long,byte,char,float,double,boolean) 比较基本类型,只能用==,不能用equal,这里的==比较的是两个变量的值; 2.比较包装类型 ==比较的是内存地址,因为a和b是new出来的,是两个不同的对象,所以地址肯定是不同的,而equal比较的是值,附上源码...
首先==与equals是有明显区别的。 ==强调栈中的比较,可以理解为地址比较 equals强调对象的内容比较 String s=“hello”;会在栈中生成hello字符串,并存入字符串常量池中。 String t=“hello” ;创建时,会在字符串常量池中寻找,当找到需要的hello时,不进行字符串的创建,引用已有的。 所以,s==t返回tru...
有些朋友又会有疑问了,为什么下面一段代码中str1与str2两个对象并不相同,为什么输出结果是true? 要知道究竟,可以看一下String类的equals方法的具体实现,同样在该路径下,String.java为String类的实现。 下面是String类中equals方法的具体实现: 可以看出,String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等...
“==”对于基本数据类型,判断两个变量的值是否相等;对于引用类型则比较两个对象是否地址相同,是否为同一引用。 “equal”不能用于基本数据类型。只能用于类变量。对于基本数据类型要用其包装类。 因为对象变量的存储的是对象在内存中的路径,即内存地址。所以用“==”比较时,即使对象的值相等,但是他们的内存地址不同,所以==的结果为...
== 一种java操作符,有两种比较方式 对于基本数据类型,判断两边的值是否相等 对于引用类型,判断两个变量是否引用同一个对象,即判断两个变量是否指向了同一块内存区域 equals() object类定义的一个方法 基本数据类型没有equals()方法 对于引用类型,equals判断引用对象是否等价...
equals与==的区别 1.==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同 2.==是指对内存地址进行比较 , equals()是对字符串的内容进行比较 3.指引用是否相同, equals()指的是值是否相同 equals与的区别详解: == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是...
str1后在常量池会产生4个对象,a,b,c,abc,str1在栈中,堆中也产生一块空间adc,这块空间通过映射表注册adc对应的位置 str2直接在常量池中找,有就直接用,实际上str1,str2所指的位置一样 str3会在堆中new出一块空间,直接在映射表中注册,直接定位到原来在内存中所开辟的空间...
== 与equals的区别 首先我们的jvm的内存结构,jvm 基本可分为两个区域,一个是共享内存区,一个是非共享内存区,共享内存区有虚拟机栈 本地方法栈,程序计数器,共享内存区有堆和方法区。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQ3jroD9-1623032778734)(https://ftp.bmp.ovh/imgs/2021/06/428f1da...
函数都有prototype属性,它指向原型对象。 实例对象有__proto__属性,它指向对象原型 每一个原型对象都有constructor输赢,指向构造函数,每一个原型对象又具有__proto__属性,这个指向Object.prototype.在这里插入图片描述...
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...
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 ...
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...
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...
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...